设计良好的面向对象系统会将对象的内部封装起来,只留两个函数负责对象拷贝,即copy构造函数与copy assignment操作符。编译器会在必要的时候为类创建coping函数,并说明这些“编译器生成版”的行为:将被拷贝对象的所有成员变量都做一份拷贝。

任何时候,只要自己实现派生类的copying函数,则必须很小心的复制其基类成分。这些成分往往是private私有的,故无法直接访问它们,因此应该让派送类的coping函数调用相应的基类函数:

 void logCall(const string& funcName); class Customer{public:     ...Customer(const Customer& rhs);Customer& operator=(const Customer& rhs);      ...private:string name;Date lastTranscation;};

  

 class PriorityCustomer : public Customer{public:...PriorityCustomer(const PriorityCustomer& rhs);PriorityCustomer& operator=(const PriorityCustomer& rhs);...private:int priority;};PriorityCustomer ::PriorityCustomer (const PriorityCustomer& rhs) : Customer(rhs),    //调用基类的copy构造函数priority(rhs.priority){logCall("PriorityCustomer copy constructor");}PriorityCustomer& PriorityCustomer ::operator = (const PriorityCustomer& rhs) {logCall("PriorityCustomer copy assignment constructor");Customer::operator=(rhs);  //对基类Customer成分进行复制动作priority = rhs.priority;return *this;}

当编写一个copying函数,确保1、复制所有local成员变量,2、调用所有基类的适当的copying函数。

注意两个错误用法:1、令copy assignment操作符调用copy构造函数是错误的,因为在这就像试图构造一个已存在的对象。

         2、令copy构造函数调用copy assignment操作符同样是错误的。构造函数用来出事后对象,而assignment操作符只实行与已初始化的对象身上。对一个尚未构造好的对象赋值,就像在一个尚未初始化的对象身上做“z只对已初始化对象才有意义”的事意义。

消除copy构造函数与copy assignment操作符重复代码的做法是:建立一个新的成员函数给两者调用。这样的函数往往是private而且被命名为init。这个策略可以安全消除copy构造函数与copy assignment操作符之间的代码重复。

请牢记:

  1、copying 函数应该确保复制“对象内的所有成员变量”及“所有基类成分”。

  2、不要尝试以某个copying函数实现另一个copying函数。应该将共同机能放进第三个函数中,并由两个copying函数共同调用。

转载于:https://www.cnblogs.com/lwenwen/p/3468569.html

条款12:复制对象时勿忘其每一个部分相关推荐

  1. 你会copying了吗?(Effective C++ 12 复制对象时勿忘其每一个成分)

    12. 复制对象时勿忘其每一个成分 为derived class写copying函数时,必须很小心地复制其base class成分.那些成分往往是private,故无法直接访问它们,应该让derive ...

  2. SQL保留字,命名数据库、表、列和其他数据库对象时勿用

    SQL是由关键字组成的语言,关键字是一些用于执行 SQL操作的特殊词汇.在命名数据库.表.列和其他数据库对象时,一定不要使用.摘自SQL必知必会第四版 以下是sql保留字 文字版 ABORT ABSO ...

  3. 【Effection C++】读书笔记 条款10~条款12

    [Effection C++]读书笔记 Part2 构造/析构/赋值运算 条款09:绝不在构造和析构函数中调用virtual函数 构造函数和析构函数期间不要调用virtual函数,虽然语法上并不会有错 ...

  4. Effective C++ 条款12

    复制对象时,勿忘其每个成分 作者在本节条款提醒我们,在多重继承的情况下进行copy或者copy assignment 的operator=的编写时,一定要考虑base 类部分数据的初始化后者复制. 对 ...

  5. JavaScript 复制对象与Object.assign方法无法实现深复制

    在JavaScript这门语言中,数据类型分为两大类:基本数据类型和复杂数据类型.基本数据类型包括Number.Boolean.String.Null.String.Symbol(ES6 新增),而复 ...

  6. effective C++ 条款 21:必须返回对象时别妄想返回其reference

    考虑有理数的class: class Rational { public:     Rational(int numerator = 0, int denominator = 1); protecte ...

  7. assign复制对象_JavaScript标准对象:assign,values,hasOwnProperty和getOwnPropertyNames方法介绍...

    assign复制对象 In JavaScript, the Object data type is used to store key value pairs, and like the Array ...

  8. 洛谷P5072 [YNOI2015]盼君勿忘 莫队+unordered_set+毒瘤卡常

    在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘 ...

  9. 复制对象clone(深复制和浅复制)

    Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...

最新文章

  1. JS window对象 Navigator对象 Navigator 对象包含有关浏览器的信息,通常用于检测浏览器与操作系统的版本。...
  2. 10.PHP加密相关
  3. Java基础:JavaNIO 之 内存映射文件原理
  4. Python 一行代码搞定炫酷可视化,你需要了解一下 Cufflinks
  5. es6 Set 结合 Array.from 用法
  6. 关掉占用 某端口的进程
  7. Linux网络编程——tcp并发服务器(多线程)
  8. 学计算机的用哪种笔记本写字,平面设计笔记本电脑,学平面设计用什么电脑好...
  9. 硬件升级win8.1重新安装系统
  10. 稀疏表示、压缩感知.
  11. 标签类目体系(面向业务的数据资产设计方法论)-读书笔记5
  12. MPB:南农韦中组-​根系分泌物调控土壤微生物群落结构和功能的研究方法
  13. 真惭愧--连这样的小事都没有坚持下来
  14. DBVisualizer导入excel数据
  15. ACCESS模糊查询like的解决方法SQL查询语句通配符问题
  16. Fuchsia - 编译及运行
  17. 【摸鱼神器】— 五子棋
  18. 扫描文件转换成word软件
  19. python客户端软件开发_妙小程python客户端
  20. 朋也社区 v5.2.0 更新,新增手机号,微信登录外加主题一套

热门文章

  1. ubuntu c++检测usb口事件变化_炼就“火眼金睛”,FETA40i-C核心板“牵手”光时域反射仪...
  2. python初学者怎么找工作_学python找工作好找吗
  3. Arduino笔记-使用独立电源给Arduino供电并闪灯
  4. Linux学习笔记-Makefile优化之头文件依赖
  5. Qt获取本地网卡信息
  6. Qt中echo服务器的简单编写
  7. flexigrid参数API
  8. Linux端口6888被占用怎么解决,zabbix如何监控外部端口的状态?
  9. error while loading shared libraries
  10. java media.player_关于Java:如何正确发布Android MediaPlayer