构造/析构/赋值运算
5.C++默默编写并调用哪些函数
1.编译器暗自为class创建default构造函数、copy构造函数、copy assignment函数、析构函数
6.不想编译器自动生成函数,应该明确拒绝
1.为驳回编译器自动提供的机能,可以将相应的成员函数声明为private并且不予实现,例如使用uncopyable这样的base class
7.为多态基类声明虚析构函数
当drived class对象经由一个base class指针删除,而该base class带有non-virtual析构函数时,结果未定义,通常发生的是对象的drived成分没有删除,只删除了base成分,因为只调用了base class的析构函数,virtual函数的目的是允许drived class实现得以客制化,任何class只要带有virtual函数几乎确定也有一个virtual析构函数,class不含virtual函数,意味着不企图作为一个base class,带有virtual函数的class都有一个vtbl,当调用某一个virtual函数时,实际被调用的函数决定于vtpr指向哪个vtbl,给base class一个vitual析构函数,是为了 “通过base class接口处理drivied class对象”
1.多态性质的base class应该声明一个virtua析构l函数,如果任何class拥有任何virtual函数,应该还拥有virtual析构函数
2.class设计目的不是为了作为base class或者不是为了具备多态性,就不应该声明virtual析构函数
8.别让异常逃离析构函数
如果某个操作可能在失败是抛出异常,而又存在某种需要必须处理该异常,那么该异常必须来自析构函数以外的函数,析构函数吐出异常会导致不确定的行为或程序过早结束
1.析构函数不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该吞下或者结束程序
2.如果需要抛出异常哪个,class应该提供普通函数执行
9.绝不在构造和析构函数中调用virtual函数
derived对象内的base成分会在drived成分被构造之前先构造完成,如果base构造函数有调用virtual函数,那么这时调用的是base版本函数,因为virtual绝不会下降到drived层,在drived对象的base class构造期间,对象类型是base class,所以virtual函数不会被编译器解析至drived层,因为drived专属成分还没有初始化,所以最好的办法是视而不见,否则是未定义行为,析构函数同理
1.在构造和析构期间不要调用virtual,因为这类调用不会下降至drived层(比起当前执行的构造和析构那层)
10.令operator= 返回一个reference to *this
1.另赋值操作符返回一个reference to *this(左侧对象)
11.在operator=中处理“自我赋值”
12.复制对象时勿忘其每一个成分
1.Copying函数应该确保复制“对象内的所有成员变量”及“所有base class”成分
2.不要尝试以某一个copying函数实现另一个copying函数,应该将共同机能放进第三个函数中,并由两个copying函数共同调用

浙公网安备 33010602011771号