初始化列表是成员变量定义的地方,有着很多的应用场景。
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
举个栗子:
- class Date
- {
- public:
- Date(int year, int month, int day)
- : _year(year)
- , _month(month)
- , _day(day)
- {}
- private:
- int _year = 0;//缺省值
- int _month;
- int _day;
- };
默认构造函数的三种情况:
三种情况都可以不使用参数进行调用。
编译器默认生成的构造函数:内置类型不做处理,自定义类型调用它的构造函数。
- 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一个参数的构造函数,完成初始化。
const成员必须在定义的时候进行初始化,所以只能使用初始化列表。
- class Date
- {
- public:
- Date(int year, int num)
- : _year(year)
- , N(num)
- {}
- private:
- int _year;
- const int N;
- };
引用成员也必须在定义的时候进行初始化。
- class Date
- {
- public:
- Date(int& x)
- : ref(x)
- {}
- private:
- int& ref;
- };
使用场景:没有显示给值的时候。
- class Date
- {
- public:
- Date(int year)
- {}
- private:
- int _year = 0;//缺省值
- };
初始化列表显示给值的情况下就不会走缺省:
- class Date
- {
- public:
- Date(int year)
- : _year(year)
- {}
- private:
- int _year = 0;//缺省值
- };
总结:内置类型可以在函数体中进行初始化,也可以使用初始化列表定义初始化;上面的三种情况只能使用初始化列表定义初始化;
能使用初始化列表的话尽量使用初始化列表。