2
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

4 に答える 4

16

memberのコピー コンストラクタを呼び出さなかったからです。の既定のコピー コンストラクターをオーバーライドする場合は、メンバーを明示的にコピーする必要がありますfred

fred(const fred& other) : member_(other.member_) {
    cout<<"Calling fred copy constr"<<'\n';
}
于 2010-03-31T06:10:57.793 に答える
6

コンパイラーに呼び出さないように明示的に要求したため、呼び出されません。class に対して独自のコピー コンストラクターを定義したときfred、基本的には、問題を自分で処理して自分でコピーすることをコンパイラーに伝えました。のコピー コンストラクターでmember_は何もコピーしないため、コピーされません。fred

のコピー コンストラクターの明示的な定義を取り除くとfred、コンパイラは暗黙的なものを提供します。これは、memberのコピー コンストラクターを呼び出して copy しますmember_

fredのコピーコンストラクターを自分で定義することを主張する場合はmember_、KennyTM が提案したように、自分自身をコピーする必要があります。

于 2010-03-31T06:18:06.963 に答える
0

クラスAにクラスBメンバーがあり、クラスAのコピーコンストラクターを明示的に実装する場合は、そこにメンバーを明示的にコピーする必要があります。この場合、Bコピーコンストラクターを呼び出します。そうしないと、Bメンバーはデフォルトで構築され、コピー構築されません。

于 2010-03-31T06:30:59.740 に答える
0

この場合、明示的に呼び出す必要があります。コンストラクターがオーバーロードされているためです。

ところで、「Fred」を見ると、この便利なリソースを思い出します。C++ コンストラクターをさらに理解するために探してください: http://www.parashift.com/c++-faq-lite/ctors.html

于 2010-03-31T07:02:47.110 に答える