为什么不调用成员类的复制构造函数?

时间:2010-03-31 06:06:47

标签: c++ copy-constructor

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 个答案:

答案 0 :(得分:16)

因为您没有调用member的复制构造函数。如果覆盖fred的默认复制构造函数,则需要显式复制成员。

fred(const fred& other) : member_(other.member_) {
    cout<<"Calling fred copy constr"<<'\n';
}

答案 1 :(得分:6)

未调用它,因为您明确要求编译器不要调用它。当您为类fred定义自己的复制构造函数时,您基本上告诉编译器您希望将事情掌握在自己手中并自己进行复制。由于您无法复制member_复制构造函数中的fred,因此不会复制它。

如果你摆脱了fred的复制构造函数的显式定义,编译器将为你提供一个隐式的,它将调用member的复制构造函数来复制{{1 }}。

如果您坚持自己定义member_的复制构造函数,则必须自己复制fred,正如KennyTM建议的那样。

答案 2 :(得分:0)

如果A类有一个B类成员并且你明确地为A类实现了复制ctor,那么你必须明确地复制那里的成员,在这种情况下调用B copy ctor,否则B成员将是默认构造的,而不是复制。

答案 3 :(得分:0)

在这种情况下你必须明确地调用它。因为,你有重载的构造函数。

不过,当我看到“Fred”时,它会让我想起这个有用的资源,请进一步了解C ++构造函数:http://www.parashift.com/c++-faq-lite/ctors.html