条款12:复制对象的时候不要忘了其每一个部分

  首先要说的是当对一个已经定义了构造函数以及赋值运算符(拷贝)的class增加了成员的时候,一定要记得为这个class重新改写构造函数以及拷贝赋值运算符。

  下一个容易遗忘的点在继承中,看下面的代码:

 1 class Customer
 2 {
 3     public:
 4         //...
 5         Customer(const Customer & rhs):name(rhs){}
 6         Customer & operator=(const Customer & rhs)
 7         {
 8             //...
 9         }
10     private:
11         std::string name;
12 }
13 //再考虑继承的情况。
14 class PriorityCustomer:public Customer
15 {
16     public:
17         //...
18         PriorityCustomer(const PriorityCustomer & rhs)
19         :priority(rhs.priority)
20         {
21             //...
22         }
23         PriorityCustomer & operator=(const PriorityCustomer & rhs)
24         {
25             priority = rhs.priority;
26             return *this;
27         }
28 }

看着好像没错,但是基类事实上没有被构造,应该在derived class中显式的调用base class的构造函数。像下面这样:

 1 class PriorityCustomer:public Customer
 2 {
 3     public:
 4         //...
 5         PriorityCustomer(const PriorityCustomer & rhs)
 6         :priority(rhs.priority)
 7         Customer(rhs)
 8         {
 9             //...
10         }
11         PriorityCustomer & operator=(const PriorityCustomer & rhs)
12         {
13             Customer::operator=(rhs);//这个用法要注意,不然会引起循环递归
14             priority = rhs.priority;
15             return *this;
16         }
17 }

  PS:如果发现copy constructor和copy assignment operator有着相似的代码,消除重复代码的方法是,建立一个新的private成员函数给二者用,一般名字为init()
小结:应该记住的两点是 1. copying函数应该确保复制对象里面你的所有函数包括进行基类的完整构造 2.如果两个copy函数中有相同的部分,

不要尝试用一个区调用另一个,而应该另外声明一个函数处理两个coping函数中公共的部分

时间: 2024-08-06 15:36:54

条款12:复制对象的时候不要忘了其每一个部分的相关文章

Effective C++ -----条款12: 复制对象时勿忘其每一个成分

Copying函数应该确保复制“对象内的所有成员变量”及“所有base class成分”. 不要尝试以某个copying函数实现另一个copying函数.应该将共同机能放进第三个函数中,并由两个coping函数共同调用.如果你发现你的copy构造函数和copy assignment操作符有相近的代码,消除重复代码的做法是,建立一个新的成员函数给两者调用.这样的函数往往是private而且常被命名为init.这个策略可以安全消除copy构造函数和copy assignment操作符之间的代码重复.

Effective C++_笔记_条款12_复制对象时勿忘其每一个成分

(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 编译器会在必要时候为我们的classes创建copying函数,这些“编译器生成版”的行为:将被烤对象的所有成员变量都做一份拷贝. 如果你声明自己的copying函数,意思就是告诉编译器你并不喜欢缺省实现中的某些行为.编译器仿佛被冒犯似的,会以一种奇怪的方式回敬:当你的实现代码几乎必然出错时却不告诉你.所以自己实现copying函数时,请遵循一条规则:如果你为c

Effective C++ .12 复制对象-拷贝构造函数的编写

当我们自己编写拷贝构造函数时,编译器就不会为该类生成默认拷贝构造函数了,对于assignment operator也是如此. 1. 拷贝构造函数中记得调用父类的拷贝构造函数,或者相应复制过程 class Man { private: int age; public: Man(int _age = 0) : age(_age){} }; class Woman : public Man { public: Woman() {} Woman(const Woman& w) : Man(w) {} W

Effective C++——条款10条,条款11和条款12(第2章)

条款10:    令operator=返回一个reference to *this Have assignment operators return a reference to *this 关于赋值,可以把它们写成连锁形式: int x, y, z; x = y = z = 15; // 赋值连锁形式 赋值采用右结合律,所以上述连锁赋值被解析为: x = (y = (z = 15)); 这里15先被赋值给z,然后其结果(更新后的z)再被赋值给y,然后其结果(更新后的y)再被赋值给x. 为了实现

Effective C++ 条款12

复制对象时,勿忘其每一个成分 作者在本节条款提醒我们,在多重继承的情况下进行copy或者copy assignment 的operator=的编写时,一定要考虑base 类部分数据的初始化后者复制. 对比一下代码: class Cutsomer { -- private: string name; string telphone; }; class PriorityCustomer:public Cutsomer { public: PriorityCustomer() { cout<<&qu

Effective C++:条款12:复制对象时勿忘其每一个成分

(一) 一个继承体系的声明: class Date {...}; class Customer { public: ... private: string name; Date lastTransaction; }; class PriorityCustomer : public Customer { public: PriorityCustomer(const PriorityCustomer& rhs); PriorityCustomer& operator=(const Priori

条款12:复制对象时请勿忘每一个成分

条款12:复制对象时请勿忘每一个成分 当为一个类实现自己的构造函数,相关赋值函数,析构函数,则必须有责任对类中的每一个成员进行初始化.赋值.释放.因此:如果为一个类添加一个成员,就必须同时相应修改上面几类函数. 看一个简单的类 class Terminal { Terminal(const int termid) : m_termId(termid) {} ~Terminal() {} Terminal(const Terminal & terminal) { this->m_termId

条款12:复制对象时勿忘其每一个成分

对象复制操作operator=或copy构造函数,一定要记得复制对象每一个成份,特别是base class的成分: 注意:

effective c++ 条款12:复制对象时勿忘其每一个成分

记住:拷贝函数应该确保复制"对象内的所有成员变量"及"所有父类成分".不要尝试以某个拷贝函数实现另一个拷贝函数.应该将共同机能放进第三个函数中,并由两个拷贝函数共同调用. 下面是一个类实现了自己的拷贝函数,一起正常. void logCall(const string& funcName): class Customer { public: ... Customer(const Customer& rhs); Customer& operat