《Effective C++》条款12:复制对象是勿忘其每一个成分

对于拷贝构造函数和拷贝赋值函数,如果决定自己定义,那么不要忘记调用父类的相应构造函数。因为如果没有调用,对于拷贝构造函数,编译器会去自动调用父类的default构造函数,那么父类的成员没有被成功从子类实例拷贝;对于拷贝赋值函数,编译器不会做额外的操作,意味着只有子类的部分被赋值,而父类的成员维持原状。

如下代码子类中的拷贝构造函数和拷贝赋值函数,没有主动调用父类的相应函数:

class Base {
public:
    Base():i(1) {
        cout << "Base default constructor." << endl;
    }
    Base(int value):i(value){
        cout << "Base constructor" << endl;
    }
    Base(const Base& base):i(base.i) {
        cout << "Base copy constructor." << endl;
    }
    Base& operator=(const Base& base) {
        cout << "Base operator =" << endl;
        i = base.i;
        return *this;
    }
public:
    int geti() {
        return i;
    }
    void seti(int value) {
        i = value;
    }
private:
    int i;
};

class Derived : public Base {
public:
    Derived() : j(1) {
        cout << "Derived default constructor." << endl;
    }
    Derived(int value) : j(value) {
        cout << "Derived constructor." << endl;
    }
    Derived(const Derived& derived) : 
//        Base(derived),
        j(derived.j){
        cout << "Derived copy constructor." << endl;
    }
    Derived& operator=(const Derived& derived) {
        cout << "Derived operator = " << endl;
//        Base::operator=(derived);
        j = derived.j;
        return *this;
    }
public:
    int getj() {
        return j;
    }
    void setj(int value) {
        j = value;
    }   
private:
    int j;
};

int main(int argc, char *args[])
{
    Derived d;
    d.seti(100);
    cout << d.geti() << endl;
    cout << d.getj() << endl;
    Derived dd(d);
    cout << dd.geti() << endl;
    cout << dd.getj() << endl;
    Derived ddd;
    ddd = dd;
    cout << ddd.geti() << endl;
    cout << ddd.getj() << endl;

    system("pause");
    return 0;
}
运行结果如下:

Base default constructor.
Derived default constructor.
100
1
Base default constructor.
Derived copy constructor.
1
1
Base default constructor.
Derived default constructor.
Derived operator =
1
1
可见Base的变量i没有得到复制。


将两行注释删去,运行结果如下:

Base default constructor.
Derived default constructor.
100
1
Base copy constructor.
Derived copy constructor.
100
1
Base default constructor.
Derived default constructor.
Derived operator =
Base operator =
100
1

可以看到bb对象在构造时,Base的拷贝构造函数得到了调用,于是Base类的变量i成功复制成100;bbb对象在赋值的时候,Base类的Operator=得到了调用,于是Base的成员i赋值成了100.






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值