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

假设设计一个顾客类,构造函数由自己写出:

void logCall(const std::string& funcName);
class Customer
{
public:
 Customer(const Customer &rhs);
 Customer &operator =(const Customer &rhs);
 ~Customer(void);
private:
 std::string name;
};
Customer::Customer(const Customer &rhs):name(rhs.name)
{
 logCall("Customer copy constructor");
}
Customer::~Customer(void)
{
}

Customer & Customer::operator =(const Customer &rhs)
{
 logCall("Customer copy assignment operator");
 name = rhs.name;
 return *this;
}
void logCall(const std::string& funcName)
{
 cout << "Customer copy assignment operator!";
}

到这里都没有问题,现在加入另外一个成员变量。

class Date { ... };
class Customer {
public:
private:
std::string name;
Date lastTransaction;
}

此时,拷贝构造函数是局部拷贝,因此,它没有拷贝复制新添加的成员变量,但是多数编译器不对这个问题做出错误提示,因此,如果你为类添加了一个成员变量,请同时修改你的拷贝构造函数,所有构造函数,以及非标准形式的赋值操作符函数。

   假如发生继承;

class PriorityCustomer: public Customer {
public:
PriorityCustomer(const PriorityCustomer& rhs);
PriorityCustomer& operator=(const PriorityCustomer& rhs);
private:
int priority;
}

PriorityCustomer::PriorityCustomer(const PriorityCustomer& rhs)
: priority(rhs.priority)
logCall("PriorityCustomer copy constructor");
PriorityCustomer& PriorityCustomer::operator=(const PriorityCustomer& rhs)
logCall("PriorityCustomer copy assignment operator");
priority = rhs.priority;
return *this;

}

Priorit yCustomer 的copying 函数看起来好像复制了PriorityCustomer 内的每一样东西,但是请再看一眼。是的,它们复制了Priorit yCustomer 声明的成员变量,但每个Priorit yCustomer还内含它所继承的Customer 成员变量复件(副本) ,而那些成员变量却未被复制。Priorit yCustomer 的copy 构造函数并没有指定实参传给其base class 构造函数(也就是说它在它的成员初值列( member initialization list) 中没有提到Customer) ,因此PriorityCustomer对象的Customer成分会被不带实参之Customer 构造函数(即default构造函数必定有一个否则无法通过编译)初始化。default构造函数将针对name 和lastTransaction执行缺省的初始化动作。

任何时候只要你承担起"为derived class 撰写copying 函数"的重责大任,必须很小心地也复制其base class 成分。那些成分往往是private ,所以你无法直接访问它们,你应该让derived class 的copying 函数调用相应的base class 函数:
PriorityCustomer::PriorityCustomer(const PriorityCustomer& rhs)
: Customer (rhs) , II调用base class 的copy 构造函数
priority(rhs.priority)
logCall("PriorityCustomer copy constructor");
PriorityCustomer&
PriorityCustomer::operator=(const PriorityCustomer& rhs)
logCall("PriorityCustomer copy assignment operator");
Customer::operator=(rhs); II对baseclass成分进行赋值动作
priority = rhs.priority;
return *this;

}

当然,这两个拷贝构造函数,有近似相同的实现体,然而,如果你想用其中之一的函数,调用另外一个函数,则无法达到你想要的效果:

令copyassignment 操作符调用copy 构造函数是不合理的,因为这就像试图构造一个已经存在的对象。这件事如此荒谬,乃至于根本没有相关语法。是有一些看似如你所愿的语法,但其实不是:也的确有些语法背后真正做了它,但它们在某些情况下会造成你的对象败坏,所以我不打算将那些语法呈现给你看。单纯地接受这个
叙述吧:你不该令copyassignment 操作符调用copy 构造函数。
反方向:令copy 构造函数调用copyass 匈nment 操作符一一同样无意义。构造函数用来初始化新对象,而assignment 操作符只施行于己初始化对象身上。对一个
尚未构造好的对象赋值,就像在一个尚未初始化的对象身上做"只对己初始化对象才有意义"的事一样。无聊嘛!别尝试。
如果你发现你的copy 构造函数和copyassignment 操作符有相近的代码,消除重复代码的做法是,建立一个新的成员函数给两者调用。这样的函数往往是private 而
且常被命名为init,这个策略可以安全消除copy 构造函数和copy assignment 操作符之间的代码重复。

2012.4.19总结(二)相关推荐

  1. 网络云存储技术Windows server 2012 (项目十二 为企业构建虚拟共享服务(工作组模式下的DFS))

    网络云存储技术Windows server 2012 (项目十二 为企业构建虚拟共享服务(工作组模式下的DFS)) 前言 网络存储技术,是以互联网为载体实现数据的传输与存储,它采用面向网络的存储体系结 ...

  2. 迷难的北京行 – 2012.08.19

    内容中包含 base64string 图片造成字符过多,拒绝显示 转载于:https://www.cnblogs.com/hehe123/archive/2012/08/21/html5dw_trav ...

  3. 【专题5: 硬件设计】 之 【19.案例二:循环泵,滤波电容放电电路】

    希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新 文章会同步到作者个人公众号上,感谢扫码关注 所有文章总目录:[嵌入式 无人机 电机控制 ...

  4. 2012第19周移动游戏推荐

    本周移动游戏市场迎来了相当高质高产的一周,iOS的四款游戏都是亮眼的3D游戏,画面党本周有福了,而Android市场也很意外出现了一款出乎意料的大作移植版,绝不比任何一款iOS大作逊色,切勿错过本周的 ...

  5. JAVA Collection笔记(2012/9/19)

    2019独角兽企业重金招聘Python工程师标准>>> 1.ArrayList,LinkedList是线性表的两个典型实现:前者是基于数组的线性表,后者是基于链的线性表. 2.各种集 ...

  6. 2012.4.19总结(一)

    类的赋值函数 为了实现链式表达式(或者连锁赋值),我们在设计类的赋值函数时,将其返回一个*this指针的引用.这是实现类的赋值操作符时应该遵循的协议.同时,这个协议,不近适用于标准赋值运算,也适用于所 ...

  7. 2012.4.16总结(二)

    1 表达式的求值顺序问题: 函数参数的评估求值顺序 分析下面代码片段的输出结果: int i = 2010; printf("The results are: %d %d", i, ...

  8. 2012.10.19 事故分析

    事情起因: 前一个礼拜MoNET升级了一个 overdue user blocking的功能 , 经过反复测是和小范围生产环境测试没问题,然后就上了 ,这是来公司以后除了手头上的那个MoNET代码迁移 ...

  9. 2012.11.19

    转眼间,一个月过去了,约好的缓冲期限为3个月,不能逃避现实了,要相信自己,不为别的,就为今生能完成一件回头想起来有意义的事情, 今天进行挖掘机,现在的状况是铲斗绕着P2转动,而不是以前的P1转了,但是 ...

最新文章

  1. [流媒体]实例解析MMS流媒体协议,下载LiveMediaVideo[4]
  2. Mysql 多表联合查询效率分析及优化
  3. 利用计算机峰值,计算机的峰值速度
  4. 【Egret】Wing3发布移动APP功能,打包APK流程以及会遇到的问题
  5. JSP中EL表达式说明
  6. 2017.3.6 地精部落 思考记录
  7. Windows Server 2016系统高级管理系列-DFS分布式文件系统
  8. ModelMaker的教學網站
  9. 跳槽到新公司,我直接让项目的性能提升了一半。。。
  10. 数据分析 第三篇:数据特征分析(分布分析+帕累托分析)
  11. 直播客户端和浏览器使用桌面共享时出现黑屏等问题
  12. 互联网版本(支持手机APP)云天售后服务软件上线
  13. 这五款简单又实用自媒体排版工具,你不来试试?
  14. IntelliJ IDEA双击打不开的解决过程
  15. 浏览器-解决火狐浏览器总是提示Adobe Flash更新的问题
  16. BZOJ[1984]月下“毛景树” 树链剖分+线段树
  17. 原来我还写过这么浪漫的东西
  18. 从零开始之驱动发开、linux驱动(二十三、platform总线之数据驱动分离)
  19. 【学习笔记】斯特林反演+单位根反演
  20. Hierarchical Attention Prototypical Networks for Few-Shot Text Classification

热门文章

  1. 高中数学的复数:y=a + bi
  2. mysql之5.7开放远程访问权限
  3. wpf之DragDrop研究
  4. webgis之相关工具
  5. go gorm 关联模式_Beego 结合 GORM 操作 Mysql 数据库
  6. gdal库读取tif影像坐标
  7. 微信小程序实现下拉刷新
  8. jdk下载安装并配置环境
  9. php原生判断,JavaScript
  10. Java集合之一—HashMap