<四>构造函数初始化列表
  xs9mrAcZVTZn 2023年11月02日 29 0
C++

示例代码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);
 上面在第一步的时候,系统调用无参构造函数的时候就报错了,因为没有无参的构造函数.
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  8Tw5Riv1mGFK   2024年05月01日   80   0   0 C++
  BYaHC1OPAeY4   2024年05月08日   57   0   0 C++
  yZdUbUDB8h5t   2024年05月05日   43   0   0 C++
  oXKBKZoQY2lx   2024年05月17日   57   0   0 C++
xs9mrAcZVTZn