C++类构造函数的特殊初始化成员函数的语法
C++为类构造函数提供了一种可以用来初始化数据成员的特殊方法
先上个例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14class Quene {
private:
int items;
const int qsize; // 私有数据成员是常量
...
};
// 构造函数
Quene::Quene(int qs)
{
...
qsize = qs; // !! NOT ALLOWED !!
...
}
为什么不允许?
首先类声明是不分配内存的,也就是说不能在类定义中进行变量初始化(静态常量除外,当然C++11已经支持在类声明中进行变量初始化了)。
程序接着执行,进行对象的创建:
- 先分配内存创建对象,这个时候还没有执行构造函数函数体(也就是
{}
中的代码),还未对数据进行初始化 - 然后执行构造函数的函数体,这是执行到赋值qs的时候就会报错,因为这是个常量,创建以后是无法修改常量的值的。
那怎么办?
C++提供的特殊初始化语法就用在这个时候,他是将初始化插在步骤1和步骤2之间,也就是在创建对象之后执行构造函数函数体之前进行初始化。
其语法如下:1
2Quene::Quene(int qs) : qsize(qs), items(0), ...
{}
括号中只能是构造函数的参数和常量。
这种语法叫做成员初始化列表
使用这种初始化方式的注意事项:
- 这种格式只能用于构造函数
- C++11之前必须使用这种方式初始化非静态的const数据成员
- 必须使用这种方式来初始化引用成员数据
为什么引用数据成员必须使用这种方式初始化?
因为引用变量必须在创建的时候初始化,创建对象的时候要紧接着将其初始化成其他变量的一个引用,不能留到后面了。