引き続き、本を読みながらC++の勉強。8ページ。
オブジェクトがコピーされるときの動作を指定する関数。たとえばTestクラスのコピーコンストラクタの定義は次の通り。
Test(Test const&);
コピーコンストラクタは初期化が行われるときに実行される。初期化がおこなわれる状況は次の3つの場合がある。
・別のオブジェクトを指定して宣言したとき。例: Test x = y; ・オブジェクトが関数の仮引数のとき。例: func(x); ・関数の戻り値として一時的なオブジェクトが作成されたとき。例: x = func();
実際に試したコードは次のような感じ。
#include <iostream> using namespace std; class Test { public: Test() { cout << "Constructor\n"; } Test(Test const&) { cout << "Copy Constructor\n"; } }; void func1(Test t) { cout << "func1\n"; } Test func2() { cout << "func2\n"; Test t; return t; } int main() { Test t; Test t2 = t; func1(t); t2 = func2(); t2 = t; return 0; }
実行結果は次の通り。
Constructor Copy Constructor Copy Constructor func1 func2 Constructor Copy Constructor
メイン関数で最後の t2 = t; ではコピーコンストラクタは呼ばれない。これは初期化ではなく代入。このときの動作を定義したい場合は代入演算子のオーバーロードを行わなければならない。
このプログラムのコピーコンストラクタではメッセージを表示しているだけ。これはTestクラスがメンバ変数をまったく持っていないから。もしメンバ変数があるなら、コピーするなど必要な処理を行わなくてはならない。