1.初始化列表基本定义
用 构造函数 的 初始化列表 来 初始化 成员变量
构造函数初始化列表初始化成员变量的格式是
类名 () : 成员变量1(数值表达式) 成员变量2(数值表达式) ........ { 其它内容 }
2.初始化列表规则
每个成员变量只能在初始化列表中出现一次,不能出现多次,就和我们平常去初始化一个变量一样,一个变量只能初始一次,不能初始多次。
3.初始化列表的应用
因为初始化列表存在的意义是用来初始化成员变量,所以有些类型的变量必须在初始化列表或成员变量声明中定义。比如: 引用,加const的变量,没有默认构造函数的类。看下图
上面分别是引用和const类型变量和没有默认构造函数的类类型
4.初始化缺省值
当成员变量没有出现在初始化列表时,初始化调用的是成员变量在声明时的缺省值。
我们看到,如果初始化列表中没有这个成员变量的初始化,那么就会使用成员变量声明时加的缺省值, 但是!!!!!!,我们最好在初始化列表中初始化成员变量,因为不管怎样,成员变量都会走初始化列表。如果初始化列表有,编译器就会用初始化列表的,如果初始化列表没有,就会用成员变量声明时的缺省值,如果两个地方都没有,那么初始化就是随机值,而且,没有默认构造函数的类会报错。
5.初始化列表初始顺序
初始化列表中成员变量的初始化顺序按照成员变量在类中声明的顺序进行初始化,和初始化列表中,成员变量出现的顺序无关。
#include<iostream>
using namespace std;
class Date
{
public:
Date():month(1),year(month)
{
}
void print()
{
cout << year << "年" << month << "月" << endl;
}
private:
int year;
int month;
};
int main()
{
Date D1;
D1.print();
}
我们看这串代码,如果初始化列表是按照成员函数在初始化列表中出现的顺序进行初始化,那么是不是这个month和year都为1呢,但是运行结果如下。
year为随机值,而month为1,证明了初始化列表是按照成员变量在成员变量声明的顺序进行初始化的,而不是按照初始化列表的顺序。
6.总结
1.无论是否显示写初始化列表,每个类都有自己的初始化列表。
2.无论是否在初始化列表显示初始化,每个成员变量都要走初始化列表。