news 2026/4/18 7:23:55

【C++篇】C++11新特性总结1

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【C++篇】C++11新特性总结1

1,C++11的发展历史

C++11是C++的第二个主要版本,并且是从C++98起的最重要更新。C++11是C++编程语言的一个重要版本,于2011年正式发布。它引入了许多新特性和改进,极大地增强了 C++ 的功能和易用性。下面介绍它的一些主要特性:

2,列表初始化

2.1C++98传统的{}

在C++98中一般数组和结构体支持使用{}初始化。

struct point { int x; int y; }; int main() { int arr1[5] = {1,2,3,4,5}; point p = { 1,2 }; return 0; }

2.2,C++11中的{}

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; };

  • C++11后想统一初始化的方式,试图一切对象皆可使用{}初始化,{}初始化也叫列表初始化
  • 内置类型支持,自定义类型也支持,自定义类型本质是类型转换,中间会产生临时对象,经过编译器优化后变成直接构造

//C++11 //内置类型支持{}初始化 int x = { 2 }; //自定义类型 //本质是{2025,1,1}构造出临时对象,再拷贝给d1,但是编译器优化为直接用{2025,1,1}构造d1 Date d1 = { 2025,1,1 }; //这里的d2引用的是{2024,7,2}的临时对象 const Date& d2 = { 2024,7,2 }; //需要注意的是C++98支持单参数时类型转换,也可以不用加{} Date d3 = { 2025 }; Date d4 = 2025;

  • {}初始化可以省略=

//可以省略掉= int x2{ 2 }; point p1{ 1,2 }; Date d6{ 2025,1,2 }; const Date& d7{ 2024,8,15 };

  • C++11的列表初始化在许多场景下会带来不少的便利,如容器push/insert多参数构造的对象时,用{}会很方便。

vector<Date> v; //有名对象传参 v.push_back(d6); //匿名对象传参 v.push_back(Date(2025, 1, 2)); //比起有名对象和匿名对象,{}初始化更有性价比 v.push_back({ 2025,1,2 });

2.3,C++11中的std::initializer_list
  • 上面的初始化已经很方便,但是对于一个容器的初始化来说,还是不太方便。比如一个vector对象,我们想用N个值去初始化,那么我们需要实现多个构造函数才能支持:vector<int> v1={1,2,3},vector<int> v2={1,2,3,4},vector<int> v3={1,2,3,4,5};
  • C++11库中提供了一个std::initializer_list ,这个类的本质是底层开一个数组,将数据拷贝过来,std::initializer_list 中有两个指针分别指向数组的开始和结束。
  • 这时只要我们的容器支持一个std::initializer_list的构造函数,就可以支持多个值的{x1,x2,x3......}的初始化。STL中的 容器支持多个值构成的{x1,x2,x3,......}的初始化,就是通过底层支持std::initiaalizer_list的构造实现的。如下图list和vector的构造函数中都增添了支持std::initializer_list的构造函数。

vector<int> v1 = { 1,2,3,4,5 }; vector<int> v2 = { 1,2,3,4,5,6 }; //这里pair对象的{}初始化和map的initializer_list构造结合到一起了 map<string, string> dict = { {"sort","排序 "},{"string","字符串"} };

3,右值引用和移动语义

C++98中就有引用的语法,而C++11中新增了右值引用的语法特性,之前的引用叫做左值引用。无论左值引用还是右值引用,都可以理解为是在给变量取别名。

3.1,左值和右值
  1. 左值是一个表示数据的表达式(如变量名或解引用 的指针),一般是持久状态,存储在内存中,我们可以获取它的地址。左值可以出现在赋值符号的左边,也可以是在右边。如果左值用const修饰,就不能给它赋值,但可以取它的地址。
  2. 右值也是一个表示数据的表达式,要么是常量或者是临时对象等,右值可以出现在赋值符号的右边,但不能出现在左边,右值不能取地址。
  3. 左值的英文简写为lvalue,右值的英文简写为rvalue。传统认为它们分别是left value、right value 的缩写。现代C++中,lvalue被解释为loactor value的缩写,可意为存储在内存中、有明确存储地址可以取地址的对象,而rvalue被解释为read value,指的是那些可以提供数据值,但是不可以寻址,例如:临时变量,常量,存储于寄存器中的变量等,也就是说左值和右值的核心区别就是能否取地址
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 2:21:23

【C++篇】map和set的使用

本篇讲的map/set,其底层是红黑树&#xff0c;红黑树底层是一颗平衡二叉搜索树(具体可看之前的文章—二叉搜索树&#xff09;。set是key搜索场景下的结构&#xff0c;map是key/value搜索场景下的结构。 2&#xff0c;set系列的使用 2.1,set类的介绍 代码语言&#xff1a;java…

作者头像 李华
网站建设 2026/4/16 15:50:42

Newsletter内容策划:每月精选功能更新与用户故事

CosyVoice3&#xff1a;开源声音克隆技术如何重塑个性化语音生成 在短视频平台每天诞生数百万条配音内容的今天&#xff0c;你是否曾好奇——那些语调自然、情绪饱满的“AI主播”&#xff0c;是如何用几秒钟就复刻出一个真实人声的&#xff1f;更进一步&#xff0c;如果只需一段…

作者头像 李华
网站建设 2026/4/18 3:16:06

DownKyi视频下载工具完全指南:轻松获取B站高清视频

DownKyi视频下载工具完全指南&#xff1a;轻松获取B站高清视频 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff…

作者头像 李华
网站建设 2026/4/15 15:14:08

【工具】DeepWiki Devin|DeepWiki-open|自动为代码仓库生成图文并茂的详尽文档的网页工具

文章目录前言使用开源版本不开源版本注册生成仓库文档查看生成结果拓展脚本结语前言 我是在学习 libafl 的时候发现的这一个工具&#xff0c;我看不太懂它的 Qemu 的实现部分。然后一搜发现这个文档在整个搜索引擎的最上面点开之后&#xff0c;我发现它写的非常之详细&#xf…

作者头像 李华
网站建设 2026/4/16 17:28:38

混合精度推理实践:FP16加速而不损失音质

混合精度推理实践&#xff1a;FP16加速而不损失音质 在实时语音合成系统日益走向大众应用的今天&#xff0c;一个核心矛盾始终摆在开发者面前&#xff1a;如何在保证生成语音自然、清晰、富有情感的前提下&#xff0c;把模型推理延迟压到最低&#xff1f;尤其是在声音克隆这类对…

作者头像 李华