C++之复制对象时勿忘每一个成分(12)---《Effective C++》
来源:互联网 发布:淘宝企业店铺怎么报税 编辑:程序博客网 时间:2024/06/08 05:52
条款12:赋值对象时勿忘其每一个成分
C++中设计良好的对象系统会将对象的内部封装起来,只留下两个函数负责对象那个拷贝(赋值),即copy构造函数和copy operator=。
如果我们自己声明自己的copying函数,则C++的编译器则不会对我们自己提供的copying函数进行检验,即使copying函数出错了编译器并不会报错。
具体参看如下代码:
class A{public: A(const A&); A& opreator=(const A&); ...private: std::string A_a;}A::A(const A&a){ this->A_a=a->A_a;}A& A::operator::=(const A& a){ if(this==&a) return *this; this->A_a=a->A_a; return *this;}
可是如果此时我们将A中加入新的变量呢?
class B{};class A{public: ...private: std::string A_a; B b;}
这时候,copying构造函数只是简单的复制了A_a,对于b成员变量并没有进行复制,大多数编译器无法检测出这些问题,因此,我们必须:
1)如果我们为类添加一个成员变量,必须同时修改copying函数,同时包括构造函数和一些非标准的operator=函数;
如果发生继承呢?
class A{public: ... A(const A&a); A& operator=(const A&a);private: std::string name;}class B:public A{public: ... B(const B&b); B& operator=(const B&b);private: int x;}B::B(const B&b):A(b){ ...}B& B::operator=(const B&b){ A::operator=(b); this->x=b.x; return *this;}
2)可以发现对于继承体系中,当你编写子类的copying函数,请确保
- 列表内容
- 复制所有local成员变量 ,同时调用所有的base classes中适当的copying函数
PS:注意此时不能用copy与构造函数调用copy assignment运算,同时copy assignment也不能调用copy构造函数,不合理,因为这样相当于试图调用一个已经存在的对象;
总结:
1)copying函数应该确保赋值“对象内的所有成员变量”和“所有基类成分”;
2)不要尝试以某个copying函数实现另一个copying函数,应该共同放在第三个函数中,并有两个copying函数调用。
阅读全文
0 0
- C++之复制对象时勿忘每一个成分(12)---《Effective C++》
- 【effective c++】 条款12:复制对象时勿忘其每一个成分
- Effective C++:条款12:复制对象时勿忘其每一个成分
- 复制对象时勿忘其每一个成分(Effective C++_12)
- 读书笔记《Effective C++》条款12:复制对象时勿忘其每一个成分
- effective c++ 复制对象时勿忘每一个成分
- Effective C++ Item 12 复制对象时勿忘其每一个成分
- Effective C++ 学记之12 复制对象时勿忘其每一个成分
- effective c++条款12(复制对象时勿忘其每一个成分)
- Effective C++(12) 复制对象时要复制每一个成员
- 《Effect C++》学习------条款12:复制对象时勿忘其每一个成分
- Effective C++ rule12 复制对象时勿忘其每一个成分
- Effective C++ Item 12-复制对象时忽忘其每一个成分
- Effective C++读书笔记之十二:复制对象时勿忘其每一个成分
- 12复制对象时勿忘其每一个成分
- (10)复制对象时勿忘每一个成分
- Effective C++ 读书笔记 条款12:复制对象时勿忘其每一个成分
- Effective C++ 条款12:复制对象时勿忘其每一个成分 学习笔记
- 17_7_19:实现一个栈要求实现入栈、出栈、获得最小值的时间复杂度为O(1)
- HDU 3666 THE MATRIX PROBLEM (建图+差分约束+剪枝优化)
- s01
- 不靠谱的IndexedDB踩坑记录
- Android技能树
- C++之复制对象时勿忘每一个成分(12)---《Effective C++》
- Java工具类_表结构自动生成对应的实体类、Mapper.xml文件、Dao类
- volatile关键字解析&双重检查
- 8天学通mongodb
- PHP中MySQL一些函数(一)
- linux学习之rhel6.5 varnish服务简介及基础配置 应用
- 【微信小程序】微信小程序掉进的坑之模板消息
- Angular4+NodeJs+MySQL 入门-03 后台接口定义
- idea实现类似myeclipse的main,sys的快捷输入