Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4235408
  • 博文数量: 176
  • 博客积分: 10059
  • 博客等级: 上将
  • 技术积分: 4681
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-24 12:27
文章分类

全部博文(176)

文章存档

2012年(1)

2011年(4)

2010年(14)

2009年(71)

2008年(103)

分类: C/C++

2008-12-11 23:34:58


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) |
给主人留下些什么吧!~~