news 2026/5/1 10:12:20

【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/25 22:51:00

AI伦理讨论:CosyVoice3声音克隆是否会被滥用?如何防范风险

AI伦理讨论&#xff1a;CosyVoice3声音克隆是否会被滥用&#xff1f;如何防范风险 在某起新型电信诈骗案中&#xff0c;受害者接到一通“父亲”的求救电话&#xff0c;语气焦急、声音真实——直到警方介入才发现&#xff0c;这通语音是由AI通过社交平台公开音频片段克隆生成的…

作者头像 李华
网站建设 2026/5/1 7:30:51

NVIDIA GPU显存要求:至少4GB以上才能流畅运行

NVIDIA GPU显存要求&#xff1a;至少4GB以上才能流畅运行 在生成式AI迅速渗透各行各业的今天&#xff0c;语音合成已不再是实验室里的“黑科技”&#xff0c;而是走进了智能客服、有声书制作、虚拟主播等真实场景。阿里云开源的 CosyVoice3 正是这一趋势下的代表性产物——仅凭…

作者头像 李华
网站建设 2026/5/1 8:45:08

教育领域应用前景:CosyVoice3为视障人士提供语音支持

教育领域应用前景&#xff1a;CosyVoice3为视障人士提供语音支持 在盲校的一间教室里&#xff0c;一位学生戴上耳机&#xff0c;轻点播放键——耳边响起的不是冰冷机械的电子音&#xff0c;而是自己语文老师温柔熟悉的声音&#xff0c;正用带着情感的语调朗读着《背影》。这不再…

作者头像 李华
网站建设 2026/5/1 9:56:19

CAPL中时间同步与仿真时钟控制的技术细节

CAPL时间控制的艺术&#xff1a;如何精准驾驭仿真时钟与跨节点同步你有没有遇到过这样的场景&#xff1f;在CANoe里跑一个自动化测试&#xff0c;明明脚本写得逻辑清晰、报文顺序也对&#xff0c;结果ECU却“莫名其妙”地进入了错误状态。查来查去&#xff0c;问题出在一个50ms…

作者头像 李华
网站建设 2026/5/1 8:40:44

与其他开源项目联动:CosyVoice3 + LLM 构建完整对话系统

CosyVoice3 与 LLM 联动&#xff1a;构建有“情感”的对话系统 在智能语音助手越来越常见的今天&#xff0c;我们是否曾期待它们不只是冷冰冰地“念出答案”&#xff0c;而是像朋友一样&#xff0c;用熟悉的语调、带着情绪地说一句&#xff1a;“今天过得怎么样&#xff1f;”—…

作者头像 李华
网站建设 2026/4/30 1:58:53

在线课程开发计划:从入门到精通系统教学视频

在线课程开发计划&#xff1a;从入门到精通系统教学视频 在当今教育内容爆炸式增长的时代&#xff0c;教师面临一个现实困境&#xff1a;如何在保证教学质量的同时&#xff0c;高效产出大量音频与视频素材&#xff1f;传统录制方式不仅耗时耗力&#xff0c;还容易因状态波动导…

作者头像 李华