首页 > 其他分享 ><四>构造函数初始化列表

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

时间:2022-11-13 16:33:39浏览次数:52  
标签:初始化 name int 列表 year id month day 构造函数

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

标签:初始化,name,int,列表,year,id,month,day,构造函数
From: https://www.cnblogs.com/erichome/p/16885661.html

相关文章

  • 想在 Visual Studio Code 里进行 ABAP 开发,需要安装的扩展列表
    想在VisualStudioCode里进行ABAP开发,需要安装这些VSCode扩展:ABAPRemoteFileSystemABAPSyntaxHighlightingABAPCDSLanguageSupportABAPSnippets安......
  • CSP 202203-1 未初始化警告 C++
    1#include<iostream>2#include<vector>3intmain(){4intx{},y{};5std::cin>>x>>y;//读入第一行6std::vector<std::vector<int>>k......
  • easyexcel 2.2.6 新版本以列表的形式读取 Excel
    使用步骤:注:讲述使用EasyExcel的读取Excel数据列表的案例,项目基于springboot+maven模式。1、引入EasyExcel依赖包,文章以easyexcel2.2.6为基础。<dependenc......
  • 02-类与对象 进行试验--Java字段初始化的规律
    1.类的构造方法(1)“构造方法”,也称为“构造函数”,当创建一个对象时,它的构造方法会被自动调用。构造方法与类名相同,没有返回值。(2)如果类没有定义构造函数,Java编译器......
  • Redis列表(List)
    单键多值Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。1.1.1.   常用命令lpush/rpush<key><value1><value......
  • 洛谷P5309 Ynoi 2011 初始化 题解
    题面。我也想过根号分治,但是题目刷得少,数组不敢开,所以还是看题解做的。这道题目要用到根号分治的思想,可以看看这道题目和我的题解。题目要求处理一个数组a,支持如下操作......
  • <二>掌握构造函数和析构函数
    构造函数和类名相同,可以带参数,参数可以有多个构造函数执行完成后,内存开辟完成,同时可以完成初始化工作.析构函数~Test();析构函数可以自己调用,析构函数调用后,对......
  • 静态初始化块
    构造方法用于对象的普通属性初始化。静态初始化块,用于类的初始化操作,初始化静态属性。在静态初始化块中不能直接访问非static成员。......
  • C# 之静态构造器与静态字段初始化器
    publicclassTest{///<summary>///静态字段初始化器会在调用静态构造器前运行。///如果类型没有静态构造器,字段会在类型被使用前或运......
  • pinia初始化
    pinia安装官网:https://pinia.vuejs.org/zh/introduction.html安装:npmipinia-S//main.tsimport{createApp}from'vue'import{createPinia}from'pinia'......