C++为类构造函数提供了一种可以用来初始化数据成员的特殊方法

先上个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Quene {
private:
int items;
const int qsize; // 私有数据成员是常量
...
};
// 构造函数
Quene::Quene(int qs)
{
...
qsize = qs; // !! NOT ALLOWED !!
...
}

为什么不允许?
首先类声明是不分配内存的,也就是说不能在类定义中进行变量初始化(静态常量除外,当然C++11已经支持在类声明中进行变量初始化了)。
程序接着执行,进行对象的创建:

  1. 先分配内存创建对象,这个时候还没有执行构造函数函数体(也就是{}中的代码),还未对数据进行初始化
  2. 然后执行构造函数的函数体,这是执行到赋值qs的时候就会报错,因为这是个常量,创建以后是无法修改常量的值的。

那怎么办?
C++提供的特殊初始化语法就用在这个时候,他是将初始化在步骤1和步骤2之间,也就是在创建对象之后执行构造函数函数体之前进行初始化。
其语法如下:

1
2
Quene::Quene(int qs) : qsize(qs), items(0), ...
{}

括号中只能是构造函数的参数和常量。
这种语法叫做成员初始化列表

使用这种初始化方式的注意事项:

  1. 这种格式只能用于构造函数
  2. C++11之前必须使用这种方式初始化非静态的const数据成员
  3. 必须使用这种方式来初始化引用成员数据

为什么引用数据成员必须使用这种方式初始化?
因为引用变量必须在创建的时候初始化,创建对象的时候要紧接着将其初始化成其他变量的一个引用,不能留到后面了。

Comments

2016-03-04