条款12:复制对象时勿忘其每一个成分

条款12:复制对象时勿忘其每一个成分
        (Copy all parts of an object)

内容:
    从条款05中我们知道编译器为你提供了一些默认copying函数,而在某些情况下,我们不想要编译器提供
的版本,我们自定义copying构造函数和copying assign操作函数,这个时候你无形之中惹恼了我们的编译器,
你不用它的东西,它很"生气",于是它就开始复仇:你的实现代码几乎出错时,它就是不告诉你.
    这里考虑一个类用来表现一个应用用程序事件类型Event:
    class Event{
    public:
        Event(int id):eventID_(id){
        }
        Event(const Event& rhs):eventID(rhs.eventID_){           
        }
        Event& operator=(const Event& rhs){
            eventID_ = rhs.eventID_;
            return *this;
        }
        ...
    private:
        int eventID_;
    };
    这样的代码没有问题也很合理,接下来我们增加了一个变量DateTime来记录该事件发生的时间:
    class DateTime{...};
    class Event{
        .... //代码与上面相同
    private:
        int eventID_;
        DateTime dateTime_;
    };
    这里发生了什么事情?对了,在copying构造函数中忘记对成员变量dataTime_进行初始化,在copying assign
中忘记对dateTime_进行复制了.这里明显存在了"局部拷贝"的现象,而大多数编译器对这种现象却"视而不见",即使处
于最高级别的警告级别中,这就是编译器的"复仇":既然你不用我提供的函数,那么你自己写的代码出错,我也不告
诉你.没办法了,编译器不告诉我们,我们这里只能靠我们自己的小心和仔细了:确保你在复制对象时,复制所有成
员变量.当你增加一个新的成员变量时,要同时修改copying构造函数和copying assign运算符操作,如果你忘记编
译器不会这时就不会仁慈地去提醒你的.
    在有继承关系情况下,这里需要你注意一种情况:当你写copying构造和copying assign操作符操作时,注意要
复制base class的成员变量,比如有一个系统SystemEvent类:
    class SystemEvent:public Event{
    public:
        SystemEvent(int id,int priority):Event(id),priority_(priority){}
        SystemEvent(const SystemEvent& rhs):Event(rhs),priority_(rhs.priority_){
        //这里调用了base class的copying 构造函数
        }
        SystemEvent& operator=(const SystemEvent& rhs){
            Event::operator=(rhs);  //调用base class的copying assign 操作函数
            priority_ = rhs.priority_;
            return *this;
        }
    private:
        int priority_;
    };
    现在你应该理解条款中"复制"的含义:(1)复制所有local成员变量;(2)调用base class内适当的copying 函数.
OK,It's over!
   
    请记住:
    ★ Copying函数应该确保复制"对象内所有成员变量"及"所有base class 成分"
    ★ 不要尝试以某个copying函数实现另一个copying函数。应该将共同机能放进第三个函数中,并由两个copying
函数共同调用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值