以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式
1、哪个对象调用构造函数,初始化列表就是它所有成员变量定义的位置
2、不管是否显式在初始化列表中写,每个成员变量都会在初始化列表中定义/初始化
3、必须在定义的位置初始化
4、如果成员变量不在初始化列表,那么用缺省值来定义,否则根据初始化列表定义
5、每个成员在初始化列表中只能出现一次(只能初始化一次)
6、对于自定义类型成员变量,不管是否使用初始化列表,一定会先使用初始化列表初始化
7、成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
class Date {
public:
Date(int year = 0, int month = 1, int day = 1)
:_year(year)
, _month(month)
, _day(day) {
}
private:
声明,设置缺省值
//int _year=1;
//int _month=1;
//int _day=1;
int _year;
int _month;
int _day;
};
class A
{
public:
A(int a)
:_a1(a)
,_a2(_a1)
{}
void Print() {
cout<<_a1<<" "<<_a2<<endl;
}
private:
int _a2;
int _a1;
};
int main() {
A aa(1);
aa.Print();
}
A aa(1);调用构造函数,int a = 1;
成员变量声明的顺序就是初始化的顺序:先初始化_a2再初始化_a1
_a2(_a1) -- _a1未定义,是随机值
_a1(a) -- _a1(1)
输出结果为 1 随机值