参考:http://www.cnblogs.com/ronny/p/3740926.html
条款05:了解C++默默编写并调用哪些函数
如果自定义一个空类的话,会自动生成默认构造函数、拷贝构造函数、拷贝赋值函数、析构函数(再次感觉原文翻译的实在是太啰嗦了!)。
当成员变量里有const对象或引用类型时,编译器会不能合成默认的拷贝赋值函数;当一个基类把它的拷贝赋值函数定义为private时,它的派生类
也不能生成默认的拷贝赋值函数,因为它无法完成基类成份的赋值。
条款06:若不想使用编译器自动生成的函数,就该明确拒绝
如果不想编译器自动生成默认函数,可将相应的成员函数声明为private并且不实现(否则成员函数或友元仍能调用);也可以在基类中实现并私有继承
C++11中已经摒弃了上述的做法,而是通过删除函数来设定,只需要在对应的函数列表后加=delete即可。
条款07:为多态基类声明virtual析构函数
当你需要手动的去delete一个指向基类的指针的时候,需要将该基类的析构函数设置为virtual,这样可以让delete时,动态的删除可能的派生类的成员。
不要无端的给一个没有virtual成员函数的类的析构函数声明为virtual,因为如果要实现virtual函数必须让类携带更多的信息(存储空间)。
标准的string不含任何virtual函数,所以不要把string定义为某个定义类的基类。类似的情况也发生成STL的其他容器如vector,list,set等上。
为一个抽像基类(不能定义对象实体)声明一个纯虚函数,而且要为这个纯虚函数要提供一份定义。即如果一个类带有任何一个虚拟函数,则它需要定义
一个虚拟析构函数。
并不是多所有基类设计都是为了多态(经base class接口处理derived class对象)用途,因此它们不需要虚拟析构函数。即如果一个类不是基类或不是作为
多态来使用,就不该声明虚拟析构函数。
条款08:别让异常逃离析构函数
不要让析构函数吐出异常。如果一个被析构函数调用的函数可能抛出获异常,析构函数应该捕捉任何获异常,然后吞下它们(不传播)或结束程序。
如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非析构函数中)执行该操作。
条款09:绝不在构造和析构过程中调用virtual函数
在构造和析构函数中不要调用virtual函数,因为这类调用从不下降至派生类。
条款10:令operator=返回一个reference* this
x=y=z=15实际上是采用右赋值的,这个连锁赋值可以解析为:x=(y=(z=15))。这里15先被赋值给z,然后其结果(更新后的z)再被赋值给y,然后其结果(更新后的y)再被赋值给x。
所以如果我们想保证y和z在完成赋值后能够对自己更新,则需要operator=返回一个本身的引用。
条款11:在operator=中处理"自我赋值"
对对像赋值时,有时有可能发生自我赋值,这就要求我们赋值时比较来源对象和目标对象的地址或使用先赋值再删除的语句顺序。
条款12:复制对象时勿忘其每一个成分
当你编写一个拷贝构造函数或拷贝赋值运算符时,请确保有的局部成员变量都被拷贝以及调用所有的基类的适当的拷贝函数。
虽然拷贝赋值操作符与拷贝构造函数做了类似的事情,但是你不能在拷贝赋值操作里调用拷贝构造函数,因为你试图对一个已经定义的对象从重定义并初始化。
如果你发现你的copy构造函数和copy assignment操作符有相近的代码,消除重复代码的做法是,建立一个新的成员函数来给两者调用。