顾名思义,是用来初始化的列表。
这个列表是构造函数的用来初始化类的成员变量的。
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
以日期类的三参数构造和拷贝构造为例
class Date
{
public:
Date::Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{}
Date::Date(const Date& d)
: _year(d._year)
, _month(d._month)
, _day(d._day)
{}
private:
int _year;
int _month;
int _day;
};
初始化列表夹杂在构造函数的参数括号后和函数体前。
初始化列表的特点:
class的成员变量是通过构造函数来进行初始化的,而构造函数(无论是否自己实现)在实例化的时候是要先走初始化列表的。
ps即便你没有显示写出来这个初始化列表,它仍然存在,并且要经过,c++11里可以在class声明成员变量的时候给省缺值,这个省缺值就是给初始化列表的()预留的。函数体里的(eg:_year = year)不叫初始化,叫赋值。
1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
2. 类中包含以下成员,必须放在初始化列表位置进行初始化:
引用成员变量
const成员变量
自定义类型成员(且该类没有默认构造函数时)
class A
{
public:
A(int a)
:_a(a)
{}
private:
int _a;
};
class B
{
public:
B(int a, int ref)
: _ref(ref)
//, _aobj(a)
, _n(10)
{}
private:
A _aobj;// 没有默认构造函数
int& _ref;// 引用
const int _n; // const
};
int main()
{
B b1(1, 2);
return 0;
}
3. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其显示在初始化列表中的先后次序无关
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.输出1 1
B.程序崩溃
C.编译不通过
D.输出1 随机值