class member
{
public:
member()
{
cout<<"Calling member constr"<<'\n';
}
member(const member&)
{
cout<<"Calling member copy constr"<<'\n';
}
};
class fred
{
public:
fred()
{
cout<<"calling fred constr"<<'\n';
}
fred(const fred &)
{
cout<<"Calling fred copy constr"<<'\n';
}
protected:
member member_;
};
int main()
{
fred a;
fred b=a;
}
Output:
Calling member constr
calling fred constr
**Calling member constr**
Calling fred copy constr
4 に答える
member
のコピー コンストラクタを呼び出さなかったからです。の既定のコピー コンストラクターをオーバーライドする場合は、メンバーを明示的にコピーする必要がありますfred
。
fred(const fred& other) : member_(other.member_) {
cout<<"Calling fred copy constr"<<'\n';
}
コンパイラーに呼び出さないように明示的に要求したため、呼び出されません。class に対して独自のコピー コンストラクターを定義したときfred
、基本的には、問題を自分で処理して自分でコピーすることをコンパイラーに伝えました。のコピー コンストラクターでmember_
は何もコピーしないため、コピーされません。fred
のコピー コンストラクターの明示的な定義を取り除くとfred
、コンパイラは暗黙的なものを提供します。これは、member
のコピー コンストラクターを呼び出して copy しますmember_
。
fred
のコピーコンストラクターを自分で定義することを主張する場合はmember_
、KennyTM が提案したように、自分自身をコピーする必要があります。
クラスAにクラスBメンバーがあり、クラスAのコピーコンストラクターを明示的に実装する場合は、そこにメンバーを明示的にコピーする必要があります。この場合、Bコピーコンストラクターを呼び出します。そうしないと、Bメンバーはデフォルトで構築され、コピー構築されません。
この場合、明示的に呼び出す必要があります。コンストラクターがオーバーロードされているためです。
ところで、「Fred」を見ると、この便利なリソースを思い出します。C++ コンストラクターをさらに理解するために探してください: http://www.parashift.com/c++-faq-lite/ctors.html