【c++】构造函数(下)——初始化列表

news2024/9/23 15:31:00

Hello,everybody!构造函数的内容比较多,语法还有些复杂。我分成了两篇文章进行讲解,大家在看过构造函数(上)后再来看这篇文章更容易理解哟!

1.初始化列表的格式

类似这种格式,在初始化列表中第一行用冒号开头,剩下的用逗号开头。初始化列表结束后,后面才是函数体。

初始化列表也是初始化类中成员的一种方式,就目前这个例子感觉在初始化列表中初始化与在函数体中初始化没啥区别。咱们还无法窥探其中的奥妙。

不过我先给大家一个建议:

能用初始化列表,就用初始化列表,用不了的时候再考虑用函数体初始化。

下面开始介绍初始化列表独特的地方:

1.其实初始化列表才是类中成员定义的地方,初始化列表优先于函数体运行,等程序走到函数体时,类中的所有成员都已经被定义过了。这就意味着初始化后不可被修改的成员和定义时必须初始化的成员等只能通过初始化列表初始化。例如被const修饰过的成员和引用等。

被const修饰过的x就不能通过函数体初始化,因为x在初始化列表中已经定义并初始化过了(尽管我们没有写出来)。在函数体中做的工作是赋值,修改。

还有一个就是引用,因为引用要求在定义的时候必须初始化。

看过以上两个例子可以知道,就算初始化列表中什么都不写,它也会帮我们把类中的成员都定义好,然后我们在函数体中给成员修改,赋值。如果在初始化列表中直接完成初始化,就省去了在函数体中修改数据这一步骤,程序效率相对来说要高一点。

另外要补充一点:

既然初始化列表是成员定义的地方,那么同一成员变量只能被定义一次,不能被多次定义。

2.当类中的成员变量有自定义类型时

在上文中,我们提到:引用成员变量和const成员变量只能在初始化列表中初始化。

这里补充最后一条:自定义类型成员也只能在初始化列表中初始化。

在构造函数(上)中,我们提到:对于编译器默认生成的构造函数,在对象实例化后对于内置类型不做处理,对于自定义类型回去调用它的默认构造函数。

在这个例子中,Date类型的成员中有一个A类型,在对象实例化后编译器直接调用了A的默认构造函数看似好像没啥问题,实际上和前两行的黑体字表达的意思有所出入。

注意:在Date类型中,我们已经把默认构造函数写出来了,这个构造函数不是编译器默认生成的为什么还会回去调用A中的默认构造函数呢?

实际上是"大道同归"。编译器默认生成的构造函数也好,自己写的构造函数也好,在调用函数体前,都会先运行初始化列表,在初始化列表中不管我们写与不写,都会帮我们定义好A _aa。在定义的过程中就相当于对象实例化,自然就会调用A中的默认构造函数!

那问题来了!如果A中没有默认构造函数呢?比如,我把缺省参数去掉:

这时我们就需要在Date中构造函数的初始化列表中手动给A _aa初始化,否则会因为A中没有可以调用的默认构造函数而报错。

3.初始化列表与函数体搭配运用

除了引用成员变量,const成员变量和类成员变量,其他成员变量的初始化既可以在初始化列表中,也可以在函数体中,但建议在初始化列表中,原因在上文已经介绍的很清楚了。

虽然初始化列表的功能很强大,但也有它无法完成的任务,这时就需要和函数体配合使用:

如果需要动态开辟空间,在初始化列表中可以完成。但是空间是否开辟成功需要进行检查,初始化列表就无法胜任了,需要搭配函数体使用。再比如一个数组的初始化需要用到循环语句,初始化列表也是无法完成的!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无线通信中AM,FM,PM与之相关的调制类型说明,例如F2D,F1W,F3E等

常见例子: 广播 A3E或A3E G 普通幅度调制用于低频和中频AM广播F8E,F8E H 用于VHF上的无线电传输的FM广播,以及模拟电视传输的音频分量。 由于通常使用用于立体声和RDS的导频音(子载波),使用指示符“8”…

C++ 原子变量

概述 C中原子变量(atomic)是一种多线程编程同步机制,它能够确保对共享变量的操作在执行时不会被其他线程的操作干扰,atomic是提供一种生成原子操作数的一种机制,避免竞态条件(race condition)和死锁(deadlock)等问题。…

生成式AI与仿真

仿真模型是物理对象、系统或过程的虚拟表示,可预测其在不同场景中的行为和性能。 如今,仿真模型广泛应用于各行各业,以优化流程、为决策提供信息并创建数字孪生。 几十年来,仿真模型一直被用来对复杂的系统和过程进行建模。 这些…

Python 编辑工具 Jupyter notebook

Jupyter notebook Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。——Jupyter Notebook官方介绍 官网:Project Jupyter | Home Jupyter Notebook 是一个开源的交互式计算环境&#…

selenium爬虫

方法选择和安装包 在动态网页并且登陆过程中不需要进行过于复杂的密码验证的时候使用selenium会非常的方便 安装准备过程也相对简单: 下载对应版本的chromedriver并且通过如下代码找到路径下载到python所在的目录: import sysprint(sys.executable) …

技巧 文本编辑器 B列每一行数据换行合并到A列中

一. 需求背景 ⏹A列是我们制作的日文版歌词,B列是中文版译文歌词 现在想让B列的每一行歌词,按下图箭头所示插入到A列的每一行后面 二. 通过文本编辑器的替换功能解决 将Excel中的A和B列的数据复制粘贴到文本编辑器中Excel中的列和列之前是通过Tab来分隔…

代码随想录算法训练营29期|day64 任务以及具体安排

第十章 单调栈part03 有了之前单调栈的铺垫&#xff0c;这道题目就不难了。 84.柱状图中最大的矩形class Solution {int largestRectangleArea(int[] heights) {Stack<Integer> st new Stack<Integer>();// 数组扩容&#xff0c;在头和尾各加入一个元素int [] ne…

Aigtek高精度电流源仪器设计规范

高精度电流源仪器是一种用于产生和测量精确电流的设备&#xff0c;广泛应用于电子、通信、自动控制等领域。为了确保仪器的性能和可靠性&#xff0c;设计过程中需要遵循一些规范。 电流源仪器的设计要注重稳定性。稳定性是保证仪器输出电流精度的关键因素。设计过程中应选择高精…

数据恢复软件哪个好?推荐10款好用的数据恢复软件

在数字化时代&#xff0c;数据的安全性和可恢复性变得至关重要。由于各种原因&#xff0c;如设备故障、误删、病毒攻击等&#xff0c;我们可能会面临数据丢失的风险。为了应对这种情况&#xff0c;市场上涌现出许多数据恢复软件。但是哪款软件更适合你的需求呢&#xff1f;下面…

Python 教学平台,支持“多班教学”的课程授课方式|ModelWhale 版本更新

龙行龘龘、前程朤朤&#xff0c;ModelWhale 新一轮的版本更新&#xff0c;期待为大家带来更优质的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; 新增 课程&#xff08;包括课件、作业、算力&#xff09;按班级管理&#xff08;团队版✓ …

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的行人车辆检测与计数(Python+PySide6界面+训练代码)

摘要&#xff1a;开发行人车辆检测与计数系统对于提升城市交通管理和监控系统的效率至关重要。本篇博客详细介绍了如何利用深度学习构建一个行人车辆检测与计数系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并结合了YOLOv7、YOLOv6、YOLOv5…

java找工作之JavaWeb(一)

JavaWeb 一个web应用有多部份组成&#xff08;静态web&#xff0c;动态web&#xff09; html&#xff0c;css&#xff0c;jsjsp&#xff0c;servletjava程序jar包配置文件(Properties) web应用程序编写完毕后&#xff0c;若想提供给外界访问&#xff0c;需要一个服务器来统一…

值得一试的五大AI编程助手

AI编程助手已成为开发过程中不可缺少的一部分&#xff0c;因为它们可以协助代码生成、理解、项目搜索以及使用提示或代码执行各种任务。甚至像谷歌Colab和Deepnote这样的云IDE平台也提供AI辅助编程&#xff0c;可以帮助您生成代码并解决问题。 本文将介绍5款值得一试的AI编程助…

效率真高!众安保险数据分析岗(实习)面试通过了,分享一下面试经验!

最近&#xff0c;我们社群组织了一场技术&面试讨论会&#xff0c;邀请了一些互联网大厂同学、参加社招和校招面试的同学&#xff0c;针对新手如何入门数据分析、机器学习算法、该如何备战、面试常考点分享等热门话题进行了深入的讨论。 基于社群的讨论&#xff0c;今天我整…

ApplicationContext容器

ApplicationContext容器 1.概述 ApplicationContext接口代表了一个Spring容器,它主要负责实例化、配置和组装bean。ApplicationContext接口间接继承了BeanFactory接口,相较于BeanFactory一些基本的容器功能,ApplicationContext接口是在BeanFactory接口基础上进行了扩展,增…

Snagit 2024:让你的屏幕活动瞬间变得生动有力 mac/win版

Snagit 2024 屏幕录制与截图软件是一款功能强大的工具&#xff0c;专为现代用户设计&#xff0c;以满足他们在工作、学习和娱乐中对屏幕内容捕捉和分享的需求。这款软件结合了屏幕录制和截图功能&#xff0c;为用户提供了一种高效、便捷的方式来捕捉屏幕上的精彩瞬间。 Snagit…

HelixToolKit的模型旋转操作

前面加载了模型以后&#xff0c;鼠标拖动和缩放比较好操作&#xff1b;但是旋转似乎没有&#xff0c; 操作了一阵&#xff0c;也不是没有&#xff0c;应该是还不熟悉&#xff1b; 旋转的指示器在右下角&#xff0c;现在U面看到正面&#xff0c; 想看一下模型的背面&#xff0…

压缩视频大小的软件有哪些?5款软件推荐

压缩视频大小的软件有哪些&#xff1f;随着高清摄像设备的普及和网络速度的不断提升&#xff0c;视频文件变得越来越庞大&#xff0c;动辄数百兆甚至数GB的大小常常让用户在分享和存储时感到头疼。幸运的是&#xff0c;市面上有许多优秀的视频压缩软件可以帮助我们轻松应对这一…

鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?

“2024年是原生鸿蒙的关键一年&#xff0c;我们要加快推进各类鸿蒙原生应用的开发&#xff0c;集中打赢技术底座和三方生态两大最艰巨的战斗。”这是余承东在新年信中表达的决心。 随后在1月18日举行的鸿蒙生态千帆启航仪式上&#xff0c;华为宣布 HarmonyOS NEXT 鸿蒙星河版系…