今天继续Scott的神作《Effective C++》的第二章:构造/析构/赋值运算
Item5. 了解C++默默编写并调用哪些函数
当定义个类时,如果没有明确定义constructor和destructor,则编译器会使用默认函数创建constructor/destructor/copy constructor/copy assignment函数,其中感觉新鲜的是复制构造函数和复制赋值运算符。复制构造函数和复制赋值运算符的使用类似下面这样:
class GamePlayer gp1;
class GamePlayer gp2(gp1);
class GamePlayer gp3 = gp2;
对于复制赋值运算符需要注意,对于含引用或者const成员的类对象不能使用默认的复制赋值运算符,因为C++不允许引用改指不同对象,const成员也不能被重新赋值。此外,private层次的赋值运算符派生类无权调用。
Item6. 若不想使用编译器自动生成的函数,就该明确拒绝
如果想禁止C++自带的默认copy构造函数和copy赋值运算符,则可以将它们统统定义为private层次且置于空定义。
item7. 为多态基类声明virtual析构函数
当通过基类的接口来调用派生类对象实现多态时,必须相应定义基类的的destructor为virtual属性,否则只会调用基类的destructor导致派生类部分内存泄漏。如果不是以上的情况,不要使用virtual destructor。
item8. 别让异常逃离虚构函数
析构函数中发生异常时(如:close()异常)如果不做处理会导致程序终止或导致不可知的行为,为了避免不可知行为的危害,在析构函数中使用try-catch方法捕捉异常予以终止程序。
item9. 绝不在构造和析构过程中调用virtual函数
不要再类的constructor和destructor中调用虚函数,因为这类调用从来不会下降到derived class层。
item10. 令operator= 返回一个reference to *this
Widget& operator= (const Widget& rhs)
{
... ...
return *this;
}
item11. 在operator= 中处理“自我赋值”
item12. 复制对象时勿忘其每一个成分
Coping函数应该确保复制源对象内所有成员变量及所有基类成分;不要尝试在某个coping函数实现另一个coping函数,应该将共同技能放入第三个函数中,并由两个coping函数共同调用。
阅读(233) | 评论(0) | 转发(0) |