高质量C++/C编程指南-第9章-类的结构函数、析构函数与赋值函数(2)
当前位置:以往代写 > C/C++ 教程 >高质量C++/C编程指南-第9章-类的结构函数、析构函数与赋值函数(2)
2019-06-13

高质量C++/C编程指南-第9章-类的结构函数、析构函数与赋值函数(2)

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) 数据成员在函数体内被初始化

    关键字:

在线提交作业