news 2026/10/1 16:05:15

【C++进阶】C++ 11(上)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【C++进阶】C++ 11(上)

目录

1 C++11 发展历史

2 列表初始化(统一初始化)

2.1 C++98 时代的{}局限

2.2 C++11:一切对象都可以使用{}列表初始化

3 std::initializer_list

产生背景

上篇小结

1 C++11 发展历史

C++11 是 C++ 第二个主要版本,也是自 C++98 之后最重要的一次更新。在 2011‑08‑12 被 ISO 正式采纳,早期代号叫C++0x,原本预期 2010 年前完成,实际 C++03 到 C++11 间隔长达 8 年。 自此之后 C++ 保持大约每 3 年一个版本的迭代节奏:

表格

版本发布年份核心新增代表特性
C++981998模板、STL 容器算法、string、IO 流
C++112011移动语义、统一初始化、auto/decltype、lambda、constexpr、多线程、内存模型、正则、智能指针、哈希容器 unordered 系列、std::array
C++142014读写锁、泛型 lambda
C++172017折叠表达式、constexpr if、结构化绑定、string_view、STL 并行算法、filesystem、any/optional/variant
C++202020协程、模块、Concept、Ranges 库
C++232023deducing this、print 打印库、flat 关联容器、expected、mdspan

2 列表初始化(统一初始化)

2.1 C++98 时代的{}局限

C++98 中,{}仅仅只支持数组、结构体初始化,普通类对象不能直接使用大括号初始化。

#include<iostream> using namespace std; struct Point { int _x; int _y; }; int main() { int array1[] = {1,2,3,4,5}; int array2[5] = {0}; Point p = {1,2}; // 结构体支持 return 0; }
2.2 C++11:一切对象都可以使用{}列表初始化

C++11 提出统一列表初始化,目标做到:一切对象皆可使用{}初始化。

  1. 内置类型、自定义类对象全部支持;
  2. 可以省略赋值符号=;
  3. 底层会先用{...}构造临时对象,编译器优化后直接构造目标对象,不会发生拷贝;
  4. 向容器push_back / insert传参时,{}书写匿名对象非常便捷。
#include<iostream> #include<vector> using namespace std; struct Point { int _x; int _y; }; class Date { public: Date(int year = 1, int month = 1, int day = 1) :_year(year),_month(month),_day(day) { cout << "Date(int year, int month, int day)" << endl; } Date(const Date& d) :_year(d._year),_month(d._month),_day(d._day) { cout << "Date(const Date& d)" << endl; } private: int _year; int _month; int _day; }; int main() { // C++98原有写法 int a1[] = {1, 2, 3, 4, 5}; int a2[5] = {0}; Point p = {1, 2}; // ========= C++11列表初始化 ========= int x1 = {2}; Date d1 = {2025, 1, 1}; // 构造临时对象,编译器优化直接构造d1,不调用拷贝构造 const Date& d2 = {2024,7,25}; // 引用绑定临时对象,延长生命周期 Date d3 = {2025}; Date d4 = 2025; // 可以省略 = Point p1 {1,2}; int x2 {2}; Date d6 {2024,7,25}; const Date& d7 {2024,7,25}; vector<Date> v; v.push_back(d1); v.push_back(Date(2025,1,1)); // 直接{}传入匿名对象,代码更简洁 v.push_back({2025,1,1}); return 0; }

3 std::initializer_list

产生背景

有了{}初始化,但是vector<int> v = {1,2,3,4,5};这种直接用花括号初始化容器依然做不到。 我们希望可以直接传入任意数量参数完成容器构造,于是 C++11 引入std::initializer_list。

std::initializer_list<T>底层:内部保存一个数组,仅持有两个指针:begin指向数组起始,end指向数组末尾;支持迭代器遍历。 STL 所有容器都增加接收initializer_list的构造函数与赋值重载,才支持{1,2,3}直接初始化。

容器原型示意:

template<class T> class vector { public: vector(initializer_list<T> il); vector& operator=(initializer_list<T> il); // ...其他接口 };

示例代码:

#include<iostream> #include<vector> #include<map> using namespace std; int main() { std::initializer_list<int> mylist = {10,20,30}; vector<int> v1({1,2,3,4,5}); vector<int> v2 = {1,2,3,4,5}; const vector<int>& v3 = {1,2,3,4,5}; // map结合pair的{}初始化 map<string,string> dict = {{"sort","排序"},{"string","字符串"}}; // initializer_list版本赋值 v1 = {10,20,30,40,50}; return 0; }

重点:initializer_list只是代理对象,不负责保存数据本体,底层数组一般分配在栈上。

小结

  1. C++11 目标统一初始化语法,内置类型、自定义类都可以使用{};可以省略=。
  2. {}会生成临时对象,编译器返回值优化 RVO 会消除拷贝。
  3. std::initializer_list是容器支持{1,2,3}初始化的底层核心,内部只有首尾两个指针。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 16:05:15

同一份Android工程换了一个AI Agent,最先坏的可能不是代码

同一份Android工程换了一个AI Agent&#xff0c;最先坏的可能不是代码摘要&#xff1a;模型可以替换&#xff0c;但IDE提供的编译诊断、预览和模拟器工具并不天然等价。测试应把任务结果、工具使用和失败恢复一起纳入兼容矩阵。团队把同一份Android项目从Agent A切到Agent B。代…

作者头像 李华
网站建设 2026/10/1 16:05:15

HRTOS 内核内存架构设计:面向 8051 的分层资源管理

在 8051 这类资源高度受限的 MCU 上设计 RTOS&#xff0c;内存管理并不是简单地“把变量放进去”。与 ARM、RISC-V 等资源相对充裕的平台相比&#xff0c;8051 的 DATA、IDATA、BIT、XDATA 等存储区域具有明显不同的访问特性和容量限制。一个 RTOS 如果希望长期稳定运行&#x…

作者头像 李华
网站建设 2026/10/1 16:04:43

可以推荐几个不错的GEO优化服务商吗、GEO代运营公司实力参考

Q1&#xff1a;可以推荐几个不错的GEO优化服务商吗?这两年&#xff0c;越来越多的企业采购人习惯先问AI再找供应商&#xff0c;于是能不能被AI主动推荐成了新的获客门槛。GEO是Generative Engine Optimization的缩写&#xff0c;中文全称是生成式引擎优化&#xff0c;简单说就…

作者头像 李华
网站建设 2026/10/1 16:04:28

2026年中国微生物培养基用酵母提取物选型分析与推荐指南

在现代工业生物技术、医药发酵以及科研实验中&#xff0c;配制高效且质量可靠的微生物培养基是确保微生物顺利生长与代谢产物高效积累的基础。在挑选培养基核心原料时&#xff0c;许多科研人员与采购管理人员常会思考&#xff1a;培养基用酵母提取物推荐哪个牌子&#xff1f; 酵…

作者头像 李华
网站建设 2026/10/1 16:04:24

AI Data Agent三大支柱:Runtime、Plugin与Framework的协同设计

1. 这不是选“框架”还是“运行时”的问题&#xff0c;而是搞清“谁在干活、怎么分活、出了问题找谁”的问题你看到标题里那个“通用 Agent Runtime Plugin&#xff0c;还是 Agent Framework&#xff1f;”的问法&#xff0c;第一反应是不是像在挑手机&#xff1a;是买旗舰芯片…

作者头像 李华
网站建设 2026/10/1 16:03:33

创业公司办公设备选型:一台复印机背后的效率账

一、小公司真的适合「买一台便宜复印机」吗&#xff1f;很多初创团队的逻辑很直接&#xff1a;公司才十几个人打印量不大预算有限先买台入门级一体机&#xff0c;够用就行这个思路本身没问题&#xff0c;控制成本永远是第一优先级。但「够用」这个词&#xff0c;在真实办公场景…

作者头像 李华