<四>构造函数初始化列表
示例代码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);
上面在第一步的时候,系统调用无参构造函数的时候就报错了,因为没有无参的构造函数.
<四>构造函数初始化列表的更多相关文章
- C++构造函数初始化列表与赋值
C++中类的初始化操作一般有四个部分组成: 1.构造函数初始化列表 2.构造函数体内赋值 3.类外部初始化 4.类声明时直接赋值 对于内部数据类型(char,int,float...),构造函数初始化 ...
- C++构造函数初始化列表与构造函数中的赋值的区别
C++类中成员变量的初始化有两种方式:构造函数初始化列表和构造函数体内赋值. 一.内部数据类型(char,int……指针等) class Animal { public: Animal(int wei ...
- C++类构造函数初始化列表
C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public: ...
- C++中为什么构造函数初始化列表
已经有个构造函数负责初始化,为什么还需要构造函数初始化表呢? 在以下三种情况下需要使用初始化成员列表:一,需要初始化的数据成员是对象的情况:二,需要初始化const修饰的类成员:三,需要初始化引用成员 ...
- 10.C++-构造函数初始化列表、类const成员、对象构造顺序、析构函数
首先回忆下,以前学的const 单独使用const修饰变量时,是定义的常量,比如:const int i=1; 使用volatile const修饰变量时,定义的是只读变量 使用const & ...
- C++类构造函数初始化列表(转)
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: { public: int a; float b; //构 ...
- const成员或者引用成员必须使用构造函数初始化列表的方式
#include<iostream.h> class A { const int a; int b; }; void main() { A obja; }编译出现如下错误:error C2 ...
- c++中的构造函数初始化列表
三种情况下,必须在构造函数初始化列表中初始化成员: 1.const成员 2.引用成员 3.没有默认构造函数的成员
- C++基础 (3) 第三天 构造函数 构造函数初始化列表 拷贝构造函数 析构函数 静态成员变量
// 同类之间无私处 2构造函数 3析构函数 4构造函数的种类和析构函数的顺序 结论:析构函数的调用顺序,跟对象的构造顺序相反,谁先构造,谁最后一个被析构. 拷贝构造函数: 注意: 等号写在下面和写在 ...
随机推荐
- RestTemplate用法
RestTemplate 用法 RestTemplate简介 RestTemplate 是一个同步的web http客户端请求模板工具,spring框架做的抽象模板, 常见的http客户端请求工具有: ...
- gem5使用记录,gem5入门学习和环境配置。
工作需要,对gem5有点兴趣,准备自己研究一下,gem5新手刚开始入门学习,主要参考了网上其他前人的文章和官方说明. 目前网上的前人文章有部分有点太早了,稍显过时,我结合自己的经历来整理一下流程. g ...
- Python数据科学手册-机器学习介绍
机器学习分为俩类: 有监督学习 supervised learning 和 无监督学习 unsupervised learning 有监督学习: 对数据的若干特征与若干标签之间 的关联性 进行建模的过 ...
- 前端必读3.0:如何在 Angular 中使用SpreadJS实现导入和导出 Excel 文件
在之前的文章中,我们为大家分别详细介绍了在JavaScript.React中使用SpreadJS导入和导出Excel文件的方法,作为带给广大前端开发者的"三部曲",本文我们将为大家 ...
- Elasticsearch API响应的一些常用选项
我们可以点击Elasticsearch API以获取所需的响应,但是如果要修改API响应,以便我们更改显示格式或过滤掉某些字段,然后我们可以将这些选项与查询一起应用. 有一些常见的选项可以适用于API ...
- Solutions:Elastic workplace 搜索:随时随地搜索所有内容 (一)
- 几篇关于MySQL数据同步到Elasticsearch的文章---第四篇:使用go-mysql-elasticsearch同步mysql数据库信息到ElasticSearch
文章转载自: https://www.cnblogs.com/dalaoyang/p/11018541.html 1.go-mysql-elasticsearch简介 go-mysql-elastic ...
- 2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest (XXI Open Cup, Grand Prix of Belarus) 题解
题目列表 C. Brave Seekers of Unicorns D. Bank Security Unification G. Biological Software Utilities I. B ...
- Js实现一键复制小功能
function copyToClipboard(textToCopy) { // navigator clipboard 需要https等安全上下文 if (navigator.clipboard ...
- python基础--简单数据类型预览
为了适应更多的使用场景,将数据划分为多种类型,每种类型都有各自的特点和使用场景, 帮助计算机高效的处理和展示数据.(比如数字用于数学运算.字符串用于信息传递.页面文字展示等) 1.数字类型 整型 ...