注意点 コピーコンストラクタを設定する際にはあらかじめコンストラクタが設定されている必要があります そうしなければプログラムを実行することができなくなります

つづき・・・


ソーラー「


実は


クラス宣言内に


コピーコンストラクタを設定する際には注意点があるんだよ


それは


クラス宣言内に


コピーコンストラクタを設定する際には


あらかじめ


コンストラクタを設定しておく必要があるんです


そうでないと


オブジェクト宣言、初期化を実行しても


オブジェクトのコピーコンストラクタが実行されなくなります


まずは次のプログラムをご覧ください


#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


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


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


Suuti b;


を実行することにより


クラスSuuti型のオブジェクトbのコンストラクタが実行されています


b.x = 1;


の実行後


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


Suuti a = b;


を実行することにより


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


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


                💖Suuti a = b;💖


が実行されると


    💖 クラスSuuti型のオブジェクトa💖のコピーコンストラクタ💖



が実行されます


そのとき


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

👇


Suuti::Suuti(Suuti& c) {


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

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

x = c.x;

}


👆


Suuti& cにbが


xに


オブジェクトaのメンバ変数


a.x


が代入された


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

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

a.x = b.x;


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


b.xには1が代入されているので


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

1


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




このとき


クラスSuuti内の


コンストラクタのメンバ関数宣言

コンストラクタの定義


を取り除いてしまうと


プログラム自体が実行できなくなります


そのことを示すプログラムをご覧ください」

👇


#include <iostream>


using namespace std;


class Suuti{


public:


int x;


public:


Suuti(Suuti& c);


//👆🌞🌞🌞コピーコンストラクタのメンバ関数宣言を行っています🌞🌞🌞


};




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;


}


プログラムの実行結果


エラー (アクティブ) E0291 クラス "Suuti" の既定のコンストラクターは存在しません

エラー C2512 'Suuti': クラス、構造体、共用体に既定のコンストラクターがありません。


マックス「ほう、そんな仕組みになっているとはな🌷」


てんC「コンストラクタさんを設定しないと


コピーコンストラクタさんを設定しても実行できないのですね。こんこん🦊🦊」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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