读书笔记_Effective_C++_条款十二:复制对象时勿忘其每一个成分
2013-03-21 15:35
211 查看
这句话包含两部分的意思:第一部分是要考虑到所有成员变量,特别是后加入的,相应的拷贝构造函数和赋值运算符要及时更新;第二部分是在存在继承时,不要遗忘基类部分的复制。先看第一部分的意思,举个例子:
这里只举了一个拷贝构造函数的例子,赋值运算符与之类似,如果这个时候又加了一个成员变量,比如double b,拷贝构造函数和赋值运算符就要相应地更新(构造函数当然也要更新,只是构造函数一般不会被忘记,而拷贝构造函数和赋值运算符却常常被遗忘)。像这样:
再看第二部分的意思,当存在继承关系时:
像这样,很容易就会漏掉基类的部分,导致基类部分没有得到正常的拷贝,应该修改为如下:
对于赋值运算符的重载,应该写成这样:
可以看到,赋值运算符重载与拷贝构造函数的代码具有很高的相似性,但书上说“不要尝试以某个copying函数实现另一个copying函数”。我觉得这里有争议,上一个条款中,书上已经做到了在赋值运算符中调用拷贝构造函数了,像这样:
这就是一个在赋值运算符内调用拷贝构造函数的例子,也许在有些情况下,它的效率看上去不那么高,但却为代码的一致性提供了很好的保障,也能有效提供异常安全性。所以,在这个地方,我不大认同书上所说的,如果你有什么想法,可以留言共同讨论。书上所说的定制一个共有的private函数,比如init(),分别在拷贝构造函数和operator=中调用当然也是可以的。
最后总结一下:
Copying函数应该确保复制“对象内的所有成员变量”及“所有基类成分”。
class SampleClass { private: int a; public: SampleClass(const SampleClass& s):a(s.a) {} };
这里只举了一个拷贝构造函数的例子,赋值运算符与之类似,如果这个时候又加了一个成员变量,比如double b,拷贝构造函数和赋值运算符就要相应地更新(构造函数当然也要更新,只是构造函数一般不会被忘记,而拷贝构造函数和赋值运算符却常常被遗忘)。像这样:
class SampleClass { private: int a; double d; public: SampleClass(const SampleClass& s):a(s.a),d(s.d) {} };
再看第二部分的意思,当存在继承关系时:
class Derived: public SampleClass { private: int derivedVar; public: Derived(const Derived& d):derivedVar(d.derivedVar){} };
像这样,很容易就会漏掉基类的部分,导致基类部分没有得到正常的拷贝,应该修改为如下:
class Derived: public SampleClass { private: int derivedVar; public: Derived(const Derived& d):SampleClass(d), derivedVar(d.derivedVar){} };
对于赋值运算符的重载,应该写成这样:
Derived& operator=(const Derived& d) { SampleClass::operator=(d); derivedVar = d.derivedVar; return *this; }
可以看到,赋值运算符重载与拷贝构造函数的代码具有很高的相似性,但书上说“不要尝试以某个copying函数实现另一个copying函数”。我觉得这里有争议,上一个条款中,书上已经做到了在赋值运算符中调用拷贝构造函数了,像这样:
Derived& operator=(const Derived& d) { Derived tmp(d); swap(*this, tmp); return *this; }
这就是一个在赋值运算符内调用拷贝构造函数的例子,也许在有些情况下,它的效率看上去不那么高,但却为代码的一致性提供了很好的保障,也能有效提供异常安全性。所以,在这个地方,我不大认同书上所说的,如果你有什么想法,可以留言共同讨论。书上所说的定制一个共有的private函数,比如init(),分别在拷贝构造函数和operator=中调用当然也是可以的。
最后总结一下:
Copying函数应该确保复制“对象内的所有成员变量”及“所有基类成分”。
相关文章推荐
- Effective C++ 条款12:复制对象时勿忘其每一个成分
- 读书笔记《Effective c++》 条款12 复制对象时勿忘其每一个成分
- Effective C++ Item 12 复制对象时勿忘其每一个成分
- 条款十二 复制对象时勿忘其每一个成分
- effective c++条款12(复制对象时勿忘其每一个成分)
- Effective C++ -----条款12: 复制对象时勿忘其每一个成分
- C++之复制对象时勿忘每一个成分(12)---《Effective C++》
- 读书笔记_Effective_C++_条款二十八:避免返回handlers指向对象内部成分
- 条款12:复制对象时勿忘其每一个成分
- C++ 复制对象时勿忘其每一个成分
- 条款12:复制对象时勿忘其每一个成分(Copy all parts of an object)
- Effective C++ Item 12-复制对象时忽忘其每一个成分
- 【effective c++】 条款12:复制对象时勿忘其每一个成分
- effective C++ 条款 12:复制对象时勿忘其每一个成分
- Effective C++_笔记_条款12_复制对象时勿忘其每一个成分
- 条款12:复制对象时勿忘其每一个成分
- Effective C++——》条款12:复制对象时勿忘其每一部分
- 《Effect C++》学习------条款12:复制对象时勿忘其每一个成分
- EC读书笔记系列之7:条款12 复制对象时勿忘其每一个成分
- effect C++ 复制对象时勿忘其每一个成分