background image

构造函数与析构函数的名字不能随便起,必须让编译器认得出才可以被自动执行 。
Stroustrup 的命名方法既简单又合理:让构造函数、析构函数与类同名,由于析构函数的

目的与构造函数的相反,就加前缀 ~’以示区别。
除了名字外,构造函数与析构函数的另一个特别之处是没有返回值类型,这与返回值类
型为 void 的函数不同。构造函数与析构函数的使命非常明确,就象出生与死亡,光溜溜地
来光溜溜地去。如果它们有返回值类型,那么编译器将不知所措。为了防止节外生枝,干
脆规定没有返回值类型。(以上典故参考了文献[Eekel, p55-p56])
9.2 构造函数的初始化表

构造函数有个特殊的初始化方式叫 初始化表达式表 (简称初始化表)。初始化表位于函

 

数参数表之后,却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体内的任何
代码被执行之前。
构造函数初始化表的使用规则:
u 如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。
例如
class A
{…
A(int x); // A 的构造函数
};
class B : public A
{…
B(int x, int y);// B 的构造函数
};
B::B(int x, int y)
: A(x) // 在初始化表里调用 A 的构造函数
{

}
u 类的 const 常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初
始化(参见 5.4 节)。
u 类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式,这两种方式的效
率不完全相同。
非内部数据类型的成员对象应当采用第一种方式初始化,以获取更高的效率。例如
class A
{…
A(void); // 无参数构造函数
A(const A &other); // 拷贝构造函数
A & operate =( const A &other); // 赋值函数
};
class B
{
public:
B(const A &a); // B 的构造函数
private:
A m_a; // 成员对象