c++基础·列表初始化
目录
一、列表初始化的核心优势
二、基础数据类型与数组初始化
1. 基础类型初始化
2. 数组初始化
三、类与结构体初始化
1. 构造函数匹配规则
2. 注意事项
四、标准容器初始化
五、聚合类型(Aggregate Types)初始化
1. 聚合类型定义
2. 初始化规则
六、总结与实践建议
最佳实践
性能提示
拓:聚合类型条件解析:"无私有或保护的非静态成员"
1. 聚合类型定义条件表格
2. 关键概念解释
一、列表初始化的核心优势
列表初始化(List Initialization)是C++11引入的统一初始化语法,其核心优势体现在以下方面:
-
-
语法统一性
传统初始化方式包括=赋值、()构造函数调用、{}聚合初始化等,而列表初始化通过统一的{}语法覆盖了以下场景:int x{5}; // 基础类型 std::vector<int> v{1,2,3}; // 容器 Point p{10, 20}; // 自定义类 -
隐式窄化检查
禁止可能导致数据丢失的隐式转换,例如:int a = 3.14; // 编译通过(丢失精度) int b{3.14}; // 编译错误!类型窄化 -
动态长度支持
可接受任意长度的初始化列表,尤其适用于容器和聚合类型:int arr[]{1,2,3,4,5}; // 数组长度自动推导为5 std::list<int> lst{10}; // 初始化含单个元素10的链表
二、基础数据类型与数组初始化
1. 基础类型初始化
传统初始化与列表初始化对比:
int x = 5; // 传统赋值 int y{5}; // 列表初始化(推荐) int z{}; // 默认初始化为02. 数组初始化
支持自动长度推导和省略等号的简洁语法:
int arr1[] = {1,2,3}; // C++03风格 int arr2[]{4,5,6}; // C++11风格(自动推导长度) char str[]{"Hello"}; // 字符串数组初始化
三、类与结构体初始化
1. 构造函数匹配规则
-
若类定义了
std::initializer_list构造函数,优先调用该构造函数:class Widget { public:Widget(std::initializer_list<int> list) {// 处理初始化列表...} }; Widget w{1,2,3}; // 调用initializer_list构造 -
若无
initializer_list构造,则匹配参数数量最接近的普通构造函数:class Point { public:Point(int x, int y) {...} }; Point p{10, 20}; // 调用Point(int, int)
2. 注意事项
当存在参数类型歧义时,列表初始化可能引发意外行为:
std::vector<int> v1(5, 1); // 包含5个1:[1,1,1,1,1] std::vector<int> v2{5, 1}; // 包含两个元素:[5,1]
四、标准容器初始化
列表初始化彻底改变了容器的使用体验:
// 初始化容器元素 std::vector<int> vec{1,2,3,4,5}; // 嵌套容器初始化 std::map<int, std::string> m{{1, "Alice"}, {2, "Bob"} };// 动态分配容器 auto p = new std::list<std::string>{"cpp", "java", "python"};
五、聚合类型(Aggregate Types)初始化
1. 聚合类型定义
满足以下条件的类/结构体:
- 无用户自定义构造函数
- 无私有或保护的非静态成员
- 无基类和虚函数
2. 初始化规则
按成员声明顺序初始化,支持嵌套初始化:
struct Address {std::string city;int zipcode; };struct Person {std::string name;int age;Address addr; };Person p{"Tom", 30, {"Shanghai", 200000}};
六、总结与实践建议
最佳实践
- 优先使用列表初始化替代
=和()初始化 - 警惕
auto推导陷阱:
auto x{5};在C++11中推导为std::initializer_list<int> - 自定义类型设计:
若需要支持不定长初始化,应实现std::initializer_list构造函数
性能提示
列表初始化可能引入临时对象构造开销,在性能敏感场景建议进行基准测试。
拓:聚合类型条件解析:"无私有或保护的非静态成员"
-
1. 聚合类型定义条件表格
| 条件 | 符合要求的示例 | 不符合要求的示例 | 违反后果 |
|---|---|---|---|
| 无用户自定义构造函数 | struct A { int x; }; | struct B { B(){} int x; }; | 无法使用B{1}初始化 |
| 无私有/保护的非静态成员 | struct C { int a; public: int b; }; | struct D { private: int x; }; | 无法直接列表初始化私有成员 |
| 无基类(C++11~C++17) | struct E { int x; }; | struct F : E {}; | C++20前无法聚合初始化派生类 |
| 无虚函数 | struct G { int x; }; | struct H { virtual void f(){} }; | 无法使用H{}初始化 |
2. 关键概念解释
"无私有/保护的非静态成员"
- 含义:所有非静态数据成员必须是公有(
public)访问权限 - 技术背景:列表初始化需要直接访问成员,私有成员需通过构造函数赋值
- 示例分析:
struct Valid {int a; // public(默认)public: int b; // 显式public }; Valid v{1, 2}; // 成功:成员均为public struct Invalid {private: int x; // 私有成员 }; Invalid i{5}; // 错误:无法访问私有成员
相关文章:
c++基础·列表初始化
目录 一、列表初始化的核心优势 二、基础数据类型与数组初始化 1. 基础类型初始化 2. 数组初始化 三、类与结构体初始化 1. 构造函数匹配规则 2. 注意事项 四、标准容器初始化 五、聚合类型(Aggregate Types)初始化 1. 聚合类型定义 2. 初始化…...
RK3588上编译opencv 及基于c++实现图像的读入
参考博文: https://blog.csdn.net/qq_47432746/article/details/147203889 一、安装依赖包 sudo apt install build-essential cmake git pkg-config libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libjpe…...
论文阅读:2025 arxiv AI Alignment: A Comprehensive Survey
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Alignment: A Comprehensive Survey 人工智能对齐:全面调查 https://arxiv.org/pdf/2310.19852 https://alignmentsurvey.com/ https://www.doubao.com/cha…...
element-ui中的上传组件el-upload非自动上传监听不到success
当设置了:auto-upload"false" 监听不到success回调 要用自定义请求去监听 :http-request"requestUploadFile" //设置 auto-upload为false,要自定义请求http-request //:auto-upload"false" //:http-request"requestUploadFi…...
Git创建空分支并推送到远程仓库
new-empty-branch是新分支的名称 完全空提交(Git 2.23)【推荐】 git switch --orphan new-empty-branch git config user.email "youexample.com" git config user.name "Your Name" git commit --allow-empty -m "初始空提交…...
Github中项目的公开漏洞合集
前言 最近在搜CVE的时候,意外发现了GitHub Security Advisories。 可能对一些人来说,已经是老东西了。但我还是第一次见到。 觉得挺好用的,就分享出来。 GitHub Security Advisories GitHub Security Advisories 是 GitHub 提供的一项重要…...
蚂蚁全媒体总编刘鑫炜再添新职,出任共工新闻社新媒体研究院院长
2025年4月18日,共工新闻社正式宣布聘任蚂蚁全媒体总编刘鑫炜为新媒体研究院院长。此次任命标志着刘鑫炜在新媒体领域的专业能力与行业贡献再次获得权威机构认可。 刘鑫炜深耕新媒体领域多年,曾担任中国新闻传媒集团新媒体研究院院长、蚂蚁全媒体总编等职…...
吴恩达强化学习复盘(2)K-Means初始化|K的选择|算法优化
K-Means初始化 K-Means 算法的第一步是随机选择位置作为初始聚类中心(new one through newk),但如何进行随机猜测是需要探讨的问题。一般需要多次尝试初始猜测,以期望找到更好的聚类结果。 K 值选择及初始聚类中心选取方法 K 值…...
SQL优化案例分享 | PawSQL 近日推出 Lateral Join 重写优化算法
一、Lateral 查询语法介绍 Lateral 查询是SQL中的一种连接方式,它允许FROM子句中的子查询引用同一FROM子句中前面的表的列。虽然这种特性提供了强大的表达能力,但在某些场景下可能导致性能问题。PawSQL优化器近日实现了一种针对特定类型Lateral Join的重…...
电子电器架构 ---软件定义汽车的电子/电气(E/E)架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
ONLYOFFICE协作空间3.1发布:虚拟数据房间中基于角色的表单填写、房间模板、改进访客管理等
全新升级的 ONLYOFFICE 协作空间有着约 40 项新功能和改进,将您的文档协作和管理体验提升到全新高度。阅读本文,了解所有优化功能。 关于 ONLYOFFICE ONLYOFFICE 是一个国际开源项目,专注于高级和安全的文档处理,可提供文本文档、…...
Docker如何更换镜像源提高拉取速度
在国内,由于网络政策和限制,直接访问DockerHub速度很慢,尤其是在拉取大型镜像时。为了解决这个问题,常用的方法就是更换镜像源。本文将详细介绍如何更换Docker镜像源,并提供当前可用的镜像源。 换源方法 方法1&#x…...
深入理解 HTML5 Web SQL 数据库:用法、现状与替代方案
一、引言 在 Web 开发的领域中,客户端存储一直是一个关键的话题。HTML5 带来了多种客户端存储的解决方案,其中 Web SQL 数据库曾经是一个备受关注的选项。尽管如今它已被废弃,但了解其原理、使用方法以及为何被替代,对于 Web 开发者来说仍然具有重要的意义。本文将深入探讨…...
【C++教程】C++中为什么优先使用 cout/cin流
在 C 中,优先使用 cout/cin 流而非 C 风格的 printf/scanf,主要出于以下设计理念和实际优势: 1. 类型安全(Type Safety) cout/cin 是类型安全的 流操作符(<< 和 >>)通过运算符重载自…...
示波器探头状态诊断与维护技术指南
一、探头性能劣化特征分析 信号保真度下降 ・时域表现:上升沿时间偏离标称值15%以上(如1ns探头测得≥1.15ns) ・频域特性:-3dB带宽衰减超过探头标称值20%基准稳定性异常 ・直流偏置电压漂移量>5mV(预热30分…...
【 Git 全局忽略文件完全指南:配置、规则与最佳实践】
Git 全局忽略文件完全指南:配置、规则与最佳实践 前言 在软件开发过程中,我们经常遇到一些不需要被版本控制系统追踪的文件,例如IDE配置文件、编译生成的中间文件、日志文件等。虽然可以在每个项目中创建.gitignore文件,但对于开…...
FreeRTOS互斥信号量解决优先级翻转实战教程
FreeRTOS互斥信号量解决优先级翻转实战教程 大家好!今天我们来深入探讨FreeRTOS中的优先级翻转问题,并通过互斥信号量来解决这个问题。上一篇文章我们已经了解了优先级翻转的现象,今天我们将动手实践,通过代码对比来直观感受互斥…...
第一篇:从哲学到管理——实践论与矛盾论如何重塑企业思维
引言:当革命哲学照亮现代商业 1937年,毛泽东在战火中写就的《实践论》《矛盾论》,为中国共产党提供了认识世界的方法论。今天,这两部著作正成为企业破解管理困局的“思维操作系统”: 战略模糊:据Gartner统…...
14.电容的高频特性在EMC设计中的应用
电容的高频特性在EMC设计中的应用 1. 电容自谐振频率特性对EMC的作用2. 退耦电容的选型3. Y电容选型注意事项4. 储能电容与电压跌落的瞬时中断5. 穿心电容对EMC滤波的作用 1. 电容自谐振频率特性对EMC的作用 电容的高频特性等效模型如下: 其自谐振成因如下&#x…...
网络编程4
day4 一、Modbus 1.分类 (1).Modbus RTU: 运行在串口上的协议,采用二进制表现形式以及紧凑型数据结构,通信效率高,应用广泛。(2).Modbus ASCII: 运行在串口上的协议,采用ASCII码传输,并且利用特殊字符作为其字节的开始…...
Java 性能优化:如何利用 APM 工具提升系统性能?
Java 性能优化:如何利用 APM 工具提升系统性能? 在当今竞争激烈的软件开发领域,系统性能至关重要。随着应用规模的扩大和用户需求的增加,性能问题逐渐凸显,这不仅影响用户体验,还可能导致业务损失。而 APM…...
AI音乐解决方案:1分钟可切换suno、udio、luno、kuka等多种模型,suno风控秒切换 | AI Music API
你有没有觉得,suno风控来了,就要停服了? 你有没有觉得,对接多种音乐模型,让你很疲乏? 你有没有觉得,音乐模型,中文咬字不清楚,让你很苦恼? 别怕࿰…...
一键升级OpenSSH/OpenSSL修复安全漏洞
在服务器安全运维过程中,我们经常面临这样的问题:收到高危漏洞通报(如最近的OpenSSH多个CVE漏洞),但Ubuntu系统无法通过apt直接升级到修复版本。这种情况下,传统方法需要手动编译源码,处理依赖关…...
健康养生,开启新生活
在饮食上,应遵循 “均衡搭配、清淡少盐” 的原则。主食不要只吃精米白面,可适当加入燕麦、糙米等全谷物,为身体补充膳食纤维;每天保证一斤蔬菜半斤水果,深色蔬菜如菠菜、西兰花富含维生素与矿物质,水果则选…...
VLAN间通讯技术
多臂路由 路由器使用多条物理线路,每条物理线路充当一个 VLAN 的网管 注意:路由器对端的交换机接口,需要设定 Access 类型,因为路由器的物理接口无法处理 VLAN 标签 。 单臂路由 使用 以太网子接口 (sub-interface) 实现。 …...
利用Stream和OpenAI构建基于RAG的AI客服聊天机器人
利用Stream和OpenAI构建基于RAG的AI客服聊天机器人 尽管大语言模型经过海量数据训练,但其领域专业知识仍有限。这一局限使其在需要特定数据的客服聊天机器人等应用中表现欠佳。 检索增强生成(RAG)通过让大语言模型访问外部知识源来生成更精准的响应,有效解决了这一问题。…...
Easysearch Rollup 相比 OpenSearch Rollup 的优势分析
背景 在处理时序数据时,Rollup 功能通过数据聚合显著降低存储成本,并提升查询性能。Easysearch 与 OpenSearch 均提供了 Rollup 能力,但在多个关键维度上,Easysearch Rollup 展现出更优的表现。本文将从查询体验、索引管理、聚合…...
如何远程访问家中服务器-FRP内网穿透详细
💡 本文会带给你 如何远程访问家中服务器FRP自动运行的方法一、准备工作 准备一台具备公网 IP 的服务器(如阿里云、腾讯云等云服务器,要求不高,几十块一年服务的轻型服务就行),用于部署 FRP 服务端(frps)。 家中电脑(内网设备),用于运行 FRP 客户端(frpc)。 下…...
EMIF详解
一、EMIF的基本定义 EMIF(External Memory Interface,外部存储器接口) 是嵌入式处理器(如DSP、FPGA、SoC)用于连接外部存储器的专用硬件接口模块,负责管理处理器与存储器之间的地址/数据总线、控制信号及时…...
人工智能在慢病管理中的具体应用全集:从技术落地到场景创新
一、AI 赋能慢病管理:技术驱动医疗革新 1.1 核心技术原理解析 在当今数字化时代,人工智能(AI)正以前所未有的态势渗透进医疗领域,尤其是在慢性病管理方面,展现出巨大的潜力和独特优势。其背后依托的机器学习、深度学习、自然语言处理(NLP)以及物联网(IoT)与可穿戴设…...
