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

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

C++の本を読みながら勉強。7ページ。
オブジェクトを関数で値渡しするときに注意すること。

#include <iostream>
using namespace std;

class Test {
public:
    Test() { cout << "Constructor\n"; }
    ~Test() { cout << "Destructor\n"; }
};

void func(Test t)
{
}

int main()
{
    Test t;
    func(t);
}

このプログラムの実行結果は次の通り。

Constructor
Destructor
Destructor

コンストラクタは1回しか呼ばれていないのに、デストラクタは2回呼ばれている。
関数の仮引数でオブジェクトを値渡しするとオブジェクトがコピーされる。このときコンストラクタは呼ばれない。その関数から抜けるときコピーされたオブジェクトが破棄されるのでデストラクタが呼ばれる。なのでコンストラクタとデストラクタの回数が一致しない。
このあたりをちゃんと理解していなかった。今まで書いたプログラムでよく問題にならなかったものだと思ったが、オブジェクトの値渡しはほとんどしないでポインタを渡していたから問題にならなかったのだろう。