现在的位置: 首页 > 综合 > 正文

Effective C++之十二

2013年10月04日 ⁄ 综合 ⁄ 共 611字 ⁄ 字号 评论关闭

核心思想:Copy构造和赋值操作中,复制对象的所有部分

设计良好的类封装了内部状态,只有两个复制函数:Copy构造函数和赋值操作函数。条款5中谈了编译器合成的复制函数。

当类中声明了Copy构造函数和赋值操作函数,即使有明显逻辑错误,编译器也不会报错。Mayers举了Customer类的例子:如果类中增加了新的成员变量,而没有更新相关复制函数,复制函数只复制对象的部分。

有继承时问题更隐蔽。PriorityCustomer Copy构造函数复制了子类成员变量,但是没有复制基类成员变量。PriorityCustomer类初始化列表中没有基类Customer,故调用的是基类缺省构造函数(参见条款5),基类成员变量执行的是缺省初始化,而不是复制。对赋值操作函数情况稍有不同:基类成员变量保持原样而没有被赋值。

解决方案是:同时复制基类部分。一般的,基类成员变量是private的,需要调用基类对应的复制函数

两个复制函数实现很相似,但是让一个复制函数调用另一个是错误的做法:

-          赋值操作函数调用Copy构造是不合情理的。因为赋值操作函数是处理一个已经存在的对象,所以根本没有一种语法支持这样实现;

-          Copy构造调用赋值操作也是错误的。Copy构造函数初始化新对象,赋值函数处理已存在对象。将赋值函数用于未初始化的对象是不正确的。

如果想消除重复代码,可以定义一个private成员函数供两种调用。

【上篇】
【下篇】

抱歉!评论已关闭.