SuutitoMoji a = b; を実行した場合コピーコンストラクタが設定されているいないにかかわらず オブジェクトaがオブジェクトbによって初期化されることはなくオブジェクトaのコンストラクタも

ファンタジーの世界・・・コピーコンストラクタであそんでみよう

つづき…(´▽`*)



#include <iostream>


using namespace std;


class SuutitoMoji {


public:


int x;


public:


char* i;


public:


SuutitoMoji();

//🌞コンストラクタのメンバ関数宣言です


public:


SuutitoMoji(SuutitoMoji& c);

//🌞コピーコンストラクタのメンバ関数宣言です


};


SuutitoMoji::SuutitoMoji() {


cout << "コンストラクタが実行されました" << "\n";


}


SuutitoMoji::SuutitoMoji(SuutitoMoji& c) {


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


}


int main() {


SuutitoMoji b;


b.x = 1;

b.i = new char[50];


strcpy_s(b.i, 50, "にゃこ");


SuutitoMoji a=b;


a.i = new char[50];


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

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



strcpy_s(a.i, 50, "ねこねこ");


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

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


strcpy_s(b.i, 50, "にゃん");


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

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


return 0;

}


ビルド実行結果


コンストラクタが実行されました

コピーコンストラクタが実行されました

ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ・・・・

にゃこ

ねこねこ

にゃこ

ねこねこ

にゃん


ソーラー「このプログラムでは



SuutitoMoji b;


b.x = 1;

b.i = new char[50];


strcpy_s(b.i, 50, "にゃこ");


につづき


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

    

       SuutitoMoji a=b;


が実行されることになりますが



       SuutitoMoji a=b;



が実行されると


クラスSuutitoMoji型のオブジェクトaのコピーコンストラクタが実行されることになります


このとき


クラスSuutitoMoji型のオブジェクトbは


コピーコンストラクタの定義の引数の部分の


クラスSuutitoMoji型の参照変数宣言


SuutitoMoji& c


に代入されるので


クラスSuutitoMoji型のオブジェクトaにクラスSuutitoMoji型のオブジェクトbが代入されることはありません


ですので


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



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


代入されることも


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



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


代入されることもなくなります



b.i = new char[50];


を実行することにより


動的にメモリ領域を確保したとき


クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iには


動的に確保したメモリ領域の先頭のメモリのアドレスが代入されていましたが


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



動的に確保したメモリ領域の先頭のメモリのアドレスが代入されることはないというわけです


そうなると前のエピソードのように


もしもですが


       SuutitoMoji a=b;



すぐ


次の命令文として


strcpy_s(a.i, 50, "ねこねこ");


が記述されていても


strcpy_s(a.i, 50, "ねこねこ");


は実行されません



a.iは初期化されていない


つまり


a.iにはアドレスが代入されていないので


strcpy_s(a.i, 50, "ねこねこ");


を実行しようにも


どのメモリ領域に文字列データ"ねこねこ"を格納したらいいのか指定できなくなるからです





(💖strcpy_s(a.i, 50, "ねこねこ");


の実行において


a.iは配列のアドレスを格納しているポインタ変数

動的に確保したメモリ領域の先頭のメモリのアドレスを格納しているポインタ変数である


必要がありましたね💖



strcpy_s(a.i, 50, "ねこねこ");


を実行して


文字列データ"ねこねこ"をメモリ領域に格納する場合


a.iに格納されているアドレスのメモリを先頭とするメモリ領域に


"ねこねこ"は格納されます


あらかじめ


a.iが


配列のアドレスを格納しているポインタ変数

動的に確保したメモリ領域の先頭のメモリのアドレス

によって

初期化されていなければ文字列データ"ねこねこ"を


それらのメモリ領域に格納することはできません)


このプログラムでは


       SuutitoMoji a=b;




      strcpy_s(a.i, 50, "ねこねこ");

 

の間に


       SuutitoMoji a=b;


      👉a.i = new char[50];👈


      strcpy_s(a.i, 50, "ねこねこ");



   a.i = new char[50];


を挟んで実行することにより


a.iは動的に確保したメモリ領域の先頭のメモリのアドレスを格納しているポインタ変数となり


strcpy_s(a.i, 50, "ねこねこ");


は実行できているというわけです」



マックス「とりあえず


strcpy_s(a.i, 50, "ねこねこ");


が実行できて


プログラムの実行が


とまったりすることがなくなったのは


なかなか


いいんじゃないか


あとは


ビルド実行結果が


コンストラクタが実行されました

コピーコンストラクタが実行されました

ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ・・・・

にゃこ

ねこねこ

にゃこ

ねこねこ

にゃん


のように


ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ・・・・


が表示されないようにすればいいんだろう


プログラムを最初からみていくと


SuutitoMoji b;


b.x = 1;

b.i = new char[50];


strcpy_s(b.i, 50, "にゃこ");


SuutitoMoji a=b;


a.i = new char[50];


cout << a.i << "\n";👈


となっているが


この


cout << a.i << "\n";👈


の実行結果が


ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ・・・・


となっているわけか・・・


コピーコンストラクタの仕組みを知らないtと


SuutitoMoji a=b;


が実行されると


a.iにはb.iの格納している動的に確保したメモリ領域の先頭のメモリのアドレスが代入され


cout << a.i << "\n";👈


を実行したとき


a.iの格納しているアドレスのメモリを先頭とするメモリ領域


イコール


b.iの格納しているアドレスのメモリを先頭とするメモリ領域


つまり


b.iによって動的に確保されたメモリ領域に


格納されている文字列データ


"にゃこ"



にゃこ


がコマンドプロンプト画面に表示されると思うよな


だが


SuutitoMoji a=b;


を実行すると


コピーコンストラクタの参照変数宣言SuutitoMoji& c



クラスSuutitoMoji型のオブジェクトbが代入されるため


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

クラスSuutitoMoji型のオブジェクトbによって初期化されることはないわけだ


さらに


もしもの話だが


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

クラスSuutitoMoji型のオブジェクトbによって初期化されたとしても


a.i = new char[50];


が実行されると


a.iは


(文字列データによって初期化されていない)


新たに動的に確保されたメモリ領域の先頭のメモリのアドレスを格納することになり


cout << a.i << "\n";👈


の実行結果として


文字列データによって初期化されていない


新たに動的に確保されたメモリ領域に格納されているデータが


表示されるわけだ


新たに動的に確保されたメモリ領域には何も文字列データが代入されていない


初期化されていないので



そのときも


ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ・・・・


が表示されそうな感じだな・・・



だからといって


a.i = new char[50];


をとりのぞいてしまうと


つづく命令文


strcpy_s(a.i, 50, "ねこねこ");


が実行できなくなるので


ビルド実行結果は


コンストラクタが実行されました

コピーコンストラクタが実行されました


が表示されるだけで


終わってしまうというわけだ」


ソーラー「大本の原因は



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

    

       SuutitoMoji a=b;



をおこなったとき


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



クラスSuutitoMoji型のオブジェクトaにクラスSuutitoMoji型のオブジェクトb


が代入されない


a=b;


が実行されない


つまり


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



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


が代入されない


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



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


が代入されない


ということにあるんだね


だったら


クラスSuutitoMoji型のオブジェクトaのコンストラクタが実行されるとき


クラスSuutitoMoji型のオブジェクトaにクラスSuutitoMoji型のオブジェクトb


が代入される


a=b;


が実行される


つまり


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



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


が代入され


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



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


が代入されるようにすればいいんだね


そのようにコピーコンストラクタの定義を設定すればいいってわけだね





  🌞 🌞 🌞コピーコンストラクタの定義をうまく🌞 🌞 🌞


      🌞 🌞 🌞設定することにより🌞 🌞 🌞


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

    

       SuutitoMoji a=b;



をおこなうと同時に実行される


クラスSuutitoMoji型のオブジェクトaのコンストラクタにより

a=b;

つまり

a.x=b.x;

a.i=b.i;



実行されるようすればいいってわけだね


a.i=b.i;


が実行されると


b.iは文字列データ”にゃこ”を格納している動的に確保したメモリ領域の先頭のメモリのアドレスを格納しているので


a.iも文字列データ”にゃこ”を格納している動的に確保したメモリ領域の先頭のメモリのアドレスを格納することになります





となると



SuutitoMoji b;


b.x = 1;

b.i = new char[50];


strcpy_s(b.i, 50, "にゃこ");


SuutitoMoji a=b;


a.i = new char[50];


cout << a.i << "\n";👈

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



strcpy_s(a.i, 50, "ねこねこ");👈👈


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

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


strcpy_s(b.i, 50, "にゃん");


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

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


return 0;





cout << a.i << "\n";👈


の実行結果は



にゃこ


なるね



そうそう もちろん


strcpy_s(a.i, 50, "ねこねこ");👈👈


も実行できるようにしてみます



      楽しみだなあ


いろんな方法が考えられるね




さあて   どうしよっかなあ(´▽`*)」


int(イント)「いったい コピーコンストラクタの定義はどうなるのかな?」


ソーラー「それでは


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


SuutitoMoji::SuutitoMoji(SuutitoMoji& c) {


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


}


から


SuutitoMoji::SuutitoMoji(SuutitoMoji& c) {


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


x=c.x;


i=c.i;


}


に変更・・・しようかな


と思ったけど



SuutitoMoji::SuutitoMoji(SuutitoMoji& c) {


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


x=c.x;


i=new char[50];//🌞ここがさりげないポイントです


i=c.i;


}



改良してみます


このコピーコンストラクタの定義が用いられたプログラムは


こちらとなります

👇

#include <iostream>


using namespace std;


class SuutitoMoji {


public:


int x;


public:


char* i;


public:


SuutitoMoji();

//🌞コンストラクタのメンバ関数宣言です


public:


SuutitoMoji(SuutitoMoji& c);

//🌞コピーコンストラクタのメンバ関数宣言です


};


SuutitoMoji::SuutitoMoji() {


cout << "コンストラクタが実行されました" << "\n";


}


SuutitoMoji::SuutitoMoji(SuutitoMoji& c) {


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


x = c.x;


i = new char[50];


i = c.i;


}



int main() {


SuutitoMoji b;


b.x = 1;

b.i = new char[50];


strcpy_s(b.i, 50, "にゃこ");


SuutitoMoji a = b;


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

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


strcpy_s(a.i, 50, "ねこねこ");


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

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


strcpy_s(b.i, 50, "にゃん");


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

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


return 0;

}


ビルド実行結果


コンストラクタが実行されました

コピーコンストラクタが実行されました

にゃこ

にゃこ

ねこねこ

ねこねこ

にゃん

にゃん


マックス「ビルド実行結果が


コンストラクタが実行されました

コピーコンストラクタが実行されました

ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ・・・・

にゃこ

ねこねこ

にゃこ

ねこねこ

にゃん


から


コンストラクタが実行されました

コピーコンストラクタが実行されました

にゃこ

にゃこ

ねこねこ

ねこねこ

にゃん

にゃん



になった!!


ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ・・・・


が表示されなくなった!!


やったな


なんとかまともなプログラムの実行結果になった!



int(イント)「わあ~ すごい やったね~!」



マックス「・・・がなんだか・・・


ビルド実行結果が微妙に変化してないか?


( ^ω^)・・・なんだあ?」



ソーラー「ではでは


このプログラムの仕組みを最初から追ってみていきましょう



このプログラムでは


まず


bのクラスSuutitoMoji型のオブジェクト宣言


SuutitoMoji b;


が実行されて


クラスSuutitoMoji型のオブジェクトbが生成されています


次に


b.x = 1;


を実行することにより


クラスSuutitoMoji型のオブジェクトbのメンバ変数b.xに1を代入しています


b.i = new char[50];


を実行することにより


クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて動的にメモリ領域を確保しています


この場合、動的に確保したメモリ領域の先頭のメモリのアドレスが


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


に代入されることになります


そして


strcpy_s(b.i, 50, "にゃこ");


の実行により


クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて動的に確保したメモリ領域に


文字列データ


"にゃこ"


を格納しています


さてさて😊


お次は


いよいよ


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

    

       SuutitoMoji a=b;



SuutitoMoji a = b;


の実行ですね


SuutitoMoji a = b;


が実行されると


クラスSuutitoMoji型のオブジェクトa💖のコピーコンストラクタが実行されることになります


つまり


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

👇

SuutitoMoji::SuutitoMoji(SuutitoMoji& c) {


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


x = c.x;


i = new char[50];


i = c.i;


}



参照変数宣言


SuutitoMoji& c



クラスSuutitoMoji型のオブジェクトbが代入され


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


iにはクラスSuutitoMoji型のオブジェクトaのメンバ変数a.i


が代入された状態の



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


a.x = b.x;


a.i = new char[50];


a.i = b.i;


が実行されることになります


まず


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


が実行されると


コマンドプロンプト画面に


コピーコンストラクタが実行されました


が表示されることになります


a.x = b.x;


が実行されると


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


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


格納されます


次に


a.i = new char[50];


が実行されると


クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iを用いて


動的にメモリ領域が確保されます


次に


           😊a.i = b.i;😊(ちょっとしたポイントです)


が実行されると


クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iには


クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iの格納しているアドレスが


代入されます


つまり


クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iには


クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iによって


動的に確保されたメモリ領域の先頭のメモリのアドレスが代入されます



(クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iには


動的に確保されたメモリ領域の先頭のメモリのアドレスが格納されています)



クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iによって


動的に確保されたメモリ領域には


文字列データ"にゃこ"


が格納されていますね


次は

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

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


の実行ですね


クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iには


クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iによって


動的に確保されたメモリ領域の先頭のメモリのアドレスが代入されていて


なおかつ


クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iによって


動的に確保されたメモリ領域には


文字列データ"にゃこ"


が格納されているので


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


の実行結果は


にゃこ


が表示されます


クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iによって


動的に確保されたメモリ領域には


文字列データ"にゃこ"


が格納されていて


クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iは


その動的に確保されたメモリ領域の先頭のメモリのアドレスを格納しているので


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


の実行結果も


にゃこ


になります


次に


strcpy_s(a.i, 50, "ねこねこ");


の実行ですね


さてさて


strcpy_s(a.i, 50, "ねこねこ");


が実行できるためには


a.iが配列のアドレスを格納しているポインタ変数



動的に確保したメモリ領域の先頭のメモリのアドレスが代入されている必要があります


実はうまいことに


以下のようにコピーコンストラクタの定義

👇

SuutitoMoji::SuutitoMoji(SuutitoMoji& c) {


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


x = c.x;


i = new char[50];


i = c.i;


}


が設定されていましたね


ですので


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

    

       SuutitoMoji a=b;


と同時に


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


そのとき


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

👇

SuutitoMoji::SuutitoMoji(SuutitoMoji& c) {


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


x = c.x;


i = new char[50];


i = c.i;


}



参照変数宣言


SuutitoMoji& c



クラスSuutitoMoji型のオブジェクトbが代入され


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


iにはクラスSuutitoMoji型のオブジェクトaのメンバ変数a.i


が代入された状態の



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


a.x = b.x;


a.i = new char[50];


a.i = b.i;


が実行されていました




そう

a.i = new char[50];


が実行されていたので



クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iを用いて


動的にメモリ領域が確保され


クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iには


動的に確保したメモリ領域の先頭のメモリのアドレスが代入されています


ですので


strcpy_s(a.i, 50, "ねこねこ");


は実行されることになります



クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iの格納しているアドレスのメモリを先頭とするメモリ領域


には


文字列データ"ねこねこ"が代入されることになります



ですので



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


が実行されると


ねこねこ


がコマンドプロンプト画面に表示されることになります


次に


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


の実行ですね


a.i=b.i;


の実行により


クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iの格納しているアドレス

クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iの格納しているアドレス



等しくなっています


つまり


クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iの格納しているアドレスのメモリを先頭とするメモリ領域に


文字列データ"ねこねこ"が代入されているということは



クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iの格納しているアドレスのメモリを先頭とするメモリ領域



文字列データ"ねこねこ"が代入されているともいえます



ですので


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


が実行されても


コマンドプロンプト画面に


ねこねこ



表示されることになります



次に


strcpy_s(b.i, 50, "にゃん");


が実行されると


クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iの格納しているアドレスのメモリ


には


文字列データ"にゃん"が代入されることになります



a.i=b.i;


の実行により


クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iの格納しているアドレス

クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iの格納しているアドレス



等しく同じアドレスになっています


つまり


クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iの格納しているアドレスのメモリを先頭とするメモリ領域に



文字列データ"にゃん"が代入されているということは



クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iの格納しているアドレスのメモリを先頭とするメモリ領域



文字列データ"にゃん"が代入されていることになります


ですので


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

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


が実行されると


にゃん

にゃん


がコマンドプロンプト画面に表示されることになります」



マックス「めでたし めでたし


というところか・・・??


ううん  何か~が・・・違ぁ~うぅ」



マックス「コピーコンストラクタの定義を


変更することにより


ビルド実行結果が


コンストラクタが実行されました

コピーコンストラクタが実行されました

ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ・・・・

にゃこ

ねこねこ

にゃこ

ねこねこ

にゃん


から


コンストラクタが実行されました

コピーコンストラクタが実行されました

にゃこ

にゃこ

ねこねこ

ねこねこ

にゃん

にゃん



に変更された・・・



確かに


ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ・・・・

のかわりに

にゃこ


が表示されたのはいいんだが



ちょっとビルド実行結果に変化が起きているな・・


ねこねこ

にゃこ

ねこねこ

にゃん

ねこねこ

ねこねこ

にゃん

にゃん


になっているぞ




ちゃんと


ビルド実行結果が


コンストラクタが実行されました

コピーコンストラクタが実行されました

ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ・・・・

にゃこ

ねこねこ

にゃこ

ねこねこ

にゃん


から


コンストラクタが実行されました

コピーコンストラクタが実行されました

にゃこ

にゃこ

ねこねこ

にゃこ

ねこねこ

にゃん


になるように


表示するにはどうしたらいいんだ?」


ソーラー「それはとっても簡単です


解決方法1.そのことについてはわすれ~る



解決方法2.

ヒントは


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


SuutitoMoji::SuutitoMoji(SuutitoMoji& c) {


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


x=c.x;


i = new char[50];


i=c.i;


}



i=c.i;


の部分です



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

    

       SuutitoMoji a=b;


と同時に


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


そのとき


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

👇

SuutitoMoji::SuutitoMoji(SuutitoMoji& c) {


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


x = c.x;


i = new char[50];


i = c.i;


}



参照変数宣言


SuutitoMoji& c



クラスSuutitoMoji型のオブジェクトbが代入され


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


iにはクラスSuutitoMoji型のオブジェクトaのメンバ変数a.i


が代入された状態の



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


a.x = b.x;


a.i = new char[50];


a.i = b.i;


が実行されます



この


😊a.i = b.i;😊(ちょっとしたポイントです)


の部分に手を加えるといいんです」


マックス「はへ??」


int(イント)「はへえ??」


マックス「はう??全然わからん」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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