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

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.mzph.cn/news/715283.shtml

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

相关文章

力扣每日一题 使二叉树所有路径值相等的最小代价 满二叉树 贪心

Problem: 2673. 使二叉树所有路径值相等的最小代价 文章目录 思路复杂度Code 思路 👨‍🏫 灵神题解 复杂度 ⏰ 时间复杂度: O ( n ) O(n) O(n) 🌎 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public int minIncrements(int …

Vue+SpringBoot打造无代码动态表单系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 动态类型模块2.2 动态文件模块2.3 动态字段模块2.4 动态值模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 动态类型表3.2.2 动态文件表3.2.3 动态字段表3.2.4 动态值表 四、系统展示五、核心代码5.1 查询档案类型5.…

(四)优化函数,学习速率与反向传播算法--九五小庞

多层感知器 梯度下降算法 梯度的输出向量表明了在每个位置损失函数增长最快的方向,可将它视为表示了在函数的每个位置向那个方向移动函数值可以增长。 曲线对应于损失函数。点表示权值的当前值,即现在所在的位置。梯度用箭头表示,表明为了增…

GEE入门篇|图像处理(三):阈值处理、掩膜和重新映射图像

阈值处理、掩膜和重新映射图像 本章前一节讨论了如何使用波段运算来操作图像, 这些方法通过组合图像内的波段来创建新的连续值。 本期内容使用逻辑运算符对波段或索引值进行分类,以创建分类图像。 1.实现阈值 实现阈值使用数字(阈值&#xf…

PXE网络启动实战(第一篇 启动WinPE)

免责声明:文中有一些图片来源自网络,如有版权请通知我删除,谢谢! 目录 一、无盘站 二、PXE启动 三、PXE启动原理 四、启动WinPE 1、服务器准备 2、客户端 3、TFTP服务 4、WinPE选择 5、具体操作: 预告 一、无盘站 网络启动最早用于无盘系统,那时的电脑只配备软…

【python量化】多种Transformer模型用于股价预测(Autoformer, FEDformer和PatchTST等)_neuralforecast

写在前面 在本文中,我们利用Nixtla的NeuralForecast框架,实现多种基于Transformer的时序预测模型,包括:Transformer, Informer, Autoformer, FEDformer和PatchTST模型,并且实现将它们应用于股票价格预测的简单例子。 …

Libero集成开发环境中Identify应用与提高

Libero集成开发环境中Identify应用与提高 Identify的安装

操作系统原理与实验——实验三优先级进程调度

实验指南 运行环境: Dev c 算法思想: 本实验是模拟进程调度中的优先级算法,在先来先服务算法的基础上,只需对就绪队列到达时间进行一次排序。第一个到达的进程首先进入CPU,将其从就绪队列中出队后。若此后队首的进程的…

多租户 TransmittableThreadLocal 线程安全问题

在一个多租户项目中,用户登录时,会在自定义请求头拦截器AsyncHandlerInterceptor将该用户的userId,cstNo等用户信息设置到TransmittableThreadLocal中,在后续代码中使用.代码如下: HeaderInterceptor 请求头拦截器 public class HeaderInterceptor implements Asyn…

阿里云国际云服务器全局流量分析功能详细介绍

进行全局流量分析时,内网DNS解析会作为一个整体模块,其他模块的边缘虚框颜色会置灰,示意作为一个整体进行全局分析,左侧Region可以展开/汇总,也可以单独选中某个Region模块进行分析(这时其他Region的流量线…

加密与安全_探索签名算法

文章目录 概述应用常用数字签名算法CodeDSA签名ECDSA签名小结 概述 在非对称加密中,使用私钥加密、公钥解密确实是可行的,而且有着特定的应用场景,即数字签名。 数字签名的主要目的是确保消息的完整性、真实性和不可否认性。通过使用私钥加…

云服务器购买教程

在购买云服务器之前,建议仔细评估自身需求和预算,并与多个云服务提供商进行比较,以确保选择到最适合的解决方案。购买云服务器的具体步骤可能因所选云服务提供商而异。以下以实际操作的方式介绍如何购买一款云服务器。 云服务器购买常见问题…

Linux进程——信号详解(上)

文章目录 信号入门生活角度的信号技术应用角度的信号用kill -l命令可以察看系统定义的信号列表信号处理常见方式概述 产生信号通过键盘进行信号的产生,ctrlc向前台发送2号信号通过系统调用异常软件条件 信号入门 生活角度的信号 你在网上买了很多件商品&#xff0…

前端面试练习24.3.2-3.3

HTMLCSS部分 一.说一说HTML的语义化 在我看来,它的语义化其实是为了便于机器来看的,当然,程序员在使用语义化标签时也可以使得代码更加易读,对于用户来说,这样有利于构建良好的网页结构,可以在优化用户体…

vue3项目中如何一个vue组件中的一个div里面的图片铺满整个屏幕样式如何设置

在Vue 3项目中,要使一个div内的图片铺满整个屏幕,你需要确保几个关键点:div元素和图片元素的样式设置正确,以及确保它们能够覆盖整个视口(viewport)。以下是一个简单的步骤和代码示例,帮助你实现…

【JavaSE】实用类——String、日期等

目录 String类常用方法String类的equals()方法String中equals()源码展示 “”和equals()有什么区别呢? StringBuffer类常用构造方法常用方法代码示例 面试题:String类、StringBuffer类和StringBuilder类的区别?日期类Date类Calendar类代码示例…

【vue3】命令式组件封装,message封装示例;(函数式组件?)

仅做代码示例;当然改进的地方还是不少的,仅作为该类组件封装方式的初步启发; 理想大成肯定是想要像 饿了么 这些组件库一样。 有的人叫这函数式组件,有的人叫这命令式组件,我个人还是偏向于命令式组件的称呼。因为以vu…

Django配置静态文件

Django配置静态文件 目录 Django配置静态文件静态文件配置调用方法 一般我们将html文件都放在默认templates目录下 静态文件放在static目录下 static目录大致分为 js文件夹css文件夹img文件夹plugins文件夹 在浏览器输入url能够看到对应的静态资源,如果看不到说明…

支持向量机算法(带你了解原理 实践)

引言 在机器学习和数据科学中,分类问题是一种常见的任务。支持向量机(Support Vector Machine, SVM)是一种广泛使用的分类算法,因其出色的性能和高效的计算效率而受到广泛关注。本文将深入探讨支持向量机算法的原理、特点、应用&…

13. Springboot集成Protobuf

目录 1、前言 2、Protobuf简介 2.1、核心思想 2.2、Protobuf是如何工作的? 2.3、如何使用 Protoc 生成代码? 3、Springboot集成 3.1、引入依赖 3.2、定义Proto文件 3.3、Protobuf生成Java代码 3.4、配置Protobuf的序列化和反序列化 3.5、定义…