示例代码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);

上面在第一步的时候,系统调用无参构造函数的时候就报错了,因为没有无参的构造函数.

<四>构造函数初始化列表的更多相关文章

  1. C++构造函数初始化列表与赋值

    C++中类的初始化操作一般有四个部分组成: 1.构造函数初始化列表 2.构造函数体内赋值 3.类外部初始化 4.类声明时直接赋值 对于内部数据类型(char,int,float...),构造函数初始化 ...

  2. C++构造函数初始化列表与构造函数中的赋值的区别

    C++类中成员变量的初始化有两种方式:构造函数初始化列表和构造函数体内赋值. 一.内部数据类型(char,int……指针等) class Animal { public: Animal(int wei ...

  3. C++类构造函数初始化列表

    C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public:     ...

  4. C++中为什么构造函数初始化列表

    已经有个构造函数负责初始化,为什么还需要构造函数初始化表呢? 在以下三种情况下需要使用初始化成员列表:一,需要初始化的数据成员是对象的情况:二,需要初始化const修饰的类成员:三,需要初始化引用成员 ...

  5. 10.C++-构造函数初始化列表、类const成员、对象构造顺序、析构函数

    首先回忆下,以前学的const 单独使用const修饰变量时,是定义的常量,比如:const int i=1; 使用volatile const修饰变量时,定义的是只读变量 使用const & ...

  6. C++类构造函数初始化列表(转)

    构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: { public:     int a;     float b;     //构 ...

  7. const成员或者引用成员必须使用构造函数初始化列表的方式

    #include<iostream.h> class A { const int a; int b; }; void main() { A obja; }编译出现如下错误:error C2 ...

  8. c++中的构造函数初始化列表

    三种情况下,必须在构造函数初始化列表中初始化成员: 1.const成员 2.引用成员 3.没有默认构造函数的成员

  9. C++基础 (3) 第三天 构造函数 构造函数初始化列表 拷贝构造函数 析构函数 静态成员变量

    // 同类之间无私处 2构造函数 3析构函数 4构造函数的种类和析构函数的顺序 结论:析构函数的调用顺序,跟对象的构造顺序相反,谁先构造,谁最后一个被析构. 拷贝构造函数: 注意: 等号写在下面和写在 ...

随机推荐

  1. 3-14 Python处理XML文件

    xml文件处理 什么是xml文件? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 从结构上,很像HTML超文本标记语言.但他们被设计的目的 ...

  2. 一 策略模式 来自CBF4LIFE 的设计模式

    刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的. 先说这个场景中 ...

  3. 超详细 VS Code 配置C/C++教程

    写在前面 如果您使用的电脑内存 \(\leq 4 \texttt{GB}\),建议您使用Dev-C++,否则会到时内存占用爆满,体验感不佳. 网上的很多教程都不够详细,这里我把每一步.每一个操作都详细 ...

  4. C#实现HTTP访问类HttpHelper

    在项目开发过程中,我们经常会访问第三方接口,如我们需要接入的第三方接口是Web API,这时候我们就需要使用HttpHelper调用远程接口了.示例中的HttpHelper类使用Log4Net记录了每 ...

  5. 通过IIS部署Flask项目

      本文主要介绍在Windows Server 2012R2上通过IIS部署Flask项目的过程,以及对TTFB延迟大问题的思考.关于如何申请云服务器,注册(子)域名,备案,开放云服务器端口,获取SS ...

  6. Latex中也能展示动态图?

    技术背景 在学术领域,很多文档是用Latex做的,甚至有很多人用Latex Beamer来做PPT演示文稿.虽然在易用性和美观等角度来说,Latex Beamer很大程度上不如PowerPoint,但 ...

  7. Idea插件SequenceDiagram快速查看方法调用

    Idea打开setting->plugins安装插件SequenceDiagram 快速查看方法调用 在方法名上右键点击SequenceDiagram即可生成方法调用图 最上面一行为该方法涉及的 ...

  8. Prometheus 监控 Kubernetes Job 资源误报的坑

    转载自:https://www.qikqiak.com/post/prometheus-monitor-k8s-job-trap/ 昨天在 Prometheus 课程辅导群里面有同学提到一个问题,是关 ...

  9. 使用Metricbeat监控zookeeper遇到的问题

    1.metricbeat中启动自动加载模块 metricbeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled ...

  10. ES重要配置解析

    path.data和path.logs 如果您使用.zip或.tar.gz存档,则data和logs 目录是子文件夹$ES_HOME.如果这些重要文件夹保留在其默认位置,则在将Elasticsearc ...