当前位置: 首页 > article >正文

关于C++11的统一初始化语法示例详解

前言本文主要给大家介绍了C11统一初始化语法的相关内容关于在当前新标准C11的语法看来变量合法的初始化器有如下形式1234X a1 {v};X a2 {v};X a3 v;X a4(v);其实上面第一种和第二种初始化方式在本质上没有任何差别添加则是一种习惯上的行为。使用花括号进行的列表初始化语法其实早在C98时代就有了只不过历史上他们只是被用来对数组元素进行初始化操作以及初始化自定义POD类型的数据(简单理解就是可以memcpy复制对象的类型)。比如123intv1[] {1, 2, 3, 4};intv2[5] {1,2,3};charmsg hello, world!;在使用列表来初始化数组的时候如果声明数组的时候没有指定数组尺寸大小则编译器就使用其列表包含的元素个数自动计算数组的尺寸如果提供了数组尺寸但是列表的元素数目小于数组尺寸则系统会将剩余的元素全部赋值为0。如果是字符数组的话C还支持使用字符串常亮来进行初始化。一、C11的统一初始化器在新标准C11中这个东西使用范围和特性被大大的扩展了而且已经成为了一个基础而又重要的利器几乎可以执行任何的初始化操作所以也被称为”Uniform initialization”尽管国内还是习惯上称为列表初始化。因为他可以避免传统初始化中的诸多问题和缺陷所以从Bjarne Stroustrup爷爷的《C 程序设计语言》描述口吻看来列表初始化是被大力推荐使用的即便用惯旧式初始化的C程序员初看起来会很不习惯但C强烈建议使用上述第一种方式进行统一初始化操作。C11还引入了atomic原子类型这种类型的变量(比如std::atomic)是无法使用传统方式进行初始化的只能使用{}或者()方式进行初始化对于自定义类如果其非静态成员变量具有默认值则这个默认值只能用{}或者进行初始化。总之也只有{}相比于其他类型可以用于任何位置所以称为统一初始化器也不足为怪了。防止类型收窄这是列表初始化的一个非常重要的特性因为C有很多隐式转换操作的发生比如浮点类型隐式转换为整形、长整型转换为短整型导致数据丢失高精度的数据转换为低精度的数据但凡是数据转换一次后再向回转换而不能得到原有表示的情况下都可以称之为类型收窄。类型收窄常常会导致数据精度丢失甚至潜在有意或无意错误的发生尤其是那些不喜欢看编译警告的程序员常常会被忽略掉这些提示而通过列表初始化的语法编译器在编译期间进行这方面的强制检查如果发生类型收窄则强制编译失败从而能够杜绝相关问题的发生。除了上面的优势之外列表初始化语法还可以杜绝C重构造语法的阴暗面。C秉承的一个观念就是任何可以被解释为声明语法的语句都会被解释为声明语句这会导致调用默认构造函数创建对象的时候被用错。12Widget w();// 被解释为函数声明Widget w{};// OK另外一种情况就是在容器使用的时候也比较容易产生混淆的语义这个时候使用列表初始初始化语法可以表明我们提供的列表是实际的元素。因为容器类的构造函数具有使用std::initializer_list作为重载的版本所以如果要显式调用其某个版本的构造函数就需要使用()来规避std::initializer_list的版本称之为ctor-resort。123vectorint v1{99};// 一个元素值为99vectorint v2(99);// 实际是调用构造函数共99个元素默认值都是0vectorstring v2(hello);// Error无匹配的构造函数二、统一初始化器的阴暗面使用列表初始化语法在绝大多数情况都能胜任而且工作的很好但是一旦同std::initializer_list结合起来它的使用就会让人感觉混淆不清。在auto进行类型自动推导的时候{}会默认被推导为std::initializer_list如果这种结果不是你想要的就需要进行规避以使用其他方式进行初始化操作。12auto z1 {99};// initializer_listintauto z2 99;// int如果你认为避免上面那个坑就结束了呵呵……统一初始化器最大的麻烦还在于其和构造函数的结合。如果某个类的构造函数其提供了一个接收std::initializer_list作为参数类型的重载版本那么使用统一初始化句法进行构造对象的时候编译器将会强烈优先使用具有初始化列表的重载版本。我们知道以std::initializer_list作为形参的话其实参列表中的元素不要求和T完全匹配而只需要能转换成T即可此时只要转换后满足要求编译器都会优先使用std::initializer_list作为形参的重载版本即使其他重载的构造函数具有更优的匹配。在转换的过程中如果类型提升满足要求则会正常调用如果发生了窄化转换则调用会失败报错只有诸如字符串和数字这类无法转换的类型相互重载时候重载机制才可能正常工作。1234567structWidget {Widget(inti,boolb) { cout 1 endl; }Widget(inti,doubled) { cout 2 endl; }Widget(std::initializer_listbool il) { cout 3 endl; }};Widget w1{1,true};// 3Widget w2{9,true};// Error还有一个极端情况如果一个自定义类既有默认构造函数也有std::initializer_list作为参数的构造函数则使用{}作为初始化值构造对象的话C标准显式规定了调用其默认构造函数如果想要以空列表的语义调用第二个版本则可以使用({})的方式进行初始化。三、C对象的默认初始化行为列表初始化还允许使用空列表{}作为初始化器这时候元素都使用默认值进行初始化或者调用自定义类型的默认构造函数所以列表初始化的变量其默认行为都是良好的。对于我们自定义的数据类型如有必要也可以在具体调用的时候不需要具体元素类型为T只要能转化成T即可在构造函数中使用迭代器访问列表中的每个元素。C规定如果定义的变量没有指定初始化器则全局变量、名字空间变量、局部static变量、static成员将会执行相应数据类型的空列表{}初始化而对于局部变量、自由存储区上的变量(堆对象)除非它们定义于用户自定义类型的默认构造函数中否则不会执行默认初始化这种情况是需要格外需要注意的操作未初始化变量可能会造成不确定的行为。12int* p{newint{} };char* q{newchar[2014]{} }呵呵如果突然看着一大坨C代码使用{}进行初始化可能会一时间觉得奇怪不过习惯也就好啦总结以上就是这篇文章的全部内容了本文还有许多不足希望本文的内容对大家的学习或者工作具有一定的参考学习价值

相关文章:

关于C++11的统一初始化语法示例详解

前言本文主要给大家介绍了C11统一初始化语法的相关内容,关于在当前新标准C11的语法看来,变量合法的初始化器有如下形式:1234X a1 {v};X a2 {v};X a3 v;X a4(v);其实,上面第一种和第二种初始化方式在本质上没有任何差别&#xff…...

Win11Debloat:免费Windows系统优化工具终极指南,轻松提升44%性能

Win11Debloat:免费Windows系统优化工具终极指南,轻松提升44%性能 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other change…...

云端还是本地?哪种RFID固定资产系统更合适你的企业?

在数字化转型的浪潮中,越来越多的企业认识到RFID固定资产管理系统的重要性。但当真正准备引进系统时,一个关键却绕不开的问题便摆在面前:到底该选云端还是本地部署?这不仅仅是技术路线的选择题,更关乎企业的成本结构、…...

Ostrakon-VL-8B数据预处理详解:餐饮图像清洗与标注规范

Ostrakon-VL-8B数据预处理详解:餐饮图像清洗与标注规范 如果你正在尝试训练或微调像Ostrakon-VL-8B这样的视觉语言模型,来让它更好地理解餐饮场景,那你肯定知道,数据质量是决定成败的关键。模型再强大,如果喂给它的是…...

推荐2款无需安装实用软件,桌面图标整理设置,简真是Windows神器!

聊一聊今天给大家推荐2款桌面美化小工具。为什么觉得要推荐这个小工具呢?因为最近帮一些人远程处理一些问题。感觉那电脑桌面,密密麻麻,全是小图标。我想找个东西都难,是太难了。我真恨不得上手整理。但又怕整理了,人家…...

mini-job极简分布式延迟任务队列 — 基于 Redis,支持 Cron 周期任务、异步协程和多执行器

mini-job 极简分布式延迟任务队列 — 基于 Redis,支持 Cron 周期任务、异步协程和多执行器。 特性特性说明延迟任务设定延迟秒数,到期自动执行Cron 周期调度支持标准 cron 表达式(分 时 日 月 星期)三种执行器async 协程&#xff…...

内网IP如何申请SSL证书?

一、为什么需要内网IP证书? 很多企业有一个误区:认为“只有域名才能做HTTPS”,或者“内网用HTTP没关系”。现实恰恰相反: 合规硬指标:《数据安全法》等法规明确要求数据传输必须加密,内网明文传输在等保测…...

FastAPI + PostgreSL 实战:给应用装上“缓存”和“日志”翅膀

1. 哑铃图是什么? 哑铃图(Dumbbell Plot),有时也称为DNA图或杠铃图,是一种用于比较两个相关数据点的可视化图表。 它源于人们对更有效数据比较方式的持续探索。 在传统的时间序列比较中,我们通常使用两条折…...

PMC Organometallix宣布所有产品提价

鉴于市场环境发生重大变化,PMC Organometallix, Inc. 宣布,自2026年5月1日起(或根据合同条款允许的时间),全球所有产品线的价格将上调10%至25%。此次调整源于关键投入成本的持续压力,包括原材料成本上涨以及…...

网络安全渗透测试入门|无线安全渗透与防御完整教程

前言 这是给粉丝盆友们整理的网络安全渗透测试入门阶段无线安全渗透与防御教程 喜欢的朋友们,记得给我点赞支持和收藏一下,关注我,学习黑客技术。 1.Aircrack-ng简介 Aircrack- NG是一个完整的工具来评估Wi-Fi网络安全套件。 捕获&#x…...

告别Swagger默认丑界面!.NET Core 6项目集成Knife4jUI保姆级教程

.NET Core 6项目集成Knife4jUI:打造专业级API文档体验 在当今快节奏的开发环境中,API文档的质量直接影响着团队协作效率。许多.NET Core开发者虽然已经使用Swagger生成基础文档,却常常面临界面简陋、功能单一的问题。Knife4jUI作为Swagger UI…...

Qt项目拆分之术:如何用SUBDIRS把大工程拆成小模块(从app到lib的实战)

Qt项目模块化实战:用SUBDIRS构建可扩展工程架构 当你的Qt项目从几百行代码膨胀到数万行时,编译时间开始以分钟计算,团队协作频繁出现文件冲突,新成员面对庞杂的目录结构不知所措——这就是我们需要模块化拆分的临界点。上周我接手…...

5分钟搭建家庭电视直播系统:Kodi IPTV Simple完全指南

5分钟搭建家庭电视直播系统:Kodi IPTV Simple完全指南 【免费下载链接】pvr.iptvsimple IPTV Simple client for Kodi PVR 项目地址: https://gitcode.com/gh_mirrors/pv/pvr.iptvsimple 还在为电视直播体验烦恼吗?想用最简单的方式把网络直播源整…...

Python程序打包为EXE

PowerShell 用anaconda创建虚拟环境 conda -n create XXXconda initconda activate xxx进入要打包的文件夹中安装依赖pip install -r requirements.txt 打包pyinstaller -F -w main.py --clean --noconfirm...

软件产品负责人管理中的需求决策者

在软件开发领域,产品负责人(Product Owner)是决定产品成败的关键角色之一,而需求决策者则是这一角色的核心职能。他们不仅需要理解市场和用户需求,还要在资源有限的情况下,权衡优先级,确保团队交…...

【基于 macOS 虚拟机的 iMessage 批量消息处理技术实践】

一、研究背景与技术意义iMessage 作为苹果生态内置的原生通讯服务,依托系统底层优势,具备端到端加密、无运营商拦截、原生展示等特性,常用于企业内部事务提醒、授权用户服务告知等合规场景。在技术研究过程中,手动单条发送消息效率…...

从ArrayList到VectorSpecies:Java向量化开发全流程拆解,含GraalVM AOT+Linux perf火焰图调优实战

更多请点击: https://intelliparadigm.com 第一章:Java 25 向量 API 硬件加速概览 Java 25 正式将 jdk.incubator.vector 模块升级为标准 API(java.util.vector),标志着 JVM 首次原生支持跨平台向量化计算&#xff0c…...

Live Avatar数字人模型保姆级部署教程:4步搞定AI视频生成

Live Avatar数字人模型保姆级部署教程:4步搞定AI视频生成 1. 准备工作:硬件与软件环境检查 1.1 硬件要求详解 Live Avatar对硬件有明确要求,这是确保模型正常运行的基础: 显卡要求: 最低配置:单卡NVIDIA…...

如何提升域名价值——评估标准

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…...

深度对比:瑞芯微RK3588边缘盒子 vs 其他方案,在智慧油站车牌识别场景下的真实表现

智慧油站车牌识别实战:RK3588边缘计算盒子的性能突围战 当加油站开始拥抱智能化转型,车牌识别系统便成了连接物理世界与数字服务的"第一道闸机"。在华北某连锁油站的改造案例中,技术团队曾面临这样的困境:传统工控机处理…...

告别zipfile!用PyZipper给你的Python压缩文件加上AES-256密码锁(附中文乱码解决方案)

用PyZipper实现AES-256加密压缩:Python开发者的安全实践指南 在数据交换和备份场景中,ZIP文件是最常见的归档格式之一。但标准库zipfile提供的加密功能实际上非常脆弱——它使用的传统加密算法早在1999年就被证明可以在极短时间内被暴力破解。当我们需要…...

DownKyi:你的B站视频下载管家,从新手到高手的完整指南 [特殊字符]

DownKyi:你的B站视频下载管家,从新手到高手的完整指南 🎬 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音…...

Hypnos-i1-8B开发环境配置:VSCode远程连接与调试教程

Hypnos-i1-8B开发环境配置:VSCode远程连接与调试教程 1. 引言 如果你正在使用Hypnos-i1-8B这样的开源大模型,可能会遇到一个常见问题:本地电脑配置不够,而远程服务器上的开发体验又不够友好。今天我们就来解决这个痛点&#xff…...

DC‑1 靶机完整渗透思路 + 详细步骤(可直接复现)

核心思路:信息收集 → Drupal 远程代码执行 → 拿 Webshell → 数据库信息利用 → SUID 提权 → 拿 Root 与全部 Flag一、环境准备攻击机:Kali Linux(NAT 模式)靶机:DC‑1(VulnHub 下载,NAT 模式…...

从自动驾驶到机器人:双目视差生成点云在实际项目里怎么用?

从自动驾驶到机器人:双目视差生成点云在实际项目中的工程化实践 当机器人需要在未知环境中自主导航,或是自动驾驶汽车试图理解周围的三维空间时,双目视觉系统往往扮演着关键角色。不同于激光雷达的高成本,双目相机以相对经济的硬件…...

告别鬼影!用PyTorch复现动态场景HDR融合论文(附数据集构建与训练代码)

告别鬼影!用PyTorch复现动态场景HDR融合论文(附数据集构建与训练代码) 在计算机视觉领域,高动态范围(HDR)成像技术一直是研究热点。当面对动态场景时,传统HDR融合方法往往会产生令人头疼的"…...

2026年热门会议纪要神器实测对比转写整理全维度比拼,差距竟然这么大

做自媒体这几年,每天要转访谈录音、剪视频做字幕、整理线上分享内容,踩过不下10款转写工具的坑。这次特意把市面上主流的工具全部实测了一遍,负责任说:对比了多款工具,听脑AI是综合体验最好的,没有之一。 直…...

AWPortrait-Z问题解决:常见生成问题排查与优化技巧

AWPortrait-Z问题解决:常见生成问题排查与优化技巧 1. 常见生成问题诊断与修复 1.1 图像质量不理想的五大原因 当生成的人像效果不符合预期时,通常由以下原因导致: 提示词过于简单:仅使用"a beautiful woman"这类泛…...

如何3分钟搞定B站视频下载:DownKyi哔哩下载姬的终极免费方案

如何3分钟搞定B站视频下载:DownKyi哔哩下载姬的终极免费方案 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等…...

如何一键下载百度文库等30+文档平台?kill-doc脚本全攻略

如何一键下载百度文库等30文档平台?kill-doc脚本全攻略 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了…...