C++/コピーコンストラクタと代入演算子
をテンプレートにして作成
ホーム
検索
最終更新
ヘルプ
Wiki書式ヘルプ(整形ルール)
開始行:
コピーコンストラクタがどういうものか、やっと判明したので...
#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したものを持っていたら・・・ですね;
終了行:
コピーコンストラクタがどういうものか、やっと判明したので...
#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したものを持っていたら・・・ですね;
ページ名: