如果某个类没有执行动态内存分配,那么只声明一个复制构造函数就足够了吗?
请参阅以下示例
而不是:
class A
{
protected :
int a;
public:
A(const A &source)
{
a = source.a;
}
};
class B: public A
{
protected :
int b;
public:
B(const B &source): A(source)
{
b = source.b;
}
};
使用:
class A
{
protected :
int a;
public:
A(const A &source);
};
class B: public A
{
protected :
int b;
public:
B(const B &source);
};
第二种变体有时会引起问题吗?一些例子会有所帮助。
答案 0 :(得分:5)
如果每个项目的逐个项目副本都可以解决问题,即,当您没有需要深度复制的指针时,除了初始化变量之外,构造函数中没有其他行为,根本不需要声明一个拷贝构造函数。默认实现将为您完成。
答案 1 :(得分:4)
最好既不定义也不声明复制构造函数,编译器生成的工作正常。
如果声明了复制构造函数,编译器将不再提供复制构造函数,如果您使用它,则会遇到链接器错误,但没有为其编写函数体。
答案 2 :(得分:3)
第二个示例应该抛出链接器错误,因为声明了复制构造函数,但未定义。它根本不应该被宣布。如果它被声明,它也必须被定义,然后该类还需要一个自定义的析构函数和赋值运算符(三巨头的法则)。