当前位置:首页 >> 编程开发 >> Visual C++ >> 内容

复制对象时勿忘其每一个成分

时间:2010/6/2 作者:平凡之路 来源:xuhantao.com 浏览:

从条款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相关评论
发表我的评论
  • 大名:
  • 内容:
  • 徐汉涛(www.xuhantao.com) © 2024 版权所有 All Rights Reserved.
  • 部分内容来自网络,如有侵权请联系站长尽快处理 站长QQ:965898558(广告及站内业务受理) 网站备案号:蒙ICP备15000590号-1