目录深度构造函数1. 初始化列表2. 成员变量声明位置给缺省值3. 初始化顺序问题深度构造函数学习了构造函数和析构函数等等这些比较简单的基础函数后对于构造有有关比较简单的了解。对于初始化除了缺省值和传参之外进行初始化还有两种方式1. 初始化列表2. 成员变量声明位置给缺省值C11支持1. 初始化列表初始化列表的定义初始化列表就是再构造函数的函数名传参括号后和“{”之前中间进行的列表就是初始化列表都时以冒号开始要初始化的对象只能用括号括起来具体操作看代码展示class Date { public: Date(int year 1, int month 1, int day 1);//构造函数缺省 private: int _year; int _month; int _day; }; Date::Date(int year, int month, int day) //初始化列表 : _year (year) _month (month), _day (day) { //... }初始化列表的特有的功能有一些特殊的变量需要声明时就需要进行初始化const int int 等等但是普通的传参和缺省是无法做到的所以就需要初始列表操作。#includeiostream using namespace std; //时间类 class Time { public: Time(int hour) :_hour(hour) { cout Time() endl; } private: int _hour; }; //日期类 class Date { public: Date(int x, int year 1, int month 1, int day 1) :_year(year),_month(month),_day(day),_t(12),_ref(x),_n(1) { // error C2512: “Time”: 没有合适的默认构造函数可⽤ // error C2530 : “Date::_ref” : 必须初始化引⽤ // error C2789 : “Date::_n” : 必须初始化常量限定类型的对象 } void Print() const { cout _year - _month - _day endl; cout _ref - _n endl; } private: int _year;// 年 int _month;// 月 int _day;// 日 Time _t; // 没有默认构造 int _ref; // 引⽤ const int _n; // const }; int main() { int i 0; Date d1(i); d1.Print(); return 0; }在初始化列表中就可以充分的初始化int 和const int 这种比较特殊的初始化内容。2. 成员变量声明位置给缺省值class Date { private: int _year 2000;//成员缺省初始化 int _month 10; int _day 10; Time _t; // 没有默认构造 int _ref; // 引⽤ const int _n; // const };就是在类的成员变量的后面进行一个类似缺省参数的操作3. 初始化顺序问题既然学了这么多的初始化方式但如果在代码中的时候初始化终究都是只有一次初始化那么在编译器中肯定还是优先级的。补充初始化优先按照成语顺序来。与初始化列表的顺序无关过程public: Date(int x, int year 1, int month 1, int day 1) : //_year(year), //_month(month), //_day(day), _t(12), _ref(x), _n(1) { _year year; } void Print() const { cout _year - _month - _day endl; cout _ref - _n endl; } private: const int _n 20; // const int _year 2000; int _month 10; int _day 10; Time _t; // 没有默认构造 int _ref; // 引⽤ };1在调用传参到类中的所有变量先变成随机值引用的化就是无法识别2按类的声明顺序初始化有初始列表就调用初始化列表没有就调用成员缺省值。看到这里_n 的成员缺省是20但还是调用初始化列表的1。调用成员缺省的20003遇到类相关的就调用对应的类相关的构造函数4开始调用函数内的代码以为_year year ,所有_ year 变成 1最后输出内容总结初始化优先按照成语顺序来。与初始化列表的顺序无关1优先级最高的是初始化链表2次优先级是成员变量缺省值3最后就传参和缺省参数。就是开始调用构造函数内的代码段有初始化就初始化不然直接全部都是随机值