C++ 列表初始化(initializer_list)

列表初始化(initializer_list)

列表初始化是C++中的一种语法特性,引入于C++11,用于更简单直观地初始化变量、对象或容器。它使用花括号 {},提供了更安全的初始化方式,避免了类型窄化转换等潜在错误。

定义

列表初始化是用花括号 {} 提供初始值来初始化变量或对象。根据上下文,它支持以下几种用途:

  1. 初始化简单变量
  2. 初始化结构体或类
  3. 初始化标准容器(如std::vector、std::array等)
  4. 统一初始化方式,取代传统的构造函数或等号赋值。

功能作用

1. 更简洁的初始化语法
使用花括号直接提供初始值。

2. 防止窄化转换
比如尝试将浮点数赋值给整数时,编译器会报错。

3. 适用于自动推导类型
结合auto或模板代码更高效。

4. 统一语法
替代不同的构造函数初始化方法,提供一致的代码风格。

列表初始化参考代码

#include <iostream>
#include <vector>
#include <array>
#include <string>// 自定义结构体
struct Point {int x;int y;
};// 自定义类
class Rectangle {int width, height;
public:// 构造函数Rectangle(int w, int h) : width(w), height(h) {}void print() const {std::cout << "Rectangle(width: " << width << ", height: " << height << ")\n";}
};int main() {// 1. 简单变量的列表初始化int a{10};           // 等价于 int a = 10;double b{3.14};      // 初始化浮点数// int c{3.14};      // 编译错误,防止窄化转换std::cout << "a = " << a << ", b = " << b << '\n';// 2. 数组或std::array初始化int arr[] = {1, 2, 3, 4, 5};std::array<int, 3> stdArr = {10, 20, 30};std::cout << "Array: ";for (int i : arr) std::cout << i << " ";std::cout << "\nstd::array: ";for (int i : stdArr) std::cout << i << " ";std::cout << '\n';// 3. 初始化自定义结构体Point p1{1, 2};std::cout << "Point(x: " << p1.x << ", y: " << p1.y << ")\n";// 4. 初始化自定义类Rectangle rect{5, 10};rect.print();// 5. 使用标准容器std::vector<int> vec{10, 20, 30, 40};std::cout << "Vector: ";for (int v : vec) std::cout << v << " ";std::cout << '\n';// 6. 使用auto推导类型auto x = {1, 2, 3};  // 推导为std::initializer_list<int>std::cout << "Auto list: ";for (int v : x) std::cout << v << " ";std::cout << '\n';return 0;
}

列表初始化参考代码输出结果

a = 10, b = 3.14
Array: 1 2 3 4 5 
std::array: 10 20 30 
Point(x: 1, y: 2)
Rectangle(width: 5, height: 10)
Vector: 10 20 30 40 
Auto list: 1 2 3 

注意事项

1. 防止窄化转换
使用列表初始化时,编译器会阻止可能导致精度丢失的类型转换。

2. 初始化优先级
如果类提供了构造函数,与列表初始化冲突时可能导致编译错误,需要明确类的构造函数声明。

3. 与std::initializer_list的关系
如果类提供了std::initializer_list构造函数,则列表初始化会优先调用该构造函数。

通过列表初始化,可以编写更安全、简洁且更具可读性的代码。

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

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

相关文章

java+ssm+mysql美妆论坛

项目介绍&#xff1a; 使用javassmmysql开发的美妆论坛&#xff0c;系统包含超级管理员&#xff0c;系统管理员、用户角色&#xff0c;功能如下&#xff1a; 用户&#xff1a;主要是前台功能使用&#xff0c;包括注册、登录&#xff1b;查看论坛板块和板块下帖子&#xff1b;…

Java-21 深入浅出 MyBatis - 手写ORM框架2 手写Resources、MappedStatment、XMLBuilder等

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

关于Python的常用模块

Python拥有丰富的标准库和第三方库&#xff0c;这些库提供了大量的模块&#xff0c;使得Python能够广泛应用于各个领域。以下是一些Python的常用模块&#xff1a; 一、系统交互与文件操作模块 os模块&#xff1a;用于与操作系统进行交互&#xff0c;如获取当前工作目录、创建…

专业135+总分400+华中科技大学824信号与系统考研经验华科电子信息与通信工程,真题,大纲,参考书。

考研成功逆袭985&#xff0c;上岸华科电子信息&#xff0c;初试专业课824信号与系统135&#xff0c;总分400&#xff0c;成绩还是很满意&#xff0c;但是也有很多遗憾&#xff0c;总结一下自己的复习&#xff0c;对于大家复习给些参考借鉴&#xff0c;对自己考研画个句号&#…

ElementUI:el-tabs 切换之前判断是否满足条件

<div class"table-card"><div class"card-steps-class"><el-tabsv-model"activeTabsIndex":before-leave"beforeHandleTabsClick"><el-tab-pane name"1" label"基础设置"><span slot&…

java中的数组(2)

大家好&#xff0c;我们今天继续来看java中数组这方面的知识点&#xff0c;那么话不多说&#xff0c;我们直接开始。 一.数组的使用 1.数组中元素访问 数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,数组可以通过下标访问其任意位置的元素. 也可以进行修改…

在 OAuth 2.0 中,refreshToken(刷新令牌)存在的意义

在 OAuth 2.0 中&#xff0c;refreshToken&#xff08;刷新令牌&#xff09; 的主要目的是为了提升用户体验和安全性&#xff0c;同时确保访问令牌的有效性。以下是需要使用 refreshToken 的原因&#xff1a; 1. 访问令牌的有限生命周期 访问令牌&#xff08;accessToken&…

#渗透测试#红蓝对抗#SRC漏洞挖掘# Yakit(6)进阶模式-Web Fuzzer(下)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

Oracle 19c RAC到单机ADG部署及Broker管理配置-最佳实践

一、概述 前面文章列举了几种ADG常见的搭建方式&#xff0c;此处我以最佳的方式作为实践过程演示&#xff1b;架构为RAC到单机&#xff0c;通常这种架构大家用得比较多&#xff1b;这里实践的案例ADG全程是Broker进行管理&#xff0c;Broker其实是ADG非常简单易用的工具&#x…

每日一题 LCR 097. 不同的子序列

LCR 097. 不同的子序列 使用动态规划就可以解决&#xff0c;重点是知道 动态规划的状态是如何转移的 class Solution { public:int numDistinct(string s, string t) {int ns s.size();int nt t.size();vector<vector<long>> dp(ns1,vector<long>(nt1,0)…

如何在 JavaScript 中进行深度克隆?

在 JavaScript 中进行深度克隆&#xff08;deep clone&#xff09;是指创建一个对象的完整副本&#xff0c;并且副本中所有的嵌套对象也被复制&#xff0c;而不是只是引用原始对象中的嵌套对象。深度克隆与浅克隆的主要区别在于&#xff0c;浅克隆只复制对象的引用&#xff0c;…

C# 关于加密技术以及应用(一)

在 开发过程中&#xff0c;加密是一个常见的需求&#xff0c;数字签名和验证、网络通信安全、数据加密解密、用于保护数据的安全性和隐私。如几种常用的加密技术AES、SSL/TLS、RSA、HMAC 、SHA等&#xff0c;都是我们开发过程中常用到的加密方式&#xff0c;只不过每一个加密方…

Python 爬虫 (1)基础 | XHR

一、XHR 1、概念 XHR&#xff0c;全称XMLHttpRequest&#xff0c;是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。它允许网页的JavaScript代码与服务器进行异步通信&#xff0c;即在发送请求后&#xff0c;浏览器不会阻塞用户的后续操作&#xff0…

二进制部署Prometheus+grafana+alertmanager+node_exporter

Prometheus 是一个开源的监控和告警工具包&#xff0c;旨在提供高可靠性和可扩展性。它最初由 SoundCloud 开发&#xff0c;现已成为云原生计算基金会&#xff08;CNCF&#xff09;的一部分。以下是 Prometheus 的一些关键特性和概念&#xff1a; 1. **时间序列数据库**&#…

工业智能网关如何为企业实现智能制造赋能?

在数字化转型的浪潮中&#xff0c;工业智能网关作为连接物理世界与数字世界的桥梁&#xff0c;正逐步成为智能制造领域的核心组件。本文将通过一个实际使用案例&#xff0c;深入剖析工业智能网关如何助力企业实现生产流程的优化、数据的高效采集与分析&#xff0c;以及智能化决…

算法设计6_随机化算法

随机化算法 随机算法的随机性&#xff08;基本特征&#xff09; – 对于同一实例的多次执行, 效果可能完全不同 – 时间复杂性的一个随机变量 – 解的正确性和准确性也是随机的 数值随机化算法 随机数值算法 – 主要用于数值问题求解 – 算法的输出往往是近似解 – 近似…

使用mmdeploy框架C++预测mask并绘制最小外接矩形

目录 解决目标 逻辑思路 代码实现 第1部分 第2部分 解决目标 这段代码实现了&#xff0c;一个基于深度学习的图像检测程序。它使用mmdeploy框架&#xff0c;加载一个预训练的模型【实例分割模型】来检测图像中的物体。 逻辑思路 程序首先加载模型&#xff0c;然后&#…

Java --- JVM编译运行过程

目录 一.Java编译与执行流程&#xff1a; 二.编译过程&#xff1a; 1.编译器&#xff08;javac&#xff09;&#xff1a; 2.字节码文件&#xff08;.class&#xff09;&#xff1a; 三.执行过程&#xff1a; 1.启动JVM&#xff08;Java虚拟机&#xff09;&#xff1a; 2…

【Makefile】编译日志之输出重定向符号 >

用法1 make all >& compilelog.txt make all > compilelog.txt这两个编译命令在功能上有一些细微的区别&#xff0c;主要在于标准输出和标准错误的处理方式。 make all >& compilelog.txt 这个命令会将标准输出&#xff08;stdout&#xff09;和标准错误&a…

使用 `typing_extensions.TypeAlias` 简化类型定义:初学者指南

使用 typing_extensions.TypeAlias 简化类型定义&#xff1a;初学者指南 什么是 TypeAlias&#xff1f;安装 typing_extensions示例代码&#xff1a;如何使用 TypeAlias示例 1&#xff1a;为简单类型定义别名示例 2&#xff1a;为复杂类型定义别名示例 3&#xff1a;结合 Union…