1.初始化列表
初始化列表是成员变量定义的地方,有着很多的应用场景。
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
举个栗子:?
class Date
{
public:
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{}
private:
int _year = 0;//缺省值
int _month;
int _day;
};
2.默认构造函数
默认构造函数的三种情况:
三种情况都可以不使用参数进行调用。
3.必须使用初始化列表的三种情况
编译器默认生成的构造函数:内置类型不做处理,自定义类型调用它的构造函数。
3.1 自定义类型没有默认构造函数
class Time
{
public:
Time(int hour)
{
_hour = hour;
}
private:
int _hour;
};
class Date
{
public:
Date(int year, int hour)
{
_year = year;
Time t(hour);
_t = t;
}
private:
int _year;
Time _t;
};
Date实例化对象的时候会调用Date的构造函数,Date的构造函数对内置int不做处理,对自定义类型Time会调用它的构造函数。
要初始化_t对象,可以使用函数体内初始化,但是还是会走初始化列表调用Time的默认构造函数。
正确使用初始化列表:
class Time
{
public:
Time(int hour)
{
_hour = hour;
}
private:
int _hour;
};
class Date
{
public:
Date(int year, int hour)
:_t(hour)
,_year(year)
{}
private:
int _year;
Time _t;
};
使用初始化列表初始化_t对象,一个参数hour会调用它Time一个参数的构造函数,完成初始化。
3.2 const成员
const成员必须在定义的时候进行初始化,所以只能使用初始化列表。
class Date
{
public:
Date(int year, int num)
: _year(year)
, N(num)
{}
private:
int _year;
const int N;
};
3.3 引用成员
引用成员也必须在定义的时候进行初始化。
class Date
{
public:
Date(int& x)
: ref(x)
{}
private:
int& ref;
};
4.C++11新增缺省值
使用场景:没有显示给值的时候。
class Date
{
public:
Date(int year)
{}
private:
int _year = 0;//缺省值
};
初始化列表显示给值的情况下就不会走缺省:
class Date
{
public:
Date(int year)
: _year(year)
{}
private:
int _year = 0;//缺省值
};
?
总结:内置类型可以在函数体中进行初始化,也可以使用初始化列表定义初始化;上面的三种情况只能使用初始化列表定义初始化;
能使用初始化列表的话尽量使用初始化列表。
|