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

示例代碼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:
     char  name[20];
     int   ID;
     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:
     char  name[20];
     int   ID;
     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=_id
strcpy(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 對象 age CDate age();//使用無參構造函數
2:age=CDate(_year,_month,_day);
上面在第一步的時候,系統調用無參構造函數的時候就報錯了,因為沒有無參的構造函數.