C ++,复制构造函数声明/定义

时间:2010-12-25 16:44:47

标签: c++ constructor copy

如果某个类没有执行动态内存分配,那么只声明一个复制构造函数就足够了吗?

请参阅以下示例

而不是:

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

};

第二种变体有时会引起问题吗?一些例子会有所帮助。

3 个答案:

答案 0 :(得分:5)

如果每个项目的逐个项目副本都可以解决问题,即,当您没有需要深度复制的指针时,除了初始化变量之外,构造函数中没有其他行为,根本不需要声明一个拷贝构造函数。默认实现将为您完成。

答案 1 :(得分:4)

最好既不定义也不声明复制构造函数,编译器生成的工作正常。

如果声明了复制构造函数,编译器将不再提供复制构造函数,如果您使用它,则会遇到链接器错误,但没有为其编写函数体。

答案 2 :(得分:3)

第二个示例应该抛出链接器错误,因为声明了复制构造函数,但未定义。它根本不应该被宣布。如果它被声明,它也必须被定义,然后该类还需要一个自定义的析构函数和赋值运算符(三巨头的法则)。