【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 …

ai智能电销机器人搭建需要注意什么?人工智能电话机器人源码技术

电销机器人的出现,让越来越多的企业意识到了电销机器人的好处,不仅提高了工作效率,也让我们更省心,但我们在选择电话机器人的时候应该注意看语音识别技术、看话术模板制造、还要看公司研制才能等。 一、电销机器人的选择要素 1、看…

拿金币 蓝桥杯ALGO1006 有一个N x N的方格,问如何走才能拿到最多的金币

问题描述 有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。 输入格式 第一行输入一个正整数n。   以下n行描述该方格。金币数保证是不超过…

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.…

通过vue实现左侧树状右侧的组件

随着后台管理项目的开发&#xff0c;左侧树状&#xff0c;右侧则为列表的需求越来越多&#xff0c;还有就是拆分该数组&#xff0c;只展示其中一个对象等需求。废话不多说&#xff0c;直接上代码 <template><div><el-row :gutter"20"><el-col …

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

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

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

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

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

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

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

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

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

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

小米手机相册闪退

环境&#xff1a; HyperOS 1.0 小米手机分身 处理步骤&#xff1a; 1&#xff09;清理相册缓存&#xff1a;设置->应用设置->相册->清理数据->清除缓存&#xff08;注意&#xff1a;别点清理全部数据&#xff1b;这个方法对我没用&#xff09;。 2&#xff09;卸…

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

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

多租户 TransmittableThreadLocal 线程安全问题

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

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

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

【Java面试题】Redis的用途

以下是一些常见的用途 1.缓存 Redis 可以用作缓存系统&#xff0c;&#xff0c;将频繁访问的数据存储在内存中&#xff0c;从而加快数据访问速度&#xff0c;减少对数据库的访问压力。 2.消息队列 Redis 支持发布/订阅模式和列表数据结构&#xff0c;可以用作消息队列系统的…

道可云元宇宙每日资讯|厦门首个元宇宙办税大厅启用

道可云元宇宙每日简报&#xff08;2024年3月1日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 中国军号元宇宙发布会即将举行 近日&#xff0c;解放军新闻传播中心中国军号即将正式上线。中国军号元宇宙发布会也将在“云端”与您见面。全方位展现解放军新闻传播…

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

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

云服务器购买教程

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

【数仓】zookeeper软件安装及集群配置

相关文章 【数仓】基本概念、知识普及、核心技术【数仓】数据分层概念以及相关逻辑【数仓】Hadoop软件安装及使用&#xff08;集群配置&#xff09;【数仓】Hadoop集群配置常用参数说明 一、环境准备 准备3台虚拟机 Hadoop131&#xff1a;192.168.56.131Hadoop132&#xff…

【Spring连载】使用Spring Data访问 MongoDB----对象映射之基于类型的转换器

【Spring连载】使用Spring Data访问 MongoDB----对象映射之基于类型的转换器 一、自定义转换二、转换器消歧(Disambiguation)三、基于类型的转换器3.1 写转换3.2 读转换3.3 注册转换器 一、自定义转换 下面的Spring Converter实现示例将String对象转换为自定义Email值对象: R…