続・コピーコンストラクター
#includeusing namespace std; class A { public: A() { cout << "A::A()" << endl; } A(const A& a) { cout << "A::A(const A&)" << endl; } virtual ~A() { cout << "A::~A()" << endl; } }; A foo() { cout << "b" << endl; A a; cout << "c" << endl; return a; } void main() { cout << "a" << endl; foo(); // 戻り値を見ないことにしてみた。 cout << "d" << endl; }
の実行結果は、
a b A::A() c A::A(const A&) A::~A() A::~A() d
となる。これを見ると、関数 foo の return で戻り値を返す時点でもうコピーコンストラクターが呼ばれているような感じだ。foo を呼ぶ側で A a = foo(); のように受けようと、foo(); のように戻り値を無視しようと、コピーコンストラクターは呼ばれてしまう。なお、戻り値を無視すると、foo() が返したインスタンスのスコープはすぐに終わるため、デストラクターも早い段階("d" を cout するより以前)で呼ばれているようだ。