一、初始化列表
1.之前实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表。
其使用方式:以一个冒号开始,接着以一个逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式。
2.每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量定义的地方
3.以下成员变量必须放在初始化列表位置进行初始化,否则编译会报错
·引用成员变量
·const成员变量
·没有默认构造的类类型变量
class Time { public: Time(int hour )//没有默认构造,必须主动传参 : _hour(hour) { cout << "Time()" << endl; } private: int _hour; }; class Date { public: Date(int& x, int year = 2025, int month = 2, int day = 11) :_year(year) ,_month(month) ,_day(day) /*,_t(12) ,_ret(x) ,_n(1)*/ //如果不在初始化列表初始化就会报错 { } void Print()const { cout << "_year" << "/" << "_month" << "/" << "_day" << endl; } private: int _year; int _month; int _day; Time _t; //没有默认构造 int& _ret; //引用 const int _n; //const }; int main() { int i = 0; Date d1(i); d1.Print(); return 0; }
4.尽量使用初始化列表初始化,因为那些你不在初始化列表初始化的成员也会走初始化列表。(每个成员都要走初始化列表)
·若这个成员在声明位置给了缺省值,初始化列表会用这个缺省值初始化。
class Date { public: private: //这些个缺省值是给初始化列表的, // 如果初始化列表没有显示初始化,就会用这个缺省值初始化 int _year=2025; int _month=2; int _day=11; Time _t=1; int* _ret=(int*)malloc(10); const int _n=1; };