构造函数和初始化列表的关系和区别【详解】

news2024/11/26 14:31:58

构造函数和初始化列表关系和区别,以及为什么有初始化列表,和它的好处

  • 一、构造函数和初始化列表的关系和区别
  • 二、为什么有初始化列表
  • 三、使用初始化列表的好处

一、构造函数和初始化列表的关系和区别

百度百科这样定义初始化列表:与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。
1、关系:从定义中我们可以知道初始化列表也是配合构造函数使用的,也就是说,构造函数可以使用初始化列表,也可以不使用(简单理解为初始化列表是构造函数的配件,可以有,也可以没有,但是有些场合必须使用初始化列表,第三部分会说)。
2、区别:我们以前都认为构造函数是给对象初始化,其实严格来说构造函数体中的语句只能将其称为赋初值,而初始化列表才是真正的初始化。因为初始化是在一个变量(或对象)定义的时候赋予初始值才叫初始化。如何理解构造函数是赋初始值,下面为什么有初始化列表中的三种情况你可以感受到。

二、为什么有初始化列表

因为类中有下面三种成员变量时,必须使用初始化列表来初始化
1、引用成员变量,因为引用必须在定义的时候初始化,而构造函数体中的语句是赋值,所以应该使用初始化列表初始化
2、const修饰的成员变量,因为const修饰的成员变量也必须在定义的时候初始化,所以必须使用初始化列表
3、没有默认构造的自定义类型成员变量,因为使用构造函数一定不可避免的会调用自定义类型成员变量的默认构造,然而使用初始化列表可以避免使用默认构造函数,直接调用该成员变量的拷贝构造(下面例子会讲到这些)

下面举例说明以上三种情况,如下:声明了一个Time类和Date类,Date类中声明了一个Time类类型变量

class Time //声明一个Time类,类中有三个成员变量,和一个有参构造函数
{
public:
	Time(int hour, int minuter, int second, int day)
	{
		_hour = hour;
		_minuter = minuter;
		_second = second;
	}

private:
	int _hour;
	int _minuter;
	int _second;
};

//声明一个Date类,类中有一个int类型成员变量、一个引用、一个const修饰、一个自定义类型
class Date
{
public:	
	Date(int year, int month, int day) //构造函数
	{
		_year = year;
		_month = _month;
		_day = day;
	}

private:
	int _year;
	int& _month; //引用
	const int _day; //const修饰
	Time _t; //没有默认构造的自定义类型
};

int main()
{
	Date d(2023, 11, 14);
	return 0;
}

vs2022中执行上面代码,会出现以下错误,并给出错误原因
在这里插入图片描述

解决方法就是使用初始化列表,如下所示:

class Time //声明一个Time类,类中有三个成员变量,和一个有参构造函数
{
public:
	Time(int hour, int minuter, int second, int day)
	{
		_hour = hour;
		_minuter = minuter;
		_second = second;
	}

private:
	int _hour;
	int _minuter;
	int _second;
};

//声明一个Date类,类中有一个int类型成员变量、一个引用、一个const修饰、一个自定义类型
class Date
{
public:	
	Date(int year, int month, int day, Time& t)
		:_year(year), _month(month), _day(day), _t(t) //初始化列表,_t(t)这个调用的是拷贝构造,为什么会调用拷贝构造,可以看本文【链接】
	{
	}

private:
	int _year;
	int& _month; //引用
	const int _day; //const修饰
	Time _t; //没有默认构造的自定义类型
};

int main()
{
	Time t(23, 43, 40); //实例化一个Time对象
	Date d(2023, 11, 14, t);
	return 0;
}

三、使用初始化列表的好处

当你了解了没有默认构造的自定义类型成员变量必须使用初始化列表的时候,初始化列表的好处也就出来了:可以减少一次默认构造的调用,当有大量对象的时候,使用初始化列表的好处还是很明显的,可以大大降低函数压栈带来的开销。所以我们能使用初始化列表尽量使用初始化列表。

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

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

相关文章

使用手机作为电脑的麦克风和摄像头外设

工具 Iriun Iriun 电脑端安装:Iriun Android: Iriun 4K Webcam for PC and Mac - Apps on Google Play Apple: Iriun Webcam for PC and Mac on the App Store 基础功能免费,普通使用足够了。 付费功能: 使用 这里有介绍&#xff1a…

【Java】详解多线程同步的三种方式

🌺个人主页:Dawn黎明开始 🎀系列专栏:Java ⭐每日一句:等风来,不如追风去 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️ 文章目录 一.🔐线…

MAC地址_MAC地址格式_以太网的MAC帧_详解

MAC地址 全世界的每块网卡在出厂前都有一个唯一的代码,称为介质访问控制(MAC)地址 一.网络适配器(网卡) 要将计算机连接到以太网,需要使用相应的网络适配器(Adapter),网络适配器一般简称为“网卡”。在计算机内部,网卡与CPU之间的通信&…

【UE C++】读取文本文件,并解析

目录 0 引言1 空格 制表符 换行符1.1 定义1.2 查看字符 2 实战 🙋‍♂️ 作者:海码007📜 专栏:UE虚幻引擎专栏💥 标题:❣️ 寄语:书到用时方恨少,事非经过不知难!&#x…

C进阶---字符函数和字符串函数

目录 一、长度不受限限制的字符串函数 1.1strlen 1.2strcpy 1.3strcat 1.4strcmp 二、长度受限制的字符串函数 2.1strncpy 2.2strncat 2.3strncmp 三、其他字符串函数 3.1strstr 3.2strtok 3.3sterror 3.4memcpy 3.5memmove 3.6memcmp 四、字符分类函…

c语言:如何打印杨辉三角形。

题目:打印杨辉三角形 如: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 思路和代码: //由规律不难得出,每行首个数字和最后最后一个数字都为1,其余数字是这列的上一个数字和前一个数字的和组成,由此推出代码 #de…

Openssl X509 v3 AuthorityKeyIdentifier实验与逻辑分析

Openssl是X509的事实标准,目前主流OS或个别安全性要求较高的设计场景,对X509的证书链验证已经不在停留在只从数字签名校验了,也就是仅仅从公钥验签的角度,在这些场景中,往往还会校验AuthorityKeyIdentifier和SubjectKe…

【文件包含】metinfo 5.0.4 文件包含漏洞复现

1.1漏洞描述 漏洞编号————漏洞类型文件包含漏洞等级⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐漏洞环境windows攻击方式 MetInfo 是一套使用PHP 和MySQL 开发的内容管理系统。MetInfo 5.0.4 版本中的 /metinfo_5.0.4/about/index.php?fmodule文件存在任意文件包含漏洞。攻击者可利用漏洞读取网…

第十九章 Java绘图

第十九章 java绘图 19.1 java绘图类 绘图时高级程序设计中非常重要的技术,例如,应用程序可以绘制闪屏图片,背景图片,组件外观等等,Web程序可以绘制统计图,数据库存储图片资源等,真骨耸为“一…

服务名无效。 请键入 NET HELPMSG 2185以获得更多的帮助

遇到的问题是MySQL服务没有。 因为net start 服务名,启动的是win下注册的服务。此时,我系统中并没有注册mysql到服务中。即下面没有mysql服务。 mysqld --install net start mysql

2023.11.15 每日一题(AI自生成应用)【C++】【Python】【Java】【Go】 动态路径分析

目录 一、题目 二、解决方法 三、改进 一、题目 背景: 在一个城市中,有数个交通节点,每个节点间有双向道路相连。每条道路具有一个初始权重,代表通行该路段的成本(例如时间、费用等)。随着时间的变化&am…

nodejs+vue黄河风景线旅游网站的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

本文首先对该系统进行了详细地描述,然后对该系统进行了详细的描述。管理人员增加了系统首页、个人中心、用户管理、景点分类管理、景点简介管理、旅游路线管理、文章分类管理、公告文章管理、系统管理理等功能。这套黄河风景线旅游网站是根据当前的现实需要&#xf…

SystemVerilog学习 (5)——接口

一、概述 验证一个设计需要经过几个步骤: 生成输入激励捕获输出响应决定对错和衡量进度 但是,我们首先需要一个合适的测试平台,并将它连接到设计上。 测试平台包裹着设计,发送激励并且捕获设计的输出。测试平台组成了设计周围的“真实世界”,…

【miniQMT实盘量化3】获取历史行情数据

前言 上篇文章,介绍了如何与miniQMT建立连接,这篇开始,我们会深入探讨miniQMT的每个功能接口。首先,从获取历史数据开始。 迅投的官方文档目前已经更新,miniQMT对应原生API部分 接口汇总 与历史行情数据相关的接口&a…

Solidity案例详解(四)投票智能合约

该合约为原创合约,功能要求如下 在⼀定时间能进⾏投票超过时间投票截⽌,并投赞同票超过50%则为通过。 使⽤safeMath库,使⽤Owner 第三⽅库拥有参与投票权的⽤户在创建合约时确定Voter 结构 要有时间戳、投票是否同意等;struct 结构…

浅尝:iOS的CoreGraphics和Flutter的Canvas

iOS的CoreGraphic 基本就是创建一个自定义的UIView&#xff0c;然后重写drawRect方法&#xff0c;在此方法里使用UIGraphicsGetCurrentContext()来绘制目标图形和样式 #import <UIKit/UIKit.h>interface MyGraphicView : UIView endimplementation MyGraphicView// Onl…

智能AI系统ChatGPT网站源码+支持OpenAI DALL-E3文生图+支持ai绘画(Midjourney)/支持GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

【命令行魔法:掌握Linux基础工具开发的独门技艺】

本节目标 1.Linux 软件包管理器 2.Linux开发工具 3.Linux编译器-gcc/g使用 4.Linux项目自动化构建工具-make/Makefile 5.Linux第一个小程序&#xff0d;进度条 1.Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译…

k8s资源管理操作——陈述式管理方式

目录 陈述式资源管理方式 1、常用的kubernetes管理命令 1&#xff09;查看版本信息 2&#xff09;查看资源对象简写 3&#xff09;查看集群信息 4&#xff09;配置kubectl自动补全 5&#xff09;node节点查看日志 2、资源管理命令 1&#xff09;创建资源 2&#xff0…

保姆级教程之SABO-VMD-CNN-SVM的分类诊断,特征可视化

今天出一期基于SABO-VMD-CNN-SVM的分类诊断。 依旧是采用经典的西储大学轴承数据。基本流程如下&#xff1a; 首先是以最小包络熵为适应度函数&#xff0c;采用SABO优化VMD的两个参数。其次对每种状态的数据进行特征向量的求取&#xff0c;并为每组数据打上标签。然后将数据送入…