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

从条款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函数共同调用。

时间: 2024-08-29 11:43:23

复制对象时勿忘其每一个成分的相关文章

PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间_php实例

PHP前言: •动态地创建属性和方法 •对象的复制 •对象的比较 •加载指定的文件 •自动加载类文件 •命名空间 示例 1.类的相关知识点 3(动态地创建属性和方法) class/class3.php <?php /** * 类的相关知识点 3(动态地创建属性和方法) */ // 用于演示如何动态地创建属性(这就是 php 中所谓的重载) class Class1 { // __set 魔术方法,当设置的属性不存在或者不可访问(private)时就会调用此函数 public function _

json-转化Json对象时的错误

问题描述 转化Json对象时的错误 程序中有一个webservice ,我用下面的代码从中获取json: response = [{""id"":1name"":""Appetizers""image"":""iVBORw0KGgoAAAANSUhEUgAAADgAAAAkCAIAAABT8G6pAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8

C++返回值为对象时复制构造函数不执行怎么破

先说点背景知识,调用复制构造函数的三种情况: 1.当用类一个对象去初始化另一个对象时. 2.如果函数形参是类对象. 3.如果函数返回值是类对象,函数执行完成返回调用时. 在辅导学生上机时,有同学第3点提出异议.有教材上的例题为证: #include <iostream> using namespace std; class Point //Point 类的定义 { public: Point(int xx=0, int yy=0) { x = xx; //构造函数,内联 y = yy; } P

APP解构重构.勿忘初心

大学美术史(选修)的第一堂课上,那老师开门见山的说:知道大家认真听课的不多,下节课能来多少也不知道,这里介绍一个自学阅读的办法,方便你们抱佛脚,在我看来大部分书籍讲的实质性内容都很少,这就需要拧干提纯,发现一本书有用之处最有效的方法是看目录,大家能消化掉美术史这本书的目录就能考60分了.对于其它休闲类书籍你大可从目录里面选择自己有兴趣的章节阅读,感兴趣的章节对你来说就是干货,整个目录你都不感兴趣的话,那这本书就杯具了-不知道其他同学的感触,我后来阅读一直用这个方法,此技巧甚至可以列入我大学所学有

obj-c编程12:复制对象

    好吧,上一篇我怎么也没想到会写那么多字那么少的代码,希望这一篇不会如此哦. 言归正传,对象的复制分为浅复制和深复制,前者只是复制对象的引用,当原对象的内容发生变化时,复制对象的内容也会发生变化,毕竟他们都指向同一个对象啊!有人可能会说了,原对象如果是不可改变对象,不就可以放心的做浅复制了吗?因为不能修改它的值,也就不用担心复制对象的内容改变啦!还是不行哦!我们设想如下情况: #import <Foundation/Foundation.h> #define msg(...) NSLog

消费电子漫步“云”端 用户尝鲜服务勿忘安全问题

云计算缓缓落地,消费电子领域漫步"云"端.据悉,日前,成都正式出台云计算应用与产业发展十二五规划纲要,全面布局云计算.消费电子领域更是风起"云"涌.据<中国消费报>报道,在2011中国国际消费电子博览会上,包括家电企业在内的国内外消费电子企业纷纷聚焦云计算,力推相关产品.同时,云计算所蕴藏的巨大潜力,也吸引了不少IT巨头投入其中.据媒体报道,宏碁3.2亿美元收购iGware发展云计算:华硕称正寻找合作伙伴进军云计算市场:被 曝光的阿里云手机更将曾经虚无缥

javascript复制对象使用说明_js面向对象

oldObj是一个对象,而不是值 例如var newObj=oldObj; 如果想oldObj改变的时候不影响到newObj: 可以这样写一个函数 复制代码 代码如下: function clone(myObj){ if(typeof(myObj) != 'object') return myObj; if(myObj == null) return myObj; var myNewObj = new Object(); for(var i in myObj) myNewObj[i] = clo

如何解决引用对象时,必须加所有者(owner)的问题

对象|解决|问题 问题描述:从别处copy来一个数据库DB,附加后,对象的所有者不是Admini,每次查询时必需写select * from Admini.***才能查到.有什么方法不用前面的Admini吗(在不修改所有者的前提下)?注:已经在"安全性-登陆"下面也新建了一个Admini用户,默认数据库设置为DB,权限足够,但在查询分析器下用Admini登陆,查询时还是要写Admini前缀,否则就提示对象名无效问题解决方法:如果是用的是sql 2000的话,用某个用户登录, 不指定所有

PS复制人物时怎么将手臂变形?

PS复制人物时怎么将手臂变形?   1.打开一张图片,如图所示,也可以双击图层,将背景图层变为普通图层. 2.按下CRL键加加号键,然后将图片放大,如图所示 3.用快速选择工具,将人物的轮廓进行勾选,然后选择编辑拷贝,新建一个图层,然后选择原位粘贴,然后继续选择编辑,新建图层,通过拷贝的图层 4.选择操控变形工具,在编辑选项之内,然后用鼠标点选整体人物动作的点,然后选择胳膊上的点,多增加点,将人物的手臂可以拉动到合适位置,调整好之后,然后选择自由变换,将图片调整到合适位置即可. 5.选择背景图层