ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

コピーコンストラクタ

引き続き、本を読みながら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クラスがメンバ変数をまったく持っていないから。もしメンバ変数があるなら、コピーするなど必要な処理を行わなくてはならない。