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's 复制构造函数的显式定义,编译器会为你提供一个隐式定义,它会调用member's 复制构造函数来 copy member_

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

于 2010-03-31T06:18:06.963 回答
0

如果类 A 有一个类 B 成员并且您显式地为类 A 实现了复制 ctor,那么您必须显式复制那里的成员,在这种情况下调用 B 复制 ctor,否则 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 回答