C++中的初始化列表

初始化参数列表

用于在构造函数中初始化类的数据成员。

语法:构造函数():属性1(值1),属性2(值2)......{ }

性质:

1.只能在构造函数中使用

2.引用 或 常量必须在初始化参数列表中初始化

3.初始化的顺序和成员变量的顺序一致,与初始化参数列表中的顺序无关

#include<iostream>
#include<vector>
using namespace std;
class A {int a;int b;int c;int& e;const int d;
public:A(int a1, int b1, int c1) :b(a), a(a1), c(c1), e(a1), d(b1) {e = a1;//报错,构造函数用于给成员变量赋值,引用不能在构造函数中初始化cout << a << " " << b << " " << c;}
};
int main() {A p(1, 2, 3);return 0;
}

初始化列表的做用:

1)初始化const和引用成员

对于 const (常量)成员变量和引用类型的成员变量,它们在定义后不能再被赋值

class fun {const int a;int& b;
public://在这个构造函数的初始化列表中,可以对 const 成员 a 和引用成员 b 进行初始化。fun(int x, int& y) : a(x), b(y) {}
};

2)提高效率

对于一些复杂的对象,如包含其他对象的类。如果不用初始化列表,而是在构造函数体内赋值,会先调用默认构造函数创建成员对象,然后再调用赋值运算符进行赋值。而使用初始化列表可以直接调用拷贝构造函数初始化成员对象,避免了不必要的默认构造过程,从而提高了效率。

3)保证初始化顺序

成员变量的初始化顺序是按照它们在类定义中出现的顺序,而不是初始化列表中的顺序。这有助于明确成员初始化的顺序,避免因顺序混乱导致的错误。

初始化列表和在构造函数体内赋值的区别:

1.初始化时机

列表初始化:

是在对象创建时进行初始化,属于初始化阶段。成员变量在进入构造函数体之前就已经完成初始化。

构造函数体内赋值:

是在对象已经初始化完成后,在构造函数的执行体中对成员变量进行赋值操作。

2.性能差异

列表初始化:

对于基本类型和一些简单对象,性能差异可能不明显。但对于复杂对象,特别是涉及到资源获取(如动态内存分配)的成员,列表初始化可以避免先默认构造再赋值的过程,效率更高。

构造函数体内赋值:

如果对象有默认构造函数,先调用默认构造函数进行初始化,之后在构造函数体内又进行赋值操作,可能会涉及额外的资源消耗和时间开销。

3.初始化要求

列表初始化:

如前所述,不允许窄化转换,能保证数据的安全性和准确性。

构造函数体内赋值:

可以进行隐式类型转换,这可能会导致数据丢失或不符合预期的结果,当然也可以通过一些手段(如 explicit 关键字)来控制类型转换。

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

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

相关文章

QT基本绘图

QT绘图 1.概述 这篇文章介绍如何绘图 2.绘图基本操作 创建一个普通的widget类型的项目 在widget.h 文件中重写绘图事件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : p…

【IEEE独立出版 |往届均已成功检索】第八届大数据与应用统计国际学术研讨会(ISBDAS 2025)

重要信息 时间地点&#xff1a;2025年2月28日-3月2日 中国 广州 会议检索&#xff1a;EI Compendex, Scopus →点此投稿/参会/了解会议详情 组织单位 主办单位&#xff1a;广东省高等教育学会人工智能与高等教育研究分会 协办单位&#xff1a;北京师范大学人工智能与未…

C# 中的 LINQ:轻松处理集合和数据

C#中的LINQ&#xff08;Language Integrated Query&#xff09;&#xff0c;这是一个非常强大且实用的功能&#xff0c;可以简化集合操作和数据查询。以下是一篇关于C#中LINQ使用的文章。 引言 LINQ&#xff08;Language Integrated Query&#xff09;是C#语言的一个重要特性…

自动化立体仓库:详解

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载。 自动化立体仓库&#xff08;Automated S…

Hash table类算法【leetcode】

哈希表中关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素 那么哈希表能解决什么问题呢&#xff0c;一般哈希表都是用来快速判断一个元素是否出现集合里。 例如要查询一个名字是否在这所学校里。 要枚举的话时间复杂度是O(n)&#xff0c;但如果使用哈希…

window 中安装 php 环境

window 中安装 php 环境 一、准备二、下载三、安装四、测试 一、准备 安装前需要安装 Apache &#xff0c;可以查看这篇博客。 二、下载 先到这里下载 这里选择版本为“VS16 x64 Thread Safe”&#xff0c;这个版本不要选择线程安全的&#xff0c;我试过&#xff0c;会缺少文…

Kubernetes部署Grafana详细教程

1. 概述 Grafana是一个强大的开源监控和可视化工具,可以帮助我们更好地理解和分析系统性能数据。在Kubernetes环境中部署Grafana可以让我们更方便地监控集群和应用的状态。 2. 准备工作 一个正常运行的Kubernetes集群kubectl命令行工具,已配置可以访问您的集群集群中已创建名…

嵌入式Linux学习之Linux基础再过部分——文件IO(1)

目录 先来看看Linux是如何操作文件IO的 文件描述符 打开文件open pathname flags mode 返回值 write 参数详解 返回值 在哪里你能使用write flags read 返回值 flags close lseek whence 参数常量 返回值 示例 1 示例 2 demo3 深入探究文件IO Linux 系统…

LeetCode 209 长度最小的子数组(滑动窗口)

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode 209 长度最小的子数组(滑动窗口) 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于…

C# 高级--反射 详解

一、反射是什么 1、C#编译运行过程 高级语言->编译->dll/exe文件->CLR/JIT->机器码 2、原理解析metadata&#xff1a;元数据数据清单&#xff0c;记录了dll中包含了哪些东西,是一个描述。IL&#xff1a;中间语言&#xff0c;编译把高级语言编译后得到的C#中最真…

【Web前端】Web API:构建Web应用核心

什么是 API API&#xff08;应用程序编程接口&#xff09;是一组定义了软件组件之间如何交互的规则和协议。它允许一个程序调用另一个程序的功能&#xff0c;而不用了解其内部实现细节。 Web 开发中&#xff0c;API 通常用于实现前端与后端之间的通信。 客户端 JavaScript 中的…

Telegram bot Mini-App开发实践---Telegram简单介绍与初始化小程序获取window.Telegram.WebApp对象并解析

➡️【好看的灵魂千篇一律,有趣的鲲志一百六七!】- 欢迎认识我~~ 作者:鲲志说 (公众号、B站同名,视频号:鲲志说996) 科技博主:极星会 星辉大使 后端研发:java、go、python、TS,前电商、现web3 主理人:COC杭州开发者社区主理人 、周周黑客松杭州主理人、 AI爱好…

VRT: 关于视频修复的模型

VRT: 关于视频修复的模型 1. 视频修复的背景与重要性背景介绍&#xff1a;重要性&#xff1a; 2. VRT的重要性和研究背景VRT的背景&#xff1a;VRT的重要性&#xff1a; 3. 视频修复概述3.1 定义与目标3.2 与单图像修复的区别3.3 对时间信息利用的需求 4. VRT模型详解4.1 整体框…

【linux】ubuntu下常用快捷键【笔记】

环境 硬件&#xff1a;通用PC 系统&#xff1a;Ubuntu 20.04 软件 &#xff1a; 打开终端窗口&#xff1a;Ctrl Alt T 关闭当前窗口&#xff1a;Alt F4 改变窗口大小&#xff1a;Alt F8 移动窗口&#xff1a; Alt F7 配合 “←”、“→”、“↑”、“↓”来移动窗口 …

java 增强型for循环 详解

Java 增强型 for 循环&#xff08;Enhanced for Loop&#xff09;详解 增强型 for 循环&#xff08;也称为 “for-each” 循环&#xff09;是 Java 从 JDK 5 开始引入的一种便捷循环语法&#xff0c;旨在简化对数组或集合类的迭代操作。 1. 基本语法 语法格式 for (类型 变量…

游戏引擎学习第17天

视频参考:https://www.bilibili.com/video/BV1LPUpYJEXE/ 回顾上一天的内容 1. 整体目标&#xff1a; 处理键盘输入&#xff1a;将键盘输入的处理逻辑从平台特定的代码中分离出来&#xff0c;放入更独立的函数中以便管理。优化消息循环&#xff1a;确保消息循环能够有效处理 …

jmeter常用配置元件介绍总结之配置元件

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之线程组 4.jmeter常用配置元件介绍总结之函数助手 5.jmeter常用配置元件介绍总结之取样器 6.jmeter常用配置元件介绍总结之jsr223执行pytho…

python基础之学生成绩管理系统

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 声明&#xff1a;本文主要用作技术分享&#xff0c;所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险&#xff0c;并遵循相关法律法规。 while…

关联度分析、灰色预测GM(1,1)、GM(1,1)残差模型——基于Python实现

关联度分析 import numpy as np import pandas as pd #关联度分析 #参考序列 Y_0[170,174,197,216.4,235.8] #被比较序列 Y_1[195.4,189.9,187.2,205,222.7] Y_2[308,310,295,346,367]#初始化序列 X_0np.array(Y_0)/Y_0[0] X_1np.array(Y_1)/Y_1[0] X_2np.array(Y_2)/Y_2[0]#计…

Java基础知识(五)

文章目录 ObjectObject 类的常见方法有哪些&#xff1f; 和 equals() 的区别hashCode() 有什么用&#xff1f;为什么要有 hashCode&#xff1f;为什么重写 equals() 时必须重写 hashCode() 方法&#xff1f; 参考链接 Object Object 类的常见方法有哪些&#xff1f; Object 类…