C++:类的简单介绍(六)——初始化列表

目录

格式:

初始化之间的比较:

普通初始化的缺点:

初始化列表的优势: 

必须进行初始化的变量 

 1、const 修饰的变量

2、被&修饰的变量  引用 

3、自定义类型,且没有默认构造函数的成员变量必须走初始化列表 

小总结: 

函数体和初始化列表的灵活使用:

哪一些操作必须走函数体? 

1、检查: 

2、数组的连续赋值: 

注意事项:

坑点/面试题: 


 格式:

以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟 一个放在括号中的初始值或表达式。

class Date
{
public:
Date(int year, int month, int day)
  : _year(year)
     , _month(month)
     , _day(day)
 {}
private:
int _year;
int _month;
int _day;
};

初始化之间的比较:

普通初始化的缺点:

普通初始化对连续定义一个变量时,或者说进行多次初始化可能会出现错误,就如上图所示的_year = year 之后又有了_year = 1,面对这种情况编译器容易出现问题,所以就出现了初始化列表专门解决这种问题!

初始化列表的优势: 

1、 在初始化列表中,规定了一个变量只能出现一次! 

 2、不论是什么成员变量都会先去初始化列表内部寻找数值,哪怕初始化列表内部没有这个成员变量,如果不在声明上给予缺省值,初始化列表会随机给予随机值。

或者在初始化列表的括号内部添加数值,注意的是声明给的是缺省值,初始化列表给的是初始化数值,当没有初始化数值有缺省值时,数值在内部也没有修改时,用的就算缺省值 

3、赋值的顺序:先默认数值,在进行初始化数值部分,最后进入二次修改数值

必须进行初始化的变量 

 1、const 修饰的变量

普通的初始化无法对const 修饰的变量进行初始化! 

成员变量只是声明,只有在主函数部分定义了对象,那些声明的成员变量才会进行初始化

但是呢,有一些成员必须要在主函数部分定义,才能够进行初始化

就例如const 修饰的变量成员!因为const只有一次修改的机会,也就是初始化的那次!

2、被&修饰的变量  引用 

因为引用必须在定义的时候进行初始化! 来自引用的使用规则 :

int & c = 1;正确 但是 int &c ;错误! 

3、自定义类型,且没有默认构造函数的成员变量必须走初始化列表 

关于自定义类型的初始化列表,当自定义类型没有设置初始化列表时,自定义类型的初始化是根据它自身的默认构造函数进行初始化的,就如上图所示,类型A是有一个全缺省的默认构造函数!

自定义类型没有进行初始化,但是有默认构造函数,那么自定义类型的初始化就算默认构造函数的数值 

但是,自定义类型没有默认构造,且在初始化列表内部没有进行初始化赋值则编译器会报错! 

就如上图,并不是全缺省的参数,也没有无参的构造函数,而编译器也生成不了默认构造,所以类型A没有默认构造!

而当自定义类型没有默认构造时,可以在初始化列表中添加自定义类型的初始化值,解决自定义类型的初始化问题 

当然如果不想要自定义类型使用默认构造的数值,也可以在初始化列表上添加自定义类型所需要的初始化数值 

小总结: 

1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)

2. 类中包含以下成员,必须放在初始化列表位置进行初始化:

  • 引用成员变量
  • const成员变量
  • 自定义类型成员(且该类没有默认构造函数时) 

除了以上三类,其他的成员变量在初始化列表或者在函数体({}内部的)的使用影响都不是很大!但是还是建议使用初始化列表

函数体和初始化列表的灵活使用:

哪一些操作必须走函数体? 

1、检查: 

2、数组的连续赋值: 

 

注意事项:

  1. 初始化列表中的()内部的数值必须符合对应的参数和数值
  2. 是 先走初始化列表,在走函数体,如果有缺省值,但是没有初始化列表,并且函数体内部没有数值,那就是缺省值
  3. 而自定义类型,如果没有初始化列表,那就是走自定义类型的默认构造函数,然后再走函数体

坑点/面试题: 

按照正常的 ,给aa传值了一个1,随后1作为定义时的赋值传给了A (int a)中的a 随后,初始化_a1(a) ,拿到了a 而且a=1所以_a1 = 1 而_a2的数值来自于_a1所以_a2=1

但是答案并不是,原因是什么?

注意看,这里传值的时候,先传的是_a2

这里就算初始化列表比较坑的地方,就算它传值的顺序是声明时候的顺序,而不是初始化列表上面定义时变量的顺序

 


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/372199.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT6调用音频输入输出(超详细)

目录 一、QT6音频调用与QT5的区别 1.QAudioSource代替QAudioInput类 2.QAudioSink代替QAudioOutput类 二、音频操作中Push和Pull的区别 三、依托于Websocket实现实时对讲机 1.AudioIputDevices类 2.AudioOutputDevices类 3.实现的AudioHandler类完整内容 本人实际是要完…

作为一个27岁的人,学习单片机然后进入这行的可能性大吗?

作为一个27岁的人,学习单片机然后进入这行的可能性大吗?有c语言基础。? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「c语言的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“…

python-分享篇-小猪佩奇

文章目录 代码效果 代码 # coding:utf-8 import turtle as tt.pensize(4) t.hideturtle() t.colormode(255) t.color((255,155,192),"pink") t.setup(840,500) t.speed(10)#鼻子 t.pu() t.goto(-100,100) t.pd() t.seth(-30) t.begin_fill() a0.4 for i in range(12…

python爬虫概念及介绍

1. 什么是互联网爬虫? 解释 1 :通过一个程序,根据 Url ( http : // www . taobao . com ) 进行爬取网页,获取有用信息 解释 2:使用程序模拟浏览器,去向服务器发送请求,获取响应信息 2. 爬虫核…

C++病毒【永久性】

我最近发现&#xff0c;我2024年后就再也没有更新过 C#沙雕程序了。 今天我想通了&#xff0c;我要再更几期关于C#沙雕程序的文章。 开始做&#xff01; 这一次就直接上代码蚌&#xff01; 不用任何特定头文件。 #include <bits/stdc.h> #include <iostream> #…

【Java基础_02】Java变量

【Java基础_02】Java变量、运算符、程序控制结构 文章目录 1 变量1.1 程序中“”号的使用1.2 数据类型1.3 整数类型1.3.1 整数类型的分类1.3.2 整型的使用细节 1.4 浮点类型1.4.1 浮点型的分类1.4.2 浮点类型使用细节 1.5 字符类型1.5.1 字符类型使用细节1.5.2 字符类型本质1.5…

幻兽帕鲁专用服务器,多人游戏(专用服务器)搭建

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

网络安全产品之准入控制系统

文章目录 一、什么是准入控制系统二、准入控制系统的主要功能1. 接入设备的身份认证2. 接入设备的安全性检查 三、准入控制系统的工作原理四、准入控制系统的特点五、准入控制系统的部署方式1. 网关模式2. 控制旁路模式 六、准入控制系统的应用场景七、企业如何利用准入控制系统…

程序员为什么不喜欢关电脑,这回答很霸道!

在大家的生活中&#xff0c;经常会发现这样一个现象&#xff1a;程序员经常不关电脑。 至于程序员不关电脑的原因&#xff0c;众说纷纭。 其中这样的一个程序员&#xff0c;他的回答很霸道&#xff1a; “因为我是程序员&#xff0c;我有权选择不关电脑。我需要在任何时候都能够…

python创建udf函数步骤

一、目标 实现一个函数&#xff0c;传入两个datetime类型的参数&#xff0c;返回double类型的工作日天数 二、思路 如何计算差值&#xff1f; 如果开始时间和结束时间在同一天&#xff1a;实现同 datediff(end, start, ‘ss’) / 86400.0 如果开始时间和结束时间在不同天&am…

【教程】Python代码混淆工具,Python源代码保密、加密、混淆

引言 Python作为一种高级脚本语言&#xff0c;便捷的语法和丰富的库使它成为众多开发者的首选。然而&#xff0c;有时候我们希望保护我们的Python源代码&#xff0c;避免被他人轻易获取和篡改。为了实现这一目标&#xff0c;我们可以采取代码混淆的技术手段。本文将介绍Python…

vue3项目打包移除console.log()打印

一、安装terser&#xff08;不安装打包会报错&#xff0c;安装过后无需引入直接使用&#xff09; npm install terser --save-dev二、在vite.config.ts里面使用 build: {minify: "terser",terserOptions:{compress:{drop_console: true,drop_debugger: true,}}}

Vue3.0(三):Vue组件化深入理解

Vue组件化深入理解 生命周期 每个组件都可能经历 创建、挂载、更新、卸载等一系列过程 在每个阶段&#xff0c;我们可能会添加一些属于自己的逻辑代码 在Vue中&#xff0c;生命周期通过生命周期函数实现 生命周期函数实际上就是回调函数&#xff0c;在某个时间会被Vue源码调…

零售的这个销售模式,太震撼了!

随着科技的飞速发展&#xff0c;新零售模式正逐渐改变着传统零售业的面貌。在这个数字化时代&#xff0c;自动售货机作为新零售的一部分&#xff0c;正以其便捷、智能的特性&#xff0c;为商家和消费者带来全新的购物体验。 客户案例 智能便利店 传统便利店运营面临高租金、人…

【STM32+HAL库+CubeMX】UART轮询收发、中断收发、DMA收发方法及空闲中断详解

&#xff08;转载&#xff09;原文链接&#xff1a;https://blog.csdn.net/qq_39344192/article/details/131470735 1. 什么是UART&#xff1f; UART是一种异步串行通信接口&#xff0c;常用于通过串口与外部设备进行通信。它通过发送和接收数据帧来实现数据传输&#xff0c;使…

保护个人信息安全,避免成为“互联网中的裸泳者”

⚽️ 一、互联网中的裸泳者&#x1f3c0; 二、代理 IP 的应用 - 解锁无限可能⚾️ 三、代理 ip 的几种类型 3.1 动态住宅代理&#xff08;Rotating Residential Proxy&#xff09;3.2 静态住宅代理&#xff08;Static Residential Proxy&#xff09;3.3 动态长效ISP&#xff08…

Nucleosome, Recombinant Human, H2BK120ub1 dNuc, Biotinylated

EpiCypher&#xff08;国内授权代理商欣博盛生物&#xff09;是一家为表观遗传学和染色质生物学研究提供高质量试剂和工具的专业制造商。EpiCypher生产的在E. coli中表达的重组人单核小体(组蛋白H2A、H2B、H3和H4各2个;accession numbers:H2A-P04908;H2B-O60814;H3.1-P68431;H4…

Python实现排序算法

目录 一&#xff1a;快速排序 二&#xff1a;合并排序 三&#xff1a;冒泡排序 四&#xff1a;插入排序 五&#xff1a;选择排序 一&#xff1a;快速排序 def quicksort(arr): if len(arr) < 1: return arr pivot arr[len(arr) // 2] le…

【Docker】入门到精通(常用命令解读)

一、准备工作 1.配置Docker的yum库 首先要安装一个yum工具 yum install -y yum-utils安装成功后&#xff0c;执行命令&#xff0c;配置Docker的yum源&#xff1a; yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo2.安装Docker 执…

python创建pdf文件

目录 一&#xff1a;使用reportlab库 二&#xff1a;使用使pdf库 在Python中生成PDF文件可以使用多种库&#xff0c;其中最常用的是reportlab和fpdf。以下是使用这两个库生成PDF文件的示例代码&#xff1a; 一&#xff1a;使用reportlab库 1&#xff1a;写入文字信息 from r…