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
问问题
326 次
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 回答