从条款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函数配合挪用。