条款12:复制对象时勿忘其每一个部分
设计良好的面向对象系统会将对象的内部封装起来,只留两个函数负责对象拷贝,即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:复制对象时勿忘其每一个部分相关推荐
- 你会copying了吗?(Effective C++ 12 复制对象时勿忘其每一个成分)
12. 复制对象时勿忘其每一个成分 为derived class写copying函数时,必须很小心地复制其base class成分.那些成分往往是private,故无法直接访问它们,应该让derive ...
- SQL保留字,命名数据库、表、列和其他数据库对象时勿用
SQL是由关键字组成的语言,关键字是一些用于执行 SQL操作的特殊词汇.在命名数据库.表.列和其他数据库对象时,一定不要使用.摘自SQL必知必会第四版 以下是sql保留字 文字版 ABORT ABSO ...
- 【Effection C++】读书笔记 条款10~条款12
[Effection C++]读书笔记 Part2 构造/析构/赋值运算 条款09:绝不在构造和析构函数中调用virtual函数 构造函数和析构函数期间不要调用virtual函数,虽然语法上并不会有错 ...
- Effective C++ 条款12
复制对象时,勿忘其每个成分 作者在本节条款提醒我们,在多重继承的情况下进行copy或者copy assignment 的operator=的编写时,一定要考虑base 类部分数据的初始化后者复制. 对 ...
- JavaScript 复制对象与Object.assign方法无法实现深复制
在JavaScript这门语言中,数据类型分为两大类:基本数据类型和复杂数据类型.基本数据类型包括Number.Boolean.String.Null.String.Symbol(ES6 新增),而复 ...
- effective C++ 条款 21:必须返回对象时别妄想返回其reference
考虑有理数的class: class Rational { public: Rational(int numerator = 0, int denominator = 1); protecte ...
- assign复制对象_JavaScript标准对象:assign,values,hasOwnProperty和getOwnPropertyNames方法介绍...
assign复制对象 In JavaScript, the Object data type is used to store key value pairs, and like the Array ...
- 洛谷P5072 [YNOI2015]盼君勿忘 莫队+unordered_set+毒瘤卡常
在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘 ...
- 复制对象clone(深复制和浅复制)
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...
最新文章
- JS window对象 Navigator对象 Navigator 对象包含有关浏览器的信息,通常用于检测浏览器与操作系统的版本。...
- 10.PHP加密相关
- Java基础:JavaNIO 之 内存映射文件原理
- Python 一行代码搞定炫酷可视化,你需要了解一下 Cufflinks
- es6 Set 结合 Array.from 用法
- 关掉占用 某端口的进程
- Linux网络编程——tcp并发服务器(多线程)
- 学计算机的用哪种笔记本写字,平面设计笔记本电脑,学平面设计用什么电脑好...
- 硬件升级win8.1重新安装系统
- 稀疏表示、压缩感知.
- 标签类目体系(面向业务的数据资产设计方法论)-读书笔记5
- MPB:南农韦中组-​根系分泌物调控土壤微生物群落结构和功能的研究方法
- 真惭愧--连这样的小事都没有坚持下来
- DBVisualizer导入excel数据
- ACCESS模糊查询like的解决方法SQL查询语句通配符问题
- Fuchsia - 编译及运行
- 【摸鱼神器】— 五子棋
- 扫描文件转换成word软件
- python客户端软件开发_妙小程python客户端
- 朋也社区 v5.2.0 更新,新增手机号,微信登录外加主题一套
热门文章
- ubuntu c++检测usb口事件变化_炼就“火眼金睛”,FETA40i-C核心板“牵手”光时域反射仪...
- python初学者怎么找工作_学python找工作好找吗
- Arduino笔记-使用独立电源给Arduino供电并闪灯
- Linux学习笔记-Makefile优化之头文件依赖
- Qt获取本地网卡信息
- Qt中echo服务器的简单编写
- flexigrid参数API
- Linux端口6888被占用怎么解决,zabbix如何监控外部端口的状态?
- error while loading shared libraries
- java media.player_关于Java:如何正确发布Android MediaPlayer