クラス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で初期化するために


実行しているんだろう?」


🌞    🌞    🌞    🌞    🌞    🌞    🌞


          そうなんです


🌞    🌞    🌞    🌞    🌞    🌞    🌞

  

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る