高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(2[VC/C++编程]
本文“高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(2[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
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; // 成员对象
};
示例9-2(a)中,类B的构造函数在其初始化表里调用了类A的拷贝构造函数,从而将成员对象m_a初始化.
示例9-2 (b)中,类B的构造函数在函数体内用赋值的方法将成员对象m_a初始化.我们看到的只是一条赋值语句,但实际上B的构造函数干了两件事:先公开里成立m_a对象(调用了A的无参数构造函数),再调用类A的赋值函数,将参数a赋给m_a.
B::B(const A &a)
: m_a(a)
{
…
}
B::B(const A &a)
{
m_a = a;
…
}
示例9-2(a) 成员对象在初始化表中被初始化 示例9-2(b) 成员对象在函数体内被初始化
关于内部数据范例的数据成员而言,两种初始化方法的效率几近没有辨别,但后者的程序版式仿佛更清楚些.若类F的声明以下:
class F
{
public:
F(int x, int y); // 构造函数
private:
int m_x, m_y;
int m_i, m_j;
}
示例9-2(c)中F的构造函数采取了第一种初始化方法,示例9-2(d)中F的构造函数采取了第二种初始化方法.
F::F(int x, int y)
: m_x(x), m_y(y)
{
m_i = 0;
m_j = 0;
}
F::F(int x, int y)
{
m_x = x;
m_y = y;
m_i = 0;
m_j = 0;
}
示例9-2(c) 数据成员在初始化表中被初始化 示例9-2(d) 数据成员在函数体内被初始化
以上是“高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(2[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |