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

C++11——统一的 { } 初始化

1. C11简介在2003年 C标准委员会曾经提交了一份技术勘误表(简称TC1)使得 C03 这个名字已经取代了C98称为 C11之前的最新C标准名称。不过由于 C03(TC1) 主要是对 C98 标准中的漏洞进行修复语言的核心部分则没有改动因此人们习惯性的把两个标准合并称为C98/03标准。从C0x 到 C11C标准10年磨一剑第二个真正意义上的标准珊珊来迟。相比于C98/03 C11则带来了数量可观的变化其中包含了约140个新特性以及对C03标准中约600个缺陷的修正这使得C11更像是从C98/03中孕育出的一种新语言。相比较而言C11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全不仅功能更强大而且能提升程序员的开发效率公司实际项目开发中也用得比较多。C11 - cppreference.com2. 统一的列表初始化2.1 {}初始化在C98中标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。例如#includeiostream using namespace std; struct Point { int a; int b; }; int main() { //这种使用{}去初始化统称为列表初始化 int arr1[] { 1,2,3,4,5 }; int arr2[5] { 0 }; Point p { 1,2 }; //这个结构体变量的初始化可以认为它延续了C语言的用法 return 0; }而C11扩大了用{} 括起的列表(初始化列表)的使用范围使其可用于所有的内置类型和用户自定义的类型使用初始化列表时可添加等号()也可不添加。它秉承的思想就是一切都可以使用列表来初始化并且可以省略赋值符号。例如int main() { int i 0; int j { 1 }; int k{ 2 }; return 0; }还有int main() { int arr1[]{ 1,2,3,4,5 }; int arr2[5]{ 0 }; Point p{ 1,2 }; //这些都可以认为是兼容了C语言只是可以省略赋值符号 return 0; }当然这种写法是不推荐的之前的写法就很好没必要使用新写法可以看懂新写法就可以。2.1.1关于自定义类型的 { } 初始化int main() { Point p { 1,2 }; //C语言的结构体可以这样初始化认为是延续了C语言的用法 //而 日期Date类 按理说是不可以这样初始化的需要去调用构造函数 Date d1(2025, 6, 18); //但现在 Date类也可以使用{} 去初始化并且可以省略赋值符号 Date d2 { 2025,6,19 }; Date d3{ 2025,6,20 }; //单参数的构造函数支持隐式类型转换如 string s hello; //编译器使用 hello 去构造一个临时对象再使用临时对象去拷贝构造s //--注意编译器优化为了直接构造 Date d4 { 2025,6,19 }; //这里本质上还是会转换成去调用构造函数 //看似和d1的构造过程一样实际是不一样的它会发生类型转换和string s的构造过程一样 d4的构造是 类型转换 -- 构造拷贝构造 - 优化为直接构造 return 0; }证明2.1.1.1对自定义类型数组初始化的扩展//C11之前 初始化自定义类型数组的方式 Date* p1 new Date[3]{d1,d2,d3}; //C11扩大{}的使用范围后 Date* p2 new Date[3]{ {2025,6,9},{2024,6,8},d4 }; //可以认为是对单参数构造函数隐式类型转换的扩展 //使得多参数构造函数也可以进行隐式类型转换2.2initializer_listC11给容器提供了一种新的初始化的方式int main() { vectorint v { 1,2,3,4,5 }; listint li { 2,3,4,5,6 }; //上面的初始化方式 看起来和 下面的Date类的初始化方式相似但本质上是不同的 Date d { 2025,6,7 }; //多参数构造的类型转换 -- 构造拷贝构造 - 优化为直接构造 //因为Date只有三个参数的构造函数所以这里必须书写三个参数 //但容器的初始化并不会限制参数的个数 vectorint v2 { 1,2 }; //那么容器的这种初始化方式如何实现呢 //难道去书写很多个不同的构造函数吗显然是不可能的。 return 0; }事实上C11提供了一种新的类initializer_list同时给容器也提供了一个新的构造函数代码举例int main() { //会把列表的值 默认情况下 可以识别成 initializer_list auto i { 1,2,8,9 }; //编译器在语法层面进行的强行的识别 cout typeid(i).name() endl; Date d { 2025,6,7 }; //这里会识别成 类型转换使用 2025,6,7 去构造一个Date的临时对象 initializer_listint il { 1,2,3 }; return 0; }输出如下2.2.1 理解底层2.2.2 迭代器initializer_list支持迭代器所以它可以像其它容器一样去遍历代码如下int main() { initializer_listint il { 1,2,3 }; initializer_listint::iterator it il.begin(); //使用迭代器遍历 while (it ! il.end()) { cout *it ; it; } cout endl; //使用范围for遍历 for (int t : il) { cout t ; } cout endl; return 0; }输出结果如下2.2.3 vector的initializer_list构造由此也就可以理解容器的initializer_list构造函数是如何实现的了底层行为不同的两种初始化方式vectorint v { 1,2,3,4,5 }; vectorint v1({ 1,2,5,6,3 }); listint li { 2,3,4,5,6 };模拟实现容器的initializer_list构造函数2.2.4 map的initializer_listint main() { pairstring, string kv1(left, 左边); mapstring, string mp { kv1,{right,右边},{add,添加} }; //很新奇的初始化写法 //相当于把 { kv1,{right,右边},{add,添加} } //识别成了 initializer_list pairstring, string 类型 //外面的{ } 表示这是initializer_list类型 //里面的 { } 是隐式类型转换使用参数去构造pair类型的对象 return 0; }2.2.5 Date类的initializer_list因为Date类中没有写initializer_list的构造函数所以会报错2.2.6initializer_list的总结可以看出initializer_list最大的作用就是使得容器也可以使用 { } 来初始化当然底层是通过initializer_list的构造函数来实现的。2.2.7 补充initializer_list的赋值重载函数也是存在的代码示例vectorint v{1,2,5,9};v{5,9,6};2.3 { } 初始化的总结{ } 初始化可以分为三个部分一、C语言就支持的使用 { } 来初始化#includeiostream using namespace std; struct Point { int a; int b; }; int main() { //这种使用{}去初始化统称为列表初始化 int arr1[] { 1,2,3,4,5 }; int arr2[5] { 0 }; Point p { 1,2 }; //这个结构体变量的初始化可以认为它延续了C语言的用法 return 0; }二、C11对 { } 的使用范围进行了扩展int main() { int i 0; int j { 1 }; int k{ 2 }; int arr1[]{ 1,2,3,4,5 }; int arr2[5]{ 0 }; Point p{ 1,2 }; Date d2 { 2025,6,19 }; Date d3{ 2025,6,20 }; return 0; }三、initializer_list的出现使得容器也可以使用{}来初始化vectorint v { 1,2,3,4,5 }; vectorint v1({ 1,2,5,6,3 }); listint li { 2,3,4,5,6 };

相关文章:

C++11——统一的 { } 初始化

1. C11简介 在2003年 C标准委员会曾经提交了一份技术勘误表(简称TC1),使得 C03 这个名字已经取代了C98,称为 C11之前的最新C标准名称。不过由于 C03(TC1) 主要是对 C98 标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习…...

【C++笔记】二叉搜索树

前言 各位读者朋友们大家好!上期我们讲完了面向对象编程三大属性之一的多态,这一期我们再次开始数据结构二叉搜索树的讲解。 目录前言一. 二叉搜索树的概念二. 二叉搜索树的性能分析三. 二叉搜索树的插入四. 二叉搜索树的查找五. 二叉搜索树的删除六. 二…...

PyCaret特征工程:轻松构建专业级特征缩放与选择Pipeline

PyCaret特征工程:轻松构建专业级特征缩放与选择Pipeline 【免费下载链接】pycaret An open-source, low-code machine learning library in Python 项目地址: https://gitcode.com/gh_mirrors/py/pycaret PyCaret是一款开源的低代码机器学习库,它…...

Win-Debloat-Tools计划任务管理:优化系统后台运行的终极指南

Win-Debloat-Tools计划任务管理:优化系统后台运行的终极指南 【免费下载链接】Win-Debloat-Tools Re-imagining Windows like a minimal OS install, already debloated with minimal impact for most functionality. 项目地址: https://gitcode.com/gh_mirrors/w…...

Vue项目改造指南:轻松修改启动后的Logo和名称

目录 前言 一、修改前的准备工作 1.1 了解项目结构 1.2 准备素材 二、修改浏览器标签页图标和标题 2.1 替换Favicon图标 2.2 修改网页标题 2.3 验证修改效果 总结 前言 在Vue项目开发中,我们经常需要根据项目需求修改默认的品牌标识。无论是企业级管理系统…...

Django-Oscar优惠券与促销系统:10种营销策略的终极实现指南

Django-Oscar优惠券与促销系统:10种营销策略的终极实现指南 【免费下载链接】django-oscar django-oscar/django-oscar: 是一个基于 Django 的电子商务框架,可以用于快速开发和部署电子商务网站,提供了多种电子商务功能和插件扩展。 项目地…...

基于代价的连接条件下推,金仓数据库让我们不在焦虑

你是否遇到过这样的场景:一个看似复杂的SQL,在测试环境运行飞快,一到生产环境就"卡死",一查执行计划,发现子查询生成了一个巨大的中间结果集,导致后续操作全部陷入性能泥潭? 如果你正…...

复杂查询中 JOIN 条件下推失败导致的性能瓶颈-金仓数据库

文章目录前言一、问题背景1.1 客户场景中的典型痛点1.2 业界普遍面临的两大难点1.2.1 语义安全性(Equivalence)1.2.2 代价评估(Cost)二、传统方案的局限2.1 完整执行子查询2.2 生成庞大的中间结果集2.3 再与外层表进行 JOIN三、金…...

WHAT - 缓存命中 Cache Hit 和缓存未命中 Cache Miss

文章目录一、什么是缓存命中二、前端开发要知道哪些缓存机制(以及命中条件)1. 浏览器缓存(主要针对静态资源)常见的缓存位置关键 HTTP 头字段(决定命中与否)2. 前端应用层缓存(例如数据请求&…...

一文搞定常见网络安全技术:网络攻击与核心防范手段全景解析(建议收藏)

伴随着互联网的发展,它已经成为我们生活中不可或缺的存在,无论是个人还是企业,都离不开互联网。正因为互联网得到了重视,网络安全问题也随之加剧,给我们的信息安全造成严重威胁,而想要有效规避这些风险&…...

Linux网络安全从入门到精通:基础命令、安全配置与实战案例(保姆级教程)

Linux网络安全一直是IT行业中备受关注的话题,而红帽作为Linux操作系统的知名发行版,在网络安全领域也扮演着重要的角色。红帽公司一直致力于为用户提供安全可靠的Linux解决方案,以帮助用户建立强大的网络安全防护体系。 首先,红帽…...

cobbler + pxe+dhcp+tftp+httpd+kickstart无人值守装系统

一、cobbler简介 cobbler是基于Python2开发并整合pxe+kickstart技术的二次封装工具,简化了安装部署流程,增加了对多发行版的支持,并且有独立的web管理页面,极大方便了运维初级人员的学习和使用。另外cobbler还提供了API,方便二次开发。 该文章主要介绍使用cobbler自动装机…...

网络安全岗位全解析:从入门到优秀工程师的进阶路线图(建议收藏)

网络安全是什么? 首先说一下什么是网络安全? 网络安全工程师工作内容具体有哪些? 网络安全是确保网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而受到破坏、更改、泄露,系统连续可靠正常地…...

如何快速掌握Embark框架:从代码规范到贡献流程的完整指南

如何快速掌握Embark框架:从代码规范到贡献流程的完整指南 【免费下载链接】embark 项目地址: https://gitcode.com/gh_mirrors/emb/embark Embark是一个功能强大的区块链开发框架,它简化了以太坊DApp的开发流程,提供了从智能合约编译…...

RLHF在多模态领域的应用:MM-RLHF框架与视觉语言模型对齐技术

RLHF在多模态领域的应用:MM-RLHF框架与视觉语言模型对齐技术 【免费下载链接】awesome-RLHF A curated list of reinforcement learning with human feedback resources (continually updated) 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-RLHF 多…...

从入门到精通:LedisDB命令完全指南,解锁高性能数据存储操作

从入门到精通:LedisDB命令完全指南,解锁高性能数据存储操作 【免费下载链接】ledisdb 项目地址: https://gitcode.com/gh_mirrors/led/ledisdb LedisDB是一款兼容Redis协议的高性能数据存储系统,支持多种数据结构和高级功能。本文将全…...

ExLlamaV2动态批处理生成器深度解析

ExLlamaV2动态批处理生成器深度解析 【免费下载链接】exllamav2 A fast inference library for running LLMs locally on modern consumer-class GPUs 项目地址: https://gitcode.com/gh_mirrors/ex/exllamav2 引言:大模型推理的性能瓶颈与解决方案 在大语言…...

每日八股文6.12

每日八股-6.12计算机网络1.当我们在浏览器中输入一个 URL 并按下回车后,到页面最终显示出来,这中间都发生了哪些关键步骤?2.请简述一下 JWT(JSON Web Tokens)的原理和校验机制3.DNS 是如何进行域名解析的?它…...

SecretVault强网杯2025 Web题解:从JWT绕过到HTTP头注入的实战剖析

1. 初探SecretVault:一个看似简单的Web应用 最近在复盘强网杯2025的一道Web题目,叫SecretVault。这道题挺有意思的,它表面上是一个密码保险箱应用,你可以登录、注册,然后把你的各种账号密码加密存进去。题目环境一打开…...

用UE5 Multi-User Editing实现远程团队协作:公网部署+会话管理全流程解析

用UE5 Multi-User Editing实现远程团队协作:公网部署会话管理全流程解析 最近和几个分布在不同城市的朋友一起捣鼓一个UE5的独立项目,最大的痛点就是资产和场景的同步。今天传个地图,明天发个蓝图,版本很快就乱成一锅粥。直到我们…...

Fabric、FISCO BCOS与以太坊:三大区块链平台的技术架构与应用场景解析

1. 开篇:为什么需要了解不同的区块链平台? 如果你刚开始接触区块链,可能会觉得眼花缭乱。以太坊、Fabric、FISCO BCOS……这些名字听起来都很厉害,但它们到底有什么区别?我该用哪个?这就像你要盖房子&#…...

幻兽帕鲁服务器搭建全攻略:从SteamCMD到端口转发一步到位

幻兽帕鲁私服搭建实战:从零构建稳定可联机的专属世界 最近身边不少朋友都沉迷于《幻兽帕鲁》这款游戏,但官服有时难免会遇到延迟、排队或者想和固定小圈子朋友一起玩的限制。于是,自己动手搭建一个专属服务器的念头就冒了出来。这听起来像是资…...

Charles实战:手把手教你模拟复杂网络环境下的弱网测试

1. 为什么你的App一到地铁里就卡?聊聊弱网测试那点事 不知道你有没有遇到过这种情况:早上通勤,在地铁里刷着新闻App,图片半天加载不出来,刷个短视频一直转圈圈,甚至点个外卖提交订单时直接卡死闪退。你可能…...

从柳树皮到实验室:水杨酸合成技术演进与化妆品原料安全标准解析

从柳树皮到实验室:水杨酸合成技术演进与化妆品原料安全标准解析 当我们谈论护肤品中的“刷酸”时,水杨酸几乎是一个绕不开的名字。它被成分党们奉为对抗黑头、闭口和痘痘的利器,但很少有人去深究,涂抹在脸上的那一滴精华或乳霜里&…...

[QCM6125][Android13] 关闭dm-verity后OTA升级兼容性校验的应对策略

1. 从一次失败的OTA升级说起:关闭dm-verity后的连锁反应 最近在折腾一块基于高通QCM6125平台的开发板,系统是Android 13。为了让设备获得更高的灵活性,比如能直接remount /分区进行一些调试和修改,我按照老习惯把dm-verity给关掉了…...

差分进化算法:从理论到实战的全局优化利器

1. 为什么说差分进化是你的下一个“秘密武器”? 大家好,我是老张,在AI和算法优化这个行当里摸爬滚打了十几年。今天想跟你聊聊一个我特别钟爱,并且在实际项目中屡建奇功的算法——差分进化。你可能听说过遗传算法、粒子群优化&…...

GIS开发必知:EPSG 4326和3857坐标系到底怎么选?附OpenLayers实战代码

GIS开发坐标系抉择:从原理到实战,深度解析4326与3857 最近在帮团队重构一个老旧的WebGIS项目时,我又一次被坐标系问题绊住了。数据源是标准的WGS84经纬度,但前端地图库默认渲染的却是Web墨卡托投影。页面上的几何图形拉伸变形&…...

基于eNSP的IPv4/IPv6双栈网络高可用与安全融合设计【企业园区网实战】

1. 项目背景与设计目标:为什么需要双栈高可用园区网? 大家好,我是老陈,一个在园区网里摸爬滚打了十多年的老网工。这些年,我亲眼看着网络从纯IPv4,到各种过渡技术,再到如今IPv6的全面铺开。很多…...

麒麟勒索软件攻击朝日集团事件解析:如何保护企业免受RaaS平台威胁

麒麟勒索软件攻击朝日集团事件解析:如何保护企业免受RaaS平台威胁 最近,一家全球知名的制造业巨头遭遇的网络攻击事件,在安全圈内外都引发了不小的震动。生产线停摆、供应链中断、敏感数据泄露,这些看似只存在于新闻中的场景&…...

智能工厂四大系统协同实战:ERP/PLM/MES/WMS数据流与接口设计全解析

1. 从“各自为政”到“协同作战”:为什么你的系统总在“打架”? 我干了这么多年智能工厂的规划和落地,发现一个特别普遍的现象:很多老板花大价钱上了ERP、PLM、MES、WMS,结果呢?数据还是对不上,…...