类和对象【3】初始化列表

全文目录

  • 引言
  • 初始化列表
    • 定义
    • 特性
  • 总结

引言

上一篇文章中介绍了构造函数,它可以在实例化一个类对象的时候自动调用,以初始化类对象:
戳我看默认成员函数详解
但是,不难发现,在构造函数体中对成员变量的初始化其实是属于对它们进行赋值操作而不是定义。那么对于一些只能在定义时给值的变量,它们在定义之后就不能改变(例如const变量与引用变量)或者一些没有默认构造函数的类类型成员变量,构造函数中无法对它们进行定义。用构造函数显然就不能满足我们的需求。

那么在类对象实例化时,这些成员变量是在哪里定义的呢?定义时又是怎么对他们进行初始化的呢?
成员变量在初始化列表中定义并初始化

初始化列表

一般成员变量可以多次赋值,在构造函数体中进行赋值当然是可以的。但是构造函数体中只能实现赋值而不能定义成员变量,所以const成员变量、引用成员变量、无默认构造函数的类成员,就不能实现定义。而这些成员变量就必须在初始化列表中显式的定义并初始化:

class A
{
public:
	A(int a)
	{
		_a = a;
	}
private:
	int _a;
};

class B
{
public:
	/* B(int b)
	{
		_b = b; 
		_c = b;  
	} */
	//错误代码: 表达式不能是常量,A不能没有默认构造函数
private:
	int& _b;       //引用成员变量
	const int _c;  //const成员变量
	A _obj;        //没有默认构造函数的成员类
};

在这里插入图片描述

定义

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

类名(参数列表)
   : 成员变量(初始值)
   , 成员变量(初始值)
   , ...
{}

初始化列表是成员变量定义的地方,我们就可以在初始化列表对以上三种成员变量进行定义并初始化:

class A
{
public:
	A(int a)
	{
		_a = a;
	}
private:
	int _a;
};

class B
{
public:
	B(int b)
		: _b(b)
		, _c(b)
		, _obj(b) //在初始化列表调用其构造函数
	{}
private:
	int& _b;
	const int _c;
	A _obj;
};

特性

  1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次);
  2. 引用成员变量、const成员变量、无默认成员函数的成员类必须放在初始化列表位置进行初始化
  3. 对于自定义类型成员变量,都会先使用初始化列表进行定义并初始化(在成员变量声明是给的默认值就是在初始化列表中使用的);
  4. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关(所以建议将声明的次序与在初始化列表中的先后顺序写一致):
class A
{
public:
	A(int a)
		: _a1(a)
		, _a2(a1) //错误代码:未定义标识符a1
	{}

private:
	int _a2;
	int _a1;
};

总结

到此,关于初始化列表的内容就介绍完了
在以后的编程中,建议成员变量都在初始化列表中进行初始化。当然也存在一些需要在构造函数内赋值的情况,例如需要动态开辟空间时,初始化列表显然不适合。

如果大家认为我对某一部分没有介绍清楚或者某一部分出了问题,欢迎大家在评论区提出

如果本文对你有帮助,希望一键三连哦

希望与大家共同进步哦

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

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

相关文章

gdb调试 与 coredump

gdb调试 与 coredump调试 1. 启动gdb2.gdb中的相关命令3. coredump调试(附属于gdb调试中一种,当程序出现错误时,会使用coredump调试)1)coredump是什么?2)前期设置3)什么情况下会导致…

word打印为pdf去掉批注和修订记录

对于这个问题某乎上充斥着垃圾回答,大多引流到自家开发的pdf产品上。其实背后的方法都是一样的,就是关掉批注,用word自带的功能就能解决,凡是word编辑软件都有类似功能 直接用word打印为pdf后的效果 下图为打印出来的pdf文件&…

【算法】不使用LinkedHashMap实现一个LRU缓存

文章目录 什么是LRU?设计思路代码实现 LRU是我在面试过程中遇到的比较多的算法题了,并且我自己的项目中也手写了LRU算法,所以觉得还是有必要掌握一下这个重要的算法的。 什么是LRU? LRU是一种缓存淘汰策略。 我们知道&#xff0…

大环境不好难找工作?三面阿里,幸好做足了准备,已拿offer

大环境不好难找工作?三面阿里,幸好做足了准备,已拿offer 三面大概九十分钟,问的东西很全面,需要做充足准备,就是除了概念以外问的有点懵逼了(呜呜呜)。回来之后把这些题目做了一个分…

R-Meta分析与【文献计量分析、贝叶斯、机器学习等】多技术融合实践与拓展

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…

增强型本地文件搜索工具:Find Any File

Find Any File是mac上一款增强型本地文件搜索工具,可以让你在本地磁盘上搜索、查找任何文件,包括本地磁盘的名称、 创建或修改日期、 大小或类型和创建者代码等。小编现为大家提供最新Find Any File Mac破解版,欢迎需要的朋友下载使用。 Find…

屏幕挂灯是不是智商税?明基ScreenBar Halo屏幕挂灯初体验

目录 一、屏幕挂灯是不是智商税?二、文心一言眼里的屏幕挂灯1、明基ScreenBar Halo屏幕挂灯2、屏幕挂灯和普通台灯哪个好? 三、屏幕挂灯初体验四、使用体验五、无线控制器六、专业角度分析1、屏幕工作照明,不是随便一盏灯就可以2、引导光线照…

路径规划算法:基于入侵杂草优化的路径规划算法- 附代码

路径规划算法:基于入侵杂草优化的路径规划算法- 附代码 文章目录 路径规划算法:基于入侵杂草优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

【SA8295P 源码分析】03 - SA8295P QNX Host 上电开机流程分析

【SA8295P 源码分析】03 - SA8295P QNX Host上电开机流程分析 一、阶段1 固件开机自检 (SM BIST):APPS PBL加载XBL后触发 INT_RESET进行Warm Reset二、阶段2 固件开机自检 (SM BIST):加载TZ,初始Hypervisor,启动QNX Kernel&#x…

Flume实践

1 NetCat方式 ]# ./bin/flume-ng agent --conf conf--conf-file ./conf/flume_netcat.conf --name a1 -Dflume.root.loggerINFO,console [rootmaster ~]# yum -y intalll telnet 发数据: ]# telnet master 44444 数据接收,是在终端上接收的&#xff0…

从组件化角度聊聊设计工程化

目录 设计系统 设计系统的定义 设计系统的优势 设计系统存在的问题 设计工程化 设计系统探索 设计系统落地实践 Design Token Design Token 实践 设计工程化理想方案构想 展望 参考文献 近几年围绕业务中台化的场景,涌现出了许多低代码平台。面对多组件…

Qt翻金币小游戏详细教程(内涵所有源码、图片资源)

一、项目简介 翻金币项目是一款经典的益智类游戏,我们需要将金币都翻成同色,才视为胜利。首先,开始界面如下: 点击start按钮,进入下层界面,选择关卡: 在这里我们设立了20个关卡供玩家选择&…

Jmeter组件:Random CSV Data Set Config(随机读取文件数据)

一、Jmeter组件:Random CSV Data Set Config(随机读取文件数据) 功能:该组件可以随机读取CSV文件中的每一行的数据 二、下载插件:(jmeter-plugins-random-csv-data-set-xx.jar),并放到lib/ext目录下,重启jmeter 也可以在Jmeter…

Nginx基本使用以及部署前端项目

前言 最近学习了一下Nginx,整理了一个博客,主要参考的是狂神说的b站视频教程,文章链接如下:狂神说Nginx快速入门 一、下载、启动Nginx 1.下载Nginx 到Nginx官方选择自己电脑适用的稳定版本下载,我下载的的windows版…

ChatGPT免费使用的方法有哪些?

目录 一、ChatGpt是什么? 二、ChatGPT国内免费使用的方法: 第一点:电脑端 第二点:手机端 三、结语: 一、ChatGpt是什么? ChatGPt是美国OpenAI [1] 研发的聊天机器人程序 。更是人工智能技术驱动的自然语…

图像算法工程师岗位的主要职责(合集)

图像算法工程师岗位的主要职责 一、确定岗位的职责 1.根据工作任务的需要确立工作岗位名称及其数量; 2.根据岗位工种确定岗位职务范围; 3.根据工种性质确定岗位使用的设备、工具、工作质量和效率; 4.明确岗位环境和确定岗位任职资格; 5.确定各个岗位之间的相互关系; 6.根据岗位…

Solidity基础七

无论风暴将我带到什么岸边,我都将以主人的身份上岸 目录 一、Solidity的单位 1. 货币Ether 2. 时间单位Time 二、地址的形成 三、以太坊的账户 1.内部账户(简称CA) 2.外部账户(简称EOA) 3.内部账户和外部账户…

【Linux性能优化】你知道什么是平衡负载么

什么是平衡负载 首先大家思考一下,当你发现自己的服务变慢时,你会首先使用什么命令来排查?我通常做的第一件事,就是执行top或者uptime命令来了解系统的负载情况。比如像下面这样,我在命令行里输入top命令,…

[高光谱]使用PyTorch的dataloader加载高光谱数据

本文实验的部分代码参考 Hyperspectral-Classificationhttps://github.com/eecn/Hyperspectral-Classification如果对dataloader的工作原理不太清楚可以参见 [Pytorch]DataSet和DataLoader逐句详解https://blog.csdn.net/weixin_37878740/article/details/129350390?spm1001…

网络货运平台源码 管理平台端+司机端APP+货主端APP源码

网络货运平台系统源码,网络货运平台源码 管理平台端司机端APP货主端APP 遵循政策要求的八项基本功能,结合货主、实际承运人、监管方等多方业务场景,构建人、车、货、企一体的标准化网络货运平台系统。具有信息发布、线上交易、全程监控、金融…