Item 5: 了解 C++ 为你偷偷地加上和调用了什么函数
一个 empty class(空类)
class Empty{};
在本质上和你这样写是一样的:
class Empty {
public:
Empty() { ... } // default constructor
Empty(const Empty& rhs) { ... } // copy constructor
~Empty() { ... } // destructor — see below
// for whether it's virtual
Empty& operator=(const Empty& rhs) { ... } // copy assignment operator
};
这些函数只有在它们被需要的时候才会生成,但是并不需要做太多的事情,就会用到它们。下面的代码会促使每一个函数生成:
Empty e1; // default constructor;
// destructor
Empty e2(e1); // copy constructor
e2 = e1; // copy assignment operator
编译器可以隐式生成一个 class(类)的 default constructor(缺省构造函数),copy constructor(拷贝构造函数),copy assignment operator(拷贝赋值运算符)和 destructor(析构函数)。
如果你希望一个包含 reference member(引用成员)的 class(类)支持 assignment(赋值),你必须自己定义 copy assignment operator(拷贝赋值运算符)。对于含有 const members(const 成员)的 classes(类),编译器同样会报错
Item 6: 如果你不想使用 compiler-generated functions(编译器生成函数),就明确拒绝
为了拒绝编译器自动提供的机能,将相应的 member functions(成员函数)声明为 private,而且不要给出 implementations(实现)。使用一个类似 Uncopyable 的 base class(基类)是方法之一。
Item 7: 在 polymorphic base classes(多态基类)中将 destructors(析构函数)声明为 virtual(虚拟)
几乎所有拥有 virtual functions(虚拟函数)的 class(类)差不多都应该有一个 virtual destructor(虚拟析构函数)。
如果一个 class(类)不包含 virtual functions(虚拟函数),这经常预示不打算将它作为 base class(基类)使用。当一个 class(类)不打算作为 base class(基类)时,将 destructor(析构函数)虚拟通常是个坏主意。
很多人总结过这条规则:当且仅当一个类中包含至少一个虚拟函数时,则在类中声明一个虚拟析构函数。
回想一下,pure virtual functions(纯虚拟函数)导致 abstract classes(抽象类)——不能被实例化的 classes(类)(也就是说你不能创建这个类型的 objects(对象))。
在你想要变成抽象的 class(类)中声明一个 pure virtual destructor(纯虚拟析构函数)。
polymorphic base classes(多态基类)应该声明 virtual destructor(虚拟析构函数)。如果一个 class(类)有任何 virtual functions(虚拟函数),它就应该有一个 virtual destructor(虚拟析构函数)。
不是设计用来作为 base classes(基类)或不是设计用于 polymorphically(多态)的 classes(类)就不应该声明 virtual destructor(虚拟析构函数)。
Item 8: 防止因为 exceptions(异常)而离开 destructors(析构函数)
当 vector v 被销毁时,它有责任销毁它包含的所有 Widgets。
在非常巧合的条件下产生这样两个同时活动的异常,程序的执行会终止或者引发 undefined behavior(未定义行为)。
Things to Remember
destructor(析构函数)应该永不引发 exceptions(异常)。如果 destructor(析构函数)调用了可能抛出异常的函数,destructor(析构函数)应该捕捉所有异常,然后抑制它们或者终止程序。
如果 class(类)客户需要能对一个操作抛出的 exceptions(异常)做出回应,则那个 class(类)应该提供一个常规的函数(也就是说,non-destructor(非析构函数))来完成这个操作。
Item 9: 绝不要在 construction(构造)或 destruction(析构)期间调用 virtual functions(虚拟函数)
非正式地讲,base class construction(基类构造)期间,virtual functions(虚拟函数)被禁止。
在 construction(构造)或 destruction(析构)期间不要调用 virtual functions(虚拟函数),因为这样的调用不会转到比当前执行的 constructor(构造函数)或 destructor(析构函数)所属的 class(类)更深层的 derived class(派生类)。
阅读(1793) | 评论(0) | 转发(0) |