目录
1、由于是在定义阶段进行的初始化,所以,只能在定义阶段进行的初始化类型便只能在初始化列表中进行初始化。
2、初始化顺序不是跟着初始化列表走的,而是跟着类中成员变量的声明顺序进行的初始化:
一、什么是初始化列表?
初始化列表,成员变量初始化的地方,只有在这里进行的操作才能叫做初始化。
之前学的浅显的类似于链表阶段的Init()的构造函数是相当于用了赋值操作在函数体内进行的对变量的copy,而初始化列表是在定义阶段进行的初始化。
二、初始化列表长啥样?
// 初始化列表
Date::Date(int year, int month, int day)
:_year(year)
, _month(month)
, _day(day)
{}
仍然以Date类进行学习,以冒号 ":" 开始进行第一个成员变量的初始化操作,以逗号 "," 分隔接下来剩余的成员变量,最后一个不加分号,每个成员变量后面跟着用括号括起来的用来进行初始化操作的初始值或者表达式,这就是初始化列表的模样。
很像拷贝构造的样子。
三、初始化列表的特性
1、由于是在定义阶段进行的初始化,所以,只能在定义阶段进行的初始化类型便只能在初始化列表中进行初始化。
①const对象
②引用对象
③无默认构造函数的自定义类型
2、初始化顺序不是跟着初始化列表走的,而是跟着类中成员变量的声明顺序进行的初始化:
比如:
class Date
{
private:
int _year;
int _month;
int _day;
};
在Date类中就是按照年/月/日的顺序进行 初始化,所以如果在初始化列表时不是年/月/日的顺序的话,会造成误解,如果是在其他类中,会造成更加严重的影响:
代码以供测试:
class A
{
public:
A(int a)
:_a1(a)
, _a2(_a1)
{}
private:
int _a2;
int _a1;
};
int main()
{
A a(1);
return 0;
}
从中可以清晰地看出,类A的初始化顺序应该是_a2, _a1,但是初始化列表却写成了先初始化_a1, _a2,所以导致了将随机值初始化给了_a2。