コピーコンストラクター
C++ では、クラス名と同じ名前を持ち、その仮パラメータがこのクラスのオブジェクトの参照型である関数をコピー コンストラクターと呼びます。コンストラクターと同様に、コンストラクターを積極的に定義しない場合、システムが自動的に生成します。次のような状況で、オブジェクトの初期化に使用される、2 つのオブジェクト メンバー間で対応する単純な代入を実行します。
#include<iostream>usingnamespacestd;#definePI3.1415classCircle{private:doubleR;public:Circle(doubleR);Circle(Circle&A);doublearea();doublegirth();};Circle::Circle(doubleR){cout<<コンストラクター<<endl;this->R=R;}Circle::Circle(Circle&A){cout<<CopyConstructor<<endl;this->R=AR;}doubleCircle::area(){returnPI*R*R;} doubleCircle::girth(){return2*PI*R;}intmain(){CircleA(5);CircleB(A);return0;}
この例では、Circle クラスを定義し、パラメーター付きコンストラクターとコピー コンストラクターをそれぞれ定義し、main 関数で A オブジェクトを定義し、初期値を渡してパラメーター付きコンストラクターを呼び出します。そして、B オブジェクトを定義し、A オブジェクトを通じて B オブジェクトを初期化します。実行結果は次のとおりです。
初めて定義された A オブジェクトはパラメーターを指定してコンストラクターを呼び出し、2 番目の B オブジェクトは A オブジェクトを通じて初期化されるため、コピー コンストラクターが呼び出されます。
ぜひパソコンでも試してみてください。
冒頭で、コピー コンストラクターを積極的に定義しない場合は自動的に生成されると述べましたが、なぜ自分で定義する必要があるのでしょうか。これは、デフォルトのコピー コンストラクターが単純な代入のみを実行するためです。これには、次のセクションで詳しく説明します。