C++ C++;,复制构造函数声明/定义
如果某个类不执行动态内存分配,那么只声明一个副本构造函数就足够了 请看下面的例子 而不是:C++ C++;,复制构造函数声明/定义,c++,constructor,copy,C++,Constructor,Copy,如果某个类不执行动态内存分配,那么只声明一个副本构造函数就足够了 请看下面的例子 而不是: class A { protected : int a; public: A(const A &source) { a = source.a; } }; class B: public A { protected :
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);
};