Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;,复制构造函数声明/定义_C++_Constructor_Copy - Fatal编程技术网

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);

};