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