一、什么是初始化列表
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟
一个放在括号中的初始值或表达式。
class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}
private:int _year;int _month;int _day;
};
二、使用初始化列表的原因
使用初始化列表的原因主要有两点:(1)在某些情况下我们不得不使用初始化列表;(2)提高效率。
Attention!!!
1.每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
2.类中包含以下成员,必须放在初始化列表位置进行初始化:
- 引用成员变量
- const成员变量
- 自定义类型成员(且该类没有默认构造函数时)
class A
{
public:A(int a):_a(a){}
private:int _a;
};
class B
{
public:B(int a, int ref):_aobj(a),_ref(ref),_n(10){}
private:A _aobj; // 没有默认构造函数int& _ref; // 引用const int _n; // const
};
class Time
{
public:Time(int hour = 0):_hour(hour)
{cout << "Time()" << endl;
}
private:
- 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,
一定会先使用初始化列表初始化。
class Time
{
public:Time(int hour = 0):_hour(hour)
{cout << "Time()" << endl;
}
private:int _hour;
};
class Date
{
public:Date(int day)
{}
private:int _day;Time _t;
};
int main()
{Date d(1);
}
- 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后
次序无关
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();
}
//D
A.输出1 1
B.程序崩溃
C.编译不通过
D.输出1 随机值