<四>构造函数初始化列表
示例代码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构造函数的种类和析构函数的顺序 结论:析构函数的调用顺序,跟对象的构造顺序相反,谁先构造,谁最后一个被析构. 拷贝构造函数: 注意: 等号写在下面和写在 ...
随机推荐
- OpenJudge 1.5.24 正常血压
24:正常血压 总时间限制: 1000ms 内存限制: 65536kB 描述 监护室每小时测量一次病人的血压,若收缩压在90 - 140之间并且舒张压在60 - 90之间(包含端点值)则称之为正常,现 ...
- FFT/NTT 学习笔记
0. 前置芝士 基础群论 复数 \(\mathbb C = \mathbb R[x^2+1]\) 则有 \(i^2+1=(-i)^2+1=0\),\(i \in \mathbb C - \mathbb ...
- KingbaseES R6 通过脚本构建集群案例
案例说明: KingbaseES V8R6部署一般可采用图形化方式快速部署,但在生产一线,有的服务器系统未启用图形化环境,所以对于KingbaseES V8R6的集群需采用手工字符界面方式部署,本 ...
- InnoDB_锁总结
1. 查询会对资源添加共享锁 加了共享锁的资源不可以被修改:但可以被查询(也是会在资源上再加共享锁) 2. 数据修改会对资源添加排他锁 加了排他锁的资源只能被持有这个排他锁的事务读取和修改,其他事务读 ...
- 使用kubectl管理Kubernetes(k8s)集群:常用命令,查看负载,命名空间namespace管理
目录 一.系统环境 二.前言 三.kubectl 3.1 kubectl语法 3.2 kubectl格式化输出 四.kubectl常用命令 五.查看kubernetes集群node节点和pod负载 5 ...
- 可靠的自托管「GitHub 热点速览 v.22.37」
自托管(Self-Hosted) 是很多开源项目主打的亮点:数据在手,安全我有.本周 GitHub 热点榜单上有多款自托管的项目,当中自然不能少了之前 HG 小伙伴 @makes world simp ...
- 1.云原生之Docker容器技术基础知识介绍
转载自:https://www.bilibili.com/read/cv15180540/?from=readlist
- 了解如何配置Nginx日志
设置access_log 访问日志主要记录客户端的请求.客户端向Nginx服务器发起的每一次请求都记录在这里.客户端IP,浏览器信息,referer,请求处理时间,请求URL等都可以在访问日志中得到. ...
- Redash中文版安装问题大全
Redash的安装比较复杂,由于系统环境组件版本不同,可能会出现这样那样的问题,我们把安装过程中常见问题记录如下: 1.git clone 经常提示:RPC失败,远端意外挂断.过早的文件结束符.ind ...
- GitLab 之 Git LFS 大文件存储的配置
转载自:https://cloud.tencent.com/developer/article/1010589 1.Git LFS 介绍 Git 大文件存储(Large File Storage,简称 ...