条款05:了解C++默默编写了并调用了那些函数
请记住:
class Empty { public: Empty(){...} //default constructor Empty(const Empty& rhs){...} //copy constructor ~Empty(){...} //destructor Empty& operator=(const Empty& rhs){...} //copy assignment operator };
条款06:如果不想使用编译器自动生成的函数就应该明确的拒绝
请记住:
一旦你定义了自己的构造函数,不论函数参数如何,编译器都不再自动帮你产生构造函数。
如果你想阻止copying,则要声明一个private的copy构造函数和copy assignment操作符,并且不去定义它们。这样,一旦有人尝试进行copy构造或赋值,编译器就会报错。
条款07:为多态的基类,声明virtual析构函数
请记住:
任何class只要带有virtual函数都几乎确定应该也有一个virtual析构函数。
如果class不含virtual函数,通常表示它并不意图被用做一个base class。当class不企图被当作base class,令其析构函数为virtual往往是个馊主意。
欲实现virtual函数,对象必须携带某些信息,主要用来在运行期决定哪一个virtual函数被调用。这份信息通常是由一个所谓vptr(virtual table pointer)指针指出。vptr指向一个由函数指针构成的数组,称为vtbl(virtual table):每一个带有virtual函数的class都有一个相应的vtbl。当对象调用某一virtual函数,实际被调用的函数取决于该对象的vptr所指的那个vtbl——编译器在其中寻找适当的函数指针。
如果class内含irtual函数,其对象的体积会增加(由于ptr)。另外,C++的对象也不会和其他语言(如C)内的相同声明有着一样的结构(因为其他语言的对应物没有ptr),因此也不能把它传递至(或接受自)其他语言所写的函数,即不再具有移植性。
条款08:别让异常逃离析构函数
请记住:
对于C++,有两个异常同时存在的情况下,程序若不是结束执行,就是导致不明确行为。因此假如某对象的析构函数可能抛出异常,当我们试图释放一个包含装有该类对象的容器时,假设在析构第一个元素期间,有个异常被抛出,容器中的其他元素还是要被销毁,因此将调用它们各个析构函数,如果在这期间又有另一元素在析构过程中抛出了异常,故事将如何发展便不得而知了。
条款09:绝不在构造和析构过程中调用virtual函数
请记住:
由于base class构造函数的执行更早于derived class构造函数,当base class构造函数执行时derived class的成员变量尚未初始化。如果此期间调用irtual函数下降至derived class阶层,要知道derived class的函数几乎必然取用local成员变量,而那些成员变量尚未初始化。
条款10:令operator=返回一个reference to *this
请记住:
条款11:在operator=中处理“自我赋值”
请记住:
条款12:赋值对象时勿忘赋值对象的每一个成分
请记住:
当你编写一个copying函数,请确保(1)复制所有local成员变量,(2)调用所有base class内的适当的copying构造函数,(3)不要尝试以某个copying函数实现另外一个copying函数。
原文:http://www.cnblogs.com/kona/p/4662641.html