• <四>构造函数初始化列表


    示例代码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);
     上面在第一步的时候,系统调用无参构造函数的时候就报错了,因为没有无参的构造函数.
    
  • 相关阅读:
    代码随想录67——额外题目【动态规划】:5最长回文子串、132分割回文串II、673最长递增子序列的个数
    springboot+vue“智慧食堂”设计与实现springboot002
    [附源码]java毕业设计基于实时定位的超市配送业务管理
    leetcode_2525 根据规则将箱子分类
    如何实现前后端交互
    记一次 公司.NET项目部署在Linux环境压测时 内存暴涨分析
    RP原型资源分享-购物类App
    Apache Spark UI 命令注入漏洞 CVE-2022-33891
    IP组播协议基础6(SSM Mapping)
    Mysql 学习(十 三)InnoDB的BufferPool
  • 原文地址:https://www.cnblogs.com/erichome/p/16885661.html