news 2026/6/24 0:50:24

【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/6/20 16:30:01

阿里官方文档之外:社区贡献的CosyVoice3非官方使用技巧合集

阿里官方文档之外&#xff1a;社区贡献的CosyVoice3非官方使用技巧合集 在短视频、虚拟人和智能客服全面爆发的今天&#xff0c;个性化语音合成早已不再是实验室里的“黑科技”&#xff0c;而是内容创作者手中的标配工具。然而&#xff0c;大多数TTS系统要么音色呆板&#xff0…

作者头像 李华
网站建设 2026/6/17 17:17:45

线下沙龙活动预告:与AI爱好者面对面交流经验

与AI爱好者面对面&#xff1a;深度解析阿里开源语音克隆项目 CosyVoice3 在虚拟主播24小时不间断直播、智能客服能用家乡话和你聊天的今天&#xff0c;你有没有想过——这些“会说话”的AI&#xff0c;是如何学会模仿真人声音的&#xff1f;更进一步&#xff0c;它们能不能只听…

作者头像 李华
网站建设 2026/6/20 18:58:22

版权问题提醒:未经授权不得克隆他人声音商用

版权问题提醒&#xff1a;未经授权不得克隆他人声音商用 在虚拟主播一夜爆红、AI配音悄然渗透影视制作的今天&#xff0c;你有没有想过——那段听起来自然流畅的旁白&#xff0c;真的是真人录的吗&#xff1f;随着语音合成技术突飞猛进&#xff0c;只需几秒钟的声音样本&#x…

作者头像 李华
网站建设 2026/6/21 17:16:08

VS Fish Speech:CosyVoice3情感表达更自然的真实案例对比

VS Fish Speech&#xff1a;CosyVoice3情感表达更自然的真实案例对比 在虚拟主播的直播中&#xff0c;一句“恭喜你中奖了&#xff01;”如果用平淡无波的机械音念出&#xff0c;观众可能毫无反应&#xff1b;但若语气突然变得热情洋溢、语调上扬、节奏轻快——哪怕只是细微的停…

作者头像 李华
网站建设 2026/6/21 20:54:49

微信公众号推文规划:每周一篇深度技术文章

CosyVoice3&#xff1a;3秒克隆你的声音&#xff0c;还能听懂“用四川话说这句话” 你有没有想过&#xff0c;只需要一段3秒钟的录音&#xff0c;就能让AI完美复现你的声音&#xff1f;更进一步——你甚至可以用一句话告诉它&#xff1a;“用悲伤的语气读出来”、“换成粤语”…

作者头像 李华