🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
クラスSuutiにコピーコンストラクタのメンバ関数宣言が設定されているとSuuti a = b; が実行されてもオブジェクトaはオブジェクトbによって初期化されません
クラスSuutiにコピーコンストラクタのメンバ関数宣言が設定されているとSuuti a = b; が実行されてもオブジェクトaはオブジェクトbによって初期化されません
🌞 🌞 🌞 🌞 🌞 🌞 🌞
つづきです・・・
前のエピソードを読まれておられない方は
前のエピソードをまずお読み下さい 🌞
🌞 🌞 🌞 🌞 🌞 🌞 🌞
Suuti a = b;
を実行したら
クラスSuuti型のオブジェクトaのコピーコンストラクタさんは
実行されるかな💖
それではお話のつづきです
次のプログラムをご覧ください
#include <iostream>
using namespace std;
class Suuti{
public:
int x;
public:
Suuti();
//👆🌞🌞🌞コンストラクタのメンバ関数宣言を行っています🌞🌞🌞
public:
Suuti(Suuti& c);
//👆🌞🌞🌞コピーコンストラクタのメンバ関数宣言を行っています🌞🌞🌞
};
Suuti::Suuti() {
cout << "オブジェクトのコンストラクタが実行されました" << "\n";
}
//👆🌞🌞🌞コンストラクタの定義を行っています🌞🌞🌞
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
}
//👆🌞🌞🌞コピーコンストラクタの定義を行っています🌞🌞🌞
int main() {
Suuti b;
b.x = 1;
Suuti a = b;
cout<<a.x<<"\n";
return 0;
}
ビルド実行結果
オブジェクトのコンストラクタが実行されました
オブジェクトのコピーコンストラクタが実行されました
-858993460
マックス「やったぜい!
オブジェクトのコピーコンストラクタが実行されました
か!
順当だな にゃははは」
ソーラー「・・・ですが・・・」
マックス「?どうした?」
ソーラー「ビルド実行結果をよくみてください」
マックス「?なんだ?
オブジェクトのコンストラクタが実行されました
オブジェクトのコピーコンストラクタが実行されました
そうだろう そうだろう
う~む
これはいいビルド実行結果だな
気品があるじゃないか」
ソーラー「もうちょっとだけ
下のビルド実行結果です」
マックス「
なんだ
るんるん るんるん
-858993460
??
何か見慣れない数字だな?
-858993460
?
!!
なんだこの
-858993460は?
ふぃぃ~~~~~
どっからでてきた?!」
ソーラー「お花畑からです・・・」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
さあ、ほんとうのファンタジーの世界,全開です!
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「ここから
ほんとのファンタジーの世界か~い」
ソーラー「さあ ここからが腕の見せ所です」
マックス「なんで
ビルド実行結果に
-858993460
が表示されているのか・・・か?
main関数内では
以下の命令文が記述されているな
👇
Suuti b;
b.x = 1;
Suuti a = b;
cout<<a.x<<"\n";
マックス「まず
Suuti b;
の実行により
クラスSuuti型のオブジェクトb
が生成されると同時に
クラスSuuti型のオブジェクトbのコンストラクタが実行されて
オブジェクトのコンストラクタが実行されました
が
ビルド実行結果に表示されたんだろう
で
Suuti a = b;
の実行により
クラスSuuti型のオブジェクトaが生成されたと
同時に
クラスSuuti型のオブジェクトaのコピーコンストラクタが実行されて
オブジェクトのコピーコンストラクタが実行されました
が
ビルド実行結果に表示されたわけだ
そして
ビルド実行結果
に
-858993460
が表示されているのは
cout<<a.x<<"\n";
の実行結果ということになる
????????
だが以前のエピソードで
Suuti b;
b.x = 1;
Suuti a = b;
が実行されたとき
クラスSuuti型のオブジェクトaのメンバ変数
a.x
には
クラスSuuti型のオブジェクトbのメンバ変数
b.x
の格納している数値データ
1
が代入されてたよな?
だから
cout<<a.x<<"\n";
の実行結果は
1
になるんじゃないか?
しかし
実際には
cout<<a.x<<"\n";
の実行結果は
-858993460
???
なんでだ・・・ど~なってる?・・・」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
面白いでしょう
確かに
普通は
Suuti b;
b.x = 1;
Suuti a = b;
が実行されると
クラスSuuti型のオブジェクトaのメンバ変数
a.x
には
クラスSuuti型のオブジェクトbのメンバ変数
b.x
の格納している数値データ
1
が代入されますが
それは
クラスSuutiのクラス宣言内に
コピーコンストラクタのメンバ関数宣言
Suuti(Suuti& c);
が
💖設定されていなければ💖
の話なんです
クラスSuutiのクラス宣言内に
コピーコンストラクタのメンバ関数宣言
Suuti(Suuti& c);
が
設定されている今の状態では
Suuti b;
b.x = 1;
Suuti a = b;
を実行しても
クラスSuuti型のオブジェクトaのメンバ変数
a.x
には
クラスSuuti型のオブジェクトbのメンバ変数
b.x
の格納している数値データ
1
は
代入されません
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス
「クラスSuutiのクラス宣言内に
コピーコンストラクタのメンバ関数宣言
Suuti(Suuti& c);
が
設定されている今の状態では
Suuti b;
b.x = 1;
Suuti a = b;
を実行しても
クラスSuuti型のオブジェクトaのメンバ変数
a.x
には
クラスSuuti型のオブジェクトbのメンバ変数
b.x
の格納している数値データ
1
は
代入されない・・・?
つまり
Suuti b;
b.x = 1;
Suuti a = b;
が実行されたとき
クラスSuuti型のオブジェクトaはクラスSuuti型のオブジェクトbによって初期化されない
イコール
クラスSuuti型のオブジェクトaのメンバ変数
a.x
は
クラスSuuti型のオブジェクトbのメンバ変数
b.x
の格納している数値データ
1
によって初期化されないということか
ということは
ビルド実行結果の
-858993460
は
クラスSuuti型のオブジェクトaのメンバ変数
a.x
が初期化されないときに
もとから
クラスSuuti型のオブジェクトaのメンバ変数
a.x
に格納されている数値データということなのか?」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
そうなんです いい感じ
クラスSuutiのクラス宣言内に
コピーコンストラクタのメンバ関数宣言
Suuti(Suuti& c);
が
設定されている今の状態では
Suuti a = b;
が
実行されたとき
コピーコンストラクタの定義
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
}
の
💖Suuti&型の参照変数c💖
に
💖オブジェクトbが代入された💖
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
が実行されることになります
つまり
Suuti a = b;
の実行において
クラスSuuti型のオブジェクトa
が生成されると同時に
クラスSuuti型のオブジェクトaのコピーコンストラクタが実行されるのですが
🍋Suuti a 🍋
に
🍋オブジェクトbが代入されるのではありません🍋
つまり
Suuti a = b;
を実行した場合
クラスSuuti型のオブジェクトaに
クラスSuuti型のオブジェクトbが代入されるわけではないので
クラスSuuti型のオブジェクトaのメンバ変数
a.x
に
クラスSuuti型のオブジェクトbのメンバ変数
b.x
の格納している数値データ
1
が
代入されることはありません
コピーコンストラクタの引数となっている
Suuti& c
のSuuti&型の参照変数c
に
クラスSuuti型のオブジェクトbが代入されると
クラスSuuti&型の参照変数c
は
クラスSuuti型のオブジェクトb
そのものをあらわすことになります
ですので
クラスSuutiのメンバ関数であるコピーコンストラクタの定義を
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
}
から
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
}
に変更すると
Suuti a = b;
が
実行されたとき
コピーコンストラクタ定義
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
}
👆
の引数部分の
Suuti& c
に
クラスSuuti型のオブジェクトbが代入されて
クラスSuuti&型の参照変数c
が
クラスSuuti型のオブジェクトb
そのものをあらわすことになった状態で
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
が実行されることになります
つまり
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << b.x<<"\n";
が実行されることになります
ですので
ビルド実行結果に
オブジェクトのコピーコンストラクタが実行されました
1
が
表示されることになります
そのことを示すプログラムはこちら💖になります
👇
#include <iostream>
using namespace std;
class Suuti{
public:
int x;
public:
Suuti();
//👆🌞🌞🌞コンストラクタのメンバ関数宣言を行っています🌞🌞🌞
public:
Suuti(Suuti& c);
//👆🌞🌞🌞コピーコンストラクタのメンバ関数宣言を行っています🌞🌞🌞
};
Suuti::Suuti() {
cout << "オブジェクトのコンストラクタが実行されました" << "\n";
}
//👆🌞🌞🌞コンストラクタの定義を行っています🌞🌞🌞
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
}
//👆🌞🌞🌞コピーコンストラクタの定義を行っています🌞🌞🌞
int main() {
Suuti b;
b.x = 1;
Suuti a = b;
cout<<a.x<<"\n";
return 0;
}
ビルド実行結果
オブジェクトのコンストラクタが実行されました
オブジェクトのコピーコンストラクタが実行されました
1
-858993460
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「1が表示されている!
Suuti b;
b.x = 1;
Suuti a = b;
の実行により
🌞🌞オブジェクトaのコピーコンストラクタが実行される🌞🌞
つまり
コピーコンストラクタの定義
にxが記述されていれば
xの部分にa.xが代入されたものが実行されるんだろう
ちょっと
c.xの代わりにa.xを記述してみるか?
☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆
コピーコンストラクタの定義を
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
}
👆
のように
c.xを
xに書き換えたプログラムはこちらです
👇
#include <iostream>
using namespace std;
class Suuti {
public:
int x;
public:
Suuti();
//👆🌞🌞🌞コンストラクタのメンバ関数宣言を行っています🌞🌞🌞
public:
Suuti(Suuti& c);
//👆🌞🌞🌞コピーコンストラクタのメンバ関数宣言を行っています🌞🌞🌞
};
Suuti::Suuti() {
cout << "オブジェクトのコンストラクタが実行されました" << "\n";
}
//👆🌞🌞🌞コンストラクタの定義を行っています🌞🌞🌞
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << x << "\n";
}
//👆🌞🌞🌞コピーコンストラクタの定義を行っています🌞🌞🌞
int main() {
Suuti b;
b.x = 1;
Suuti a = b;
cout << a.x << "\n";
return 0;
}
ビルド実行結果
オブジェクトのコンストラクタが実行されました
オブジェクトのコピーコンストラクタが実行されました
-858993460
-858993460
☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆
コピーコンストラクタの定義
にxが記述されていれば
xの部分にa.xが代入されたものが実行される
つまり
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << x << "\n";
}
の
xにa.xが代入された
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << a.x << "\n";
が実行されているわけなんだが
やはり
a.xはb.xによって初期化されていないので
cout << a.x << "\n";
の実行結果は
-858993460
となっているわけだ
話が脱線したわ~い
そうそう
クラスSuutiのコピーコンストラクタの定義
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
}
には
xが記述されていないので
そのまま
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
が実行されることになるわけだ
クラスSuutiのコピーコンストラクタの定義
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
}
の
Suuti& c
の参照変数cに
クラスSuuti型のオブジェクトbが代入された状態で
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
が実行されるんだが
参照変数cは
クラスSuuti型のオブジェクトbそのものになり
c.xはb.xそのものをあらわすことになるので
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << b.x<<"\n";
が実行されることになる
このとき
クラスSuuti型のオブジェクトbのメンバ変数b.xには数値データ1が格納されているので
ビルド実行結果に
オブジェクトのコピーコンストラクタが実行されました
1
が表示されることになるわけだ
ただ・・・
さっきの場合は
クラスSuutiのクラス宣言内に
コピーコンストラクタのメンバ関数宣言
Suuti(Suuti& c);
が設定されたため
Suuti a = b;
を実行したとき
😸Suuti& cにオブジェクトbが代入されるので😸
クラスSuuti型のオブジェクトaに
クラスSuuti型のオブジェクトbが代入されることはなくなった
つまり
クラスSuuti型のオブジェクトaのメンバ変数a.xは
クラスSuuti型のオブジェクトbのメンバ変数b.xの持っている数値データ1によって初期化されることはなくなったので
a.xが初期化されないときに
もとから
a.xに格納されている数値データ
-858993460
が
cout<<a.x<<"\n";
により
コマンドプロンプト画面に表示されたわけだ
う~ん?
Suuti a = b;
を実行したとき
クラスSuuti型のオブジェクトaのコピーコンストラクタが実行されるようになっても
クラスSuuti型のオブジェクトaをオブジェクトbで初期化
つまり
クラスSuuti型のオブジェクトaのメンバ変数a.xを
クラスSuuti型のオブジェクトbのメンバ変数b.xの格納している数値データ1で初期化できなくなったんでは
Suuti a = b;
を実行する意味がなくなるんじゃないか?
もともと
Suuti a = b;
は
クラスSuuti型のオブジェクトa
を
クラスSuuti型のオブジェクトbで初期化する
つまり
クラスSuuti型のオブジェクトaのメンバ変数a.x
を
クラスSuuti型のオブジェクトbのメンバ変数b.xの格納している値1で初期化するために
実行しているんだろう?」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
そうなんです
🌞 🌞 🌞 🌞 🌞 🌞 🌞
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます