<四>构造函数初始化列表
示例代码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构造函数的种类和析构函数的顺序 结论:析构函数的调用顺序,跟对象的构造顺序相反,谁先构造,谁最后一个被析构. 拷贝构造函数: 注意: 等号写在下面和写在 ...
随机推荐
- C#基础_XML文件读写
使用C#对XML文件进行操作,包括生成一个XML文档,以及读取XML文档中的内容,修改某个元素中的内容 using System; using System.Collections.Generic; ...
- 一种比css_scoped和css_module更优雅的避免css命名冲突小妙招
css_scoped 与 css_module 我们知道,简单的class名称容易造成css命名重复,比如你定义一个class: <style> .main { float: left; ...
- 第六章 部署node运算节点服务
一.部署Kubelet 1.1 集群规划 主机名 角色 IP hdss7-21 kubelet 10.4.7.21 hdss7-22 kubelet 10.4.7.22 注意:部署以10.4.7.21 ...
- Linux 配置ODBC连接Oracle
在使用kdb_database_link 扩展插件连接Oracle数据库时,必须先配置ODBC,确保通过ODBC能连接Oracle数据库.以下是配置ODBC的过程. 一.安装ODBC 1.安装 [ro ...
- KingbaseES R6 集群测试job管理测试
案例说明: 本案例参考<Job And Schedule (V8R6C4)>(https://www.cnblogs.com/kingbase/p/15194227.html)单实例环境下 ...
- 用【Unity】中的【3D Object】画【数学函数】图形 —— 正弦函数... { }
效果 场景搭建 创建一个空物体,并将其命名为 "GameManager",并[Reset]它 创建一个 "Sphere",并将其[Scale]设置为(0.1,0 ...
- 【设计模式】Java设计模式 - 组合模式
Java设计模式 - 组合模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
- 一文总结高并发大数据量下MySQL开发规范【军规】
在互联网公司中,MySQL是使用最多的数据库,那么在并发量大.数据量大的互联网业务中,如果高效的使用MySQL才能保证服务的稳定呢?根据本人多年运维管理经验的总结,梳理了一些核心的开发规范,希望能给大 ...
- 从Spring中学到的【1】--读懂继承链
最近看了一些 Spring 源码,发现源码分析的文章很多,而底层思想分析的文章比较少,这个系列文章准备总结一下Spring中给我的启示,包括设计模式思想.SOLID设计原则等,涉及一些编程的基本原则, ...
- 国产PLM软件在创新实践中强势崛起
近日,"璞华PLM"先后获得微度医疗.埃特斯等多个客户的订单,即使在疫情环境下也展现出了强劲的高速增长.在产品生命周期管理(PLM,Product Lifecycle Manage ...