コピーコンストラクタがどういうものか、やっと判明したのでメモ。 #code(c,){{ class A { public: A(); int x; } void func() { A a; A b = a; /* b.x = a.x; が行われる。 */ } }} 宣言しなくても、コピーコンストラクタは自動で作成され、 メンバ変数に対して、=演算子が用いられて代入されるんだそうです。 自動で作成されるってところが恐いところで、 メンバにnewしたポインタをもつようなクラスの場合、 コピーコンストラクタを明示的に定義するか、 コピーコンストラクタの宣言のみするかして、対策しないといけないのです。 次の例を見てみる。 #code(c,){{ #include <cstdio> using namespace std; class Test { public: Test(float val):x(val) { printf( "Constructor\n" ); } ~Test() { printf( "Destructor\n" ); } float x; }; int main() { Test a(3); Test b(4); printf( "%f\n" , b.x ); b = a; printf( "%f\n" , b.x ); return 0; } }} 出力結果: Constructor Constructor 4.000000 3.000000 Destructor Destructor b=aでは,デストラクタは呼ばれない。 なので,メンバ変数にnewしたものを持っていたら・・・ですね; |