条款6
编译器会为类自动创建default构造函数、copy构造函数、copy assignment操作符。若不想要这些功能,以免被其他类调用,可以将相应的类函数声明为private并不予实现。也可以单独做一个Uncopyable类,此类设置某些函数为private类型,作为基类使用。
条款7
带多态性质的基类应该声明一个虚析构函数。如果一个类带有任何虚函数,它就应该拥有一个虚析构函数。
类的设计目的如果不是为了作为具有多台性质的基类,那么这个类最好不要声明虚析构函数,否则会带来不必要的开销。
条款8
析构函数绝对不要抛出异常,如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕获任何异常,然后吞下他们或结束程序。
如果客户需要对某个操作函数运行期间跑车的异常做出反应,那么累应该提供一个在析构函数之外的函数执行该操作。
条款9
在构造函数和析构函数期间不要调用virtual函数,因为这类迪欧用从不下降至派类。
条款10
为了赋值的传递性存在,令operator =返回一个指向自身的指针即*this。
条款11
为了避免自我赋值出现异常,可以采用两种方法。一:证同测试,如果等号左右相同就不执行赋值。二:copy and swap,即做一个副本然后用swap做交换。
条款12
coping函数应该确保赋值对象内的所有成员变量和所有base class的成分。因此,在字定义的cipying 函数中不仅要赋值自身的成员,还要主动调用父类的copying函数。
条款13
为了方式资源泄露,请使用RAII对象,他们在构造函数中获得资源并在析构函数中释放资源。
两个被常用的RAII类分别是tr1::shared_ptr和auto_ptr。请注意两者的区别。后者不允许有两个对象拥有统一资源。
注:
tr1::shared_ptr采用“引用计数智能指针”-RCSP(Reference-counting Smart Pointer)
RAII(Resource Acquisition Is Initialization)即,“资源取得时机便是初始化时机”。
在动态分配而得到的Array上使用auto_ptr或tr1::shared_ptr是不行的,因为两者在其析构函数内做的事delete而不是delete[]动作。