构造/析构/赋值运算

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函数共同调用

 

posted @ 2021-03-07 18:26  zzlj  阅读(75)  评论(0)    收藏  举报