文章目录
条款05:了解C++默认编写和调用了哪些函数
请记住
编译器会缺省地为类创建默认构造函数、复制构造函数、赋值复制操作符以及析构函数。
我的理解
确实如此。
条款06:显示地拒绝哪些你并不想使用的编译器自动生成的函数
请记住
为实现这一条款,可以将相应的成员函数声明为private,并且不予实现。
我的理解
这种情况出现于单例模式等现象中,比如我们不希望实例出现多份副本,那么我们就要按照如上所说的,禁止掉缺省的复制与辅助操作。
条款07:为多态基类声明virtual析构函数
请记住
- 多态基类应该声明虚析构函数。如果类带有任何虚函数,那么析构函数应该也是虚的。
- 如果不是做虚基类,就不要声明虚析构函数。
我的理解
简单来说,当且仅当声明虚基类时,使用虚析构函数。
如果是虚基类,那么在派生类调用析构函数时,会先调用虚基类的析构函数,如果该函数非虚,那么后果很可能是,基类部分被删除,而派生类部分未被删除(具体原因未知,书41页)。
如果是非虚基类,使用了虚构造函数,会增加类的负担,也不好。
条款08:不要在析构函数中写异常(书上翻译很奇怪,我改了下说法)
请记住
- 析构函数绝对不要抛出异常。如果一定要处理异常,请写一个catch来处理,或者直接终止程序。
- 在不同函数中处理运行抛出的异常,而不是析构函数。
我的理解
如果生成一个自定义类的向量,在删除该向量时,要调用多次析构函数,如果析构函数会抛出异常,那就很难办了,所以应按照上述两种方法之一来进行解决。
条款09:不要在构造和析构过程中调用virtual函数
请记住
在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class。
我的理解
确实如此,遵守就好。
条款10:operator=应该返回*reference to this
请记住
赋值运算符返回一个this指针的解引用的引用
我的理解
确实如此,包括+=,-=也是。
条款11:operator=应该能处理给自己赋值
请记住
确保当对象自我赋值时,operator=有良好行为。
确定任何函数在操作对象为多个,且有可能多个对象指向同一个对象时,行为仍然正确。
我的理解
实现这一条款的方法如下:
Object& operator=(const Object& others) {
Object* pOrig = po; // 记住原先的指针
po = new Object(*others.po); // 将po指向others.po的一个副本
delete pOrig; // 删除原先的指针
return *this;
}
条款12:复制对象时保证复制完全
请记住
- 复制函数要确保复制基类和派生类中的所有内容。
- 不要用某个copying函数实现另一个copying函数。应该把共同机能放进第三个函数中,并由两个copying函数共同调用。
我的理解
轻易不要自己写复制函数,如果要写,一定要小心,确保复制的完全。