コピーコンストラクタがクラスSuutiに設定されていてもSuuti a = b;の実行時、オブジェクトaがオブジェクトbにより初期化されるようにしてみた~い

🌞    🌞    🌞    🌞    🌞    🌞    🌞


          そうなんです



クラスSuuti宣言のクラス宣言内に


コピーコンストラクタのメンバ関数宣言が設定されていると


aのクラスSuuti型のオブジェクト宣言、bによる初期化


Suuti a = b;


を実行しても


クラスSuuti型のオブジェクトaはクラスSuuti型のオブジェクトbによって


初期化されなくなります


         どう? 驚いた~


そのことを示すプログラムはこちらです

🌞    🌞    🌞    🌞    🌞    🌞    🌞

👇


#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


🌞    🌞    🌞    🌞    🌞    🌞    🌞


マックス「う、うぅむ


Suuti b;


b.x = 1;


Suuti a = b;


の実行により


クラスSuuti型のオブジェクトaのコピーコンストラクタが実行される


つまり


コピーコンストラクタの定義


にxが記述されていれば


xの部分にa.xが代入されたものが実行される


だが


クラス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は


オブジェクト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 a


ではなく


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";


により


コマンドプロンプト画面に表示されたわけだ


う~ん?


  💖aのクラスSuuti型のオブジェクト宣言、初期化💖


           Suuti a = b;


を実行したとき


  💖クラスSuuti型のオブジェクトaのコンストラクタは実行されない💖


ので


クラスSuutiのクラス宣言内にコピーコンストラクタを設定したんだろう


だが


クラスSuutiのクラス宣言内にコピーコンストラクタを設定して


クラスSuuti型のオブジェクトaのコピーコンストラクタが実行されるようになっても


クラスSuuti型のオブジェクトaをクラスSuuti型のオブジェクト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で初期化するために


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


int(イント)「ほんとだ おもしろいね(^_-)-☆」


ソーラー「ね 面白いでしょ


なかなか凝った設定になってるよね」


マックス「ちょっと、ちょっと



繰り返すと


aのクラスSuuti型のオブジェクト宣言、bによる初期化


Suuti a = b;


を行った場合は


クラスSuuti型のオブジェクトaのは実行されない


そして


クラスSuuti宣言のクラス宣言内に


コピーコンストラクタのメンバ関数宣言が設定されていると


aのクラスSuuti型のオブジェクト宣言、bによる初期化


Suuti a = b;


を実行した場合


クラスSuuti型のオブジェクトaのコピーコンストラクタが実行されても


クラスSuuti型のオブジェクトaはオブジェクトbによって


初期化されなくなるんだろう


じゃあ


クラスSuuti宣言のクラス宣言内に


コピーコンストラクタのメンバ関数宣言が設定されているとき


aのクラスSuuti型のオブジェクト宣言、初期化


Suuti a = b;


を実行した場合


クラスSuuti型のオブジェクトaのコピーコンストラクタが実行されると同時に


クラスSuuti型のオブジェクトa

クラスSuuti型のオブジェクトbによって


初期化されるようにするためには


ど~したらいいんだにゃ~ん😸?


コピーコンストラクタのメンバ関数宣言を取り除いてしまうと


aのクラスSuuti型のオブジェクト宣言、


Suuti a = b;


はできなくなってしまうしなぁ」


ぶーにゃん「にゃんにゃ~ん」



🌞    🌞    🌞    🌞    🌞    🌞    🌞


  うふふ  さあ どうしよっか  うふふ


🌞    🌞    🌞    🌞    🌞    🌞    🌞


マックス「そうだなあ


a.xにb.xの格納している数値データ1が格納できるようにすればいいんだろう?」


ソーラー「さあ どうなるかな?


簡単かな?😊」


マックス「


クラスSuutiのクラス宣言内に


コピーコンストラクタのメンバ関数宣言が設定されているとき


aのオブジェクト宣言かつクラスSuuti型のオブジェクトbによる初期化


Suuti a = b;


を実行した場合


クラスSuuti型のオブジェクトaのコピーコンストラクタは実行されるんだが・・・


だが


クラスSuuti型のオブジェクトaにクラスSuuti型のオブジェクトbは代入されず


クラスSuuti型のオブジェクトaのメンバ変数a.x

クラスSuuti型のオブジェクトbのメンバ変数b.x


が代入されることはない


だったら


クラスSuuti型のオブジェクトaのコピーコンストラクタが実行されることは確実なら


クラスSuuti型のオブジェクトaのコピーコンストラクタの実行において


クラスSuuti型のオブジェクトaのメンバ変数a.xに


クラスSuuti型のオブジェクトbのメンバ変数b.xの格納している数値データ1


が格納できるようにすればいいということになる?・・・か?」


てんC「マックスさん、その調子~」


マックス「おお ま、まかせろ


あ、ああ、う、うう


じゃあ


今のクラスSuutiのコピーコンストラクタの定義

👇

Suuti::Suuti(Suuti& c) {


cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";

cout << c.x<<"\n";

}



そうだな


こうしたらいいんじゃないか?

👇

Suuti::Suuti(Suuti& c) {


cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";

cout << c.x<<"\n";

x=c.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 << c.x << "\n";

x = c.x;//👈ここです

}


//👆🌞🌞🌞コピーコンストラクタの定義を行っています🌞🌞🌞



int main() {


Suuti b;


b.x = 1;


Suuti a = b;


cout << a.x << "\n";


return 0;


}



ビルド実行結果


オブジェクトのコンストラクタが実行されました

オブジェクトのコピーコンストラクタが実行されました

1

1


マックス「あっ なんかうまくいったった


いや


ふっ


予想通りうまくいったな


cout << a.x << "\n";


のビルド実行結果が


1


となっている(^^)/


今のこのプログラムでは


Suuti b;


b.x = 1;


により


クラスSuuti型のオブジェクトbが生成され


クラスSuuti型のオブジェクトbのメンバ変数b.xに


数値データ1が代入されている


aのオブジェクト宣言かつクラスSuuti型のオブジェクトbによる初期化


Suuti a = b;



が実行されると


クラスSuuti型のオブジェクトaのコピーコンストラクタが実行される


つまり


コピーコンストラクタの定義内に


xが記述されていれば


xの部分にa.xが代入されたものが実行される


今のプログラムでは


クラスSuutiのコピーコンストラクタの定義

👇

Suuti::Suuti(Suuti& c) {


cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";

cout << c.x<<"\n";

x=c.x;

}


には


xが記述されているので




         💖 xにa.xが代入された 💖

 


cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";

cout << c.x<<"\n";

a.x=c.x;



が実行されることになるわけだ


ここがミソだな


このとき


Suuti& c


の参照変数cに


クラスSuuti型のオブジェクトbが代入された状態で


cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";

cout << c.x<<"\n";

a.x=c.x;

が実行されるんだが


参照変数cは


クラスSuuti型のオブジェクトbそのものになり


c.xはb.xそのものをあらわすことになるので


cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";

cout << b.x<<"\n";

a.x=b.x;

が実行されることになる


このとき


クラスSuuti型のオブジェクトbのメンバ変数b.xには数値データ1が格納されているので


a.x=b.x;


が実行されると


クラスSuuti型のオブジェクトaのメンバ変数a.xには数値データ1が格納されることになるわけだ


となると


cout<<a.x<<"\n";



ビルド実行結果は


1


となるわけだ


つまり


クラスSuutiのメンバ関数であるコピーコンストラクタを


うまく定義することにより



Suuti b;


b.x = 1;


Suuti a = b;



を実行したとき



     💖クラスSuuti型のオブジェクトaのコピーコンストラクタが実行されたと同時に💖


クラスSuuti型のオブジェクトaが


クラスSuuti型のオブジェクトbで初期化


つまり


クラスSuuti型のオブジェクトaのメンバ変数a.xが


クラスSuuti型のオブジェクトbのメンバ変数b.xの格納している数値データ1によって


初期化されたわけだ


わっははは~~~どうだぁ。



いや~うまくいったぜい」


🌞    🌞    🌞    🌞    🌞    🌞    🌞


       いい解答・・・


🌞    🌞    🌞    🌞    🌞    🌞    🌞


ソーラー「そう


コピーコンストラクタをうまく定義して


コピーコンストラクタを


クラスSuutiのメンバ関数に設定することにより


aのオブジェクト宣言かつクラスSuuti型のオブジェクトbによる初期化


Suuti a = b;


の実行時


オブジェクトaのコピーコンストラクタが


実行されると同時に


クラスSuuti型のオブジェクトa

クラスSuuti型のオブジェクトbにより初期化されるようになりましたね」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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