土曜日, 8月 03, 2013

プチクイズ8 - コピーコンストラクタ

Q. 以下のコードのコンパイル&実行結果は?

#include <cstdio>
#include <cstdlib>
#include <string>

class C {
private:
 int d;
public:
 C() { d = 5;};
 ~C() {};
 C(C m) { d = m.d; }
 virtual void a() { printf("aaa"); }
 int GetD() { return d; }
};

int main() {

 C m;
 C m2(m);
 
 printf("%d\n",m2.GetD());
}

A.
大抵のコンパイラではコンパイルできないはず.上記コピーコンストラクタは値渡しのパラメータが定義されているので,このコピーコンストラクタが呼ばれ,ランタイム上で値渡しのパラメータmを”コピー”しようとコピーコンストラクタを更に呼び... と永遠に再帰呼び出しが発生する.
この問題を避けるには,const C&にパラメータの宣言を変更すればよい.

0 件のコメント: