<b>复制对象时勿忘其每一个成份</b>[VC/C++编程]
本文“<b>复制对象时勿忘其每一个成份</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
从条款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函数共同调用.
以上是“<b>复制对象时勿忘其每一个成份</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |