1.再谈构造函数
1.1构造函数的组成
构造函数包括函数体赋值与初始化列表初始化。
1.2函数体赋值
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化, 构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体 内可以多次赋值。
1.3初始化列表
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
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.先走初始化列表(初始化),再走函数体(赋值)。
3.不管写不写,每个成员都要走初始化列表。及我们会在初始化列表中去初始所有的成员,对于自定义类型的成员,会去调用它的默认构造函数,对于内置类型不做处理,所以能用初始化列表就用初始化列表。
4.初始化列表走的顺序只与成员的声明顺序有关。所以建议初始化列表的顺序与声明的顺序保持一致。
5.每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)。
6.C++11支持给缺省值,这个缺省值是给初始化列表用的,如果显示给值了,就不用这个缺省值。
必须在初始化列表位置进行初始化的三种情况:
1.引用成员变量(引用也是只有在定义的地方才能初始化)
2.const成员变量(const成员只有在定义时才能初始化)
3.自定义类型成员(且该类没有默认构造时)
2.初始化列表需要与函数体混合着用
比如下面的情况
有些初始化需要去调用函数,需要用到函数体。