<四>構造函數初始化列表

示例代碼1

點擊查看代碼class CDate{public:CDate(int _year,int _month, int _day){this->year=_year;this->month=_month;this->day=_day;}private:int year;int month;int day;};class Student2{public:Student2(const char * _name , int _id, int _year,int _month ,int _day) {this.ID=_id;strcpy(name,_name);} private:charname[20];intID;CDate age;};int main(){Student2 s("zhangsan",1001,2022,1,1);return 1;}
上面代碼編譯報錯,student類對象在初始化的時候,需要初始化成員CDate,但是由于CDate有自定義的構造函數,系統找不到無參構造函數,所以報錯. 改造代碼后如下
示例代碼2
點擊查看代碼class CDate{public:CDate(int _year,int _month, int _day){this->year=_year;this->month=_month;this->day=_day;}private:int year;int month;int day;};class Student2{public:Student2(const char * _name , int _id, int _year,int _month ,int _day) : ID(_id), age(_year,_month,_day){strcpy(name,_name);} private:charname[20];intID;CDate age;};int main(){MyString s1("abcd");s1.printChar();MyString s2=s1;//執行拷貝構造s2.printChar();MyString s3("1234");s3=s1;//執行賦值函數s3.printChar();return 1;}
: ID(_id), age(_year,_month,_day) 構造函數中 冒號右邊的 叫做 構造函數初始化列表
Student2(const char * _name , int _id, int _year,int _month ,int _day) : ID(_id), age(_year,_month,_day){strcpy(name,_name);}
Student2(const char * _name , int _id, int _year,int _month ,int _day) :age(_year,_month,_day){this.ID=_idstrcpy(name,_name);
}
上面兩種方式有什么區別?: ID(_id), age(_year,_month,_day) 構造函數初始化列表 中 ID(_id) 相當于 int ID=_id; 定義同時初始化
Student2(const char * _name , int _id, int _year,int _month ,int _day) {this.ID=_id // 這種方式相當于 int ID; ID=_id; 先定義,然后再初始化.strcpy(name,_name);}
針對簡單內置的基礎數據類型這兩種方式匯編指令區別不大,但是如果是CDate類類型,如果像下面這樣Student2(const char * _name , int _id, int _year,int _month ,int _day): ID(_id) ,age(_year,_month,_day){strcpy(name,_name);}
編譯器其實會這樣做1:CDate age=Date(_year,_month,_day);//定義age對象同時做初始化,并直接指定了構造方式
如果是下面方式Student2(const char * _name , int _id, int _year,int _month ,int _day){this->ID=_id;this->age=CDate(_year,_month,_day);strcpy(name,_name);}編譯器其實會這樣做1:先創建一個 CDate 對象 ageCDate age();//使用無參構造函數2:age=CDate(_year,_month,_day);上面在第一步的時候,系統調用無參構造函數的時候就報錯了,因為沒有無參的構造函數.
【<四>構造函數初始化列表】

    推薦閱讀