首页后端开发其他后端知识四构造函数初始化列表

四构造函数初始化列表

时间2023-04-04 13:56:01发布访客分类其他后端知识浏览1612
导读:示例代码1 点击查看代码 class CDate{ public: CDate(int _year,int _month, int _day { this->year=_year; th...

示例代码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);
上面在第一步的时候,系统调用无参构造函数的时候就报错了,因为没有无参的构造函数.

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: 四构造函数初始化列表
本文地址: https://pptw.com/jishu/1071.html
php数据配置文件 php数据库配置文件在哪里 五关于类的各类成员

游客 回复需填写必要信息