C++开发中级


843 浏览 5 years, 4 months

6.4 子类中的复制构造函数以及赋值运算符

版权声明: 转载请注明出处 http://www.codingsoho.com/

子类中的复制构造函数以及赋值运算符

当在类中使用了动态内存分配时,提供复制构造函数以及复制运算符是一个好的编程习惯。当定义子类时,必须注意复制构造函数以及operator = 。

如果子类没有任何需要使用非默认复制构造函数或者operator=的特殊数据(通常是指针),无论超类是否有这类数据都不需要这些函数。

如果子类省略了复制构造函数或者,子类中指定的数据成员使用默认构造函数或者operator=初始化,超类中的数据成员用超类的复制构造函数或者operator=初始化。

另一方面,如果您在子类中指定了复制构造函数,就需要显式地链接到父类的复制构造函数,下面的代码演示了这一内容。如果不这么做,将使用默认构造函数(不是复制构造函数!)初始化对象的父类部分。

class Super
{
    public:
        Super();
        Super(const Super& inSuper);
};

class Sub : public Super
{
    public:
        Sub();
        Sub(const Sub& inSub);
};

Sub::Sub(const Sub& inSub) : Super(inSuper){
}

与此类似,如果子类重写了operator=,基本上必须调用父类版本的operator=。唯一的例外是如果因为某些奇怪的原因在赋值的时候只想将部分对象赋值。下面的代码显示了如何在子类调用父类的赋值运算符:

Sub& Sub::operator=(const Sub& inSub)
{
    if(&inSub == this){
        return *this;
    }
    Super::operator=(inSub); // call parent's operator=
    // Do necessary assignment for subclass
    return *this;
}

提示:如果子类不指定自己的复制构造函数或者operator =,父类的功能将继续运行。如果子类提供了自己的复制构造函数或者operator=需要显式引用父类版本。

参考代码 Sub\SubCopyCtor.cpp