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

22 C++11 初始化新姿势:{} 统一初始化(省等号)+initializer_list 底层解析

Hellow! 你们好啊!,今天博主来介绍C++中的{ },有没有铁子会问这有什么介绍的,别急,往下看看就知道了,再问一句铁子们最近秋招的战况如何啊。


1 列表初始化

1 C++98传统的{ }

C++98中⼀般数组和结构体可以⽤{}进⾏初始化。
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 C++11中的{}

C++11以后想统⼀初始化⽅式,试图实现⼀切对象皆可⽤{}初始化,{}初始化也叫做列表初始化。

• 内置类型⽀持,⾃定义类型也⽀持,⾃定义类型本质是类型转换,中间会产⽣临时对象,最后优化 了以后变成直接构造。

• {}初始化的过程中,可以省略掉=

• C++11列表初始化的本意是想实现⼀个⼤统⼀的初始化⽅式,其次他在有些场景下带来的不少便 利,如容器push/inset多参数构造的对象时,{}初始化会很⽅便

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 array1[] = { 1, 2, 3, 4, 5 };//int array2[5] = { 0 };//Point p = { 1, 2 };*/////c++11{}初始化也叫做列表初始化////内置类型⽀持,⾃定义类型也⽀持,⾃定义类型本质是类型转换,//// 中间会产⽣临时对象,最后优化了以后变成直接构造。////{}初始化的过程中,可以省略掉=//// C++11⽀持的//// 内置类型⽀持//int x1 = { 2 };//// ⾃定义类型⽀持//// 这⾥本质是⽤{ 2025, 1, 1}构造⼀个Date临时对象//// 临时对象再去拷⻉构造d1,编译器优化后合⼆为⼀变成{ 2025, 1, 1}直接构造初始化//Date d1 = { 2025, 1, 1 };//// 这⾥d2引⽤的是{ 2024, 7, 25 }构造的临时对象//const Date& d2 = { 2024, 7, 25 };//// 需要注意的是C++98⽀持单参数时类型转换,也可以不⽤{}//Date d3 = { 2025 };//Date d4 = 2025;//// 可以省略掉=//Point p1{ 1, 2 };//int x2{ 2 };//Date d6{ 2024, 7, 25 };//const Date& d7{ 2024, 7, 25 };//// 不⽀持,只有{}初始化,才能省略=//// Date d8 2025;//vector<Date> v;//v.push_back(d1);//v.push_back(Date(2025, 1, 1));//// ⽐起有名对象和匿名对象传参,这⾥{}更有性价⽐//v.push_back({ 2025, 1, 1 });

2 C++11中的std::initializer_list

• 上⾯的初始化已经很⽅便,但是对象容器初始化还是不太⽅便,⽐如⼀个vector对象,我想⽤N个值去构造初始化,那么我们得实现很多个构造函数才能⽀持, vector<int> v1 ={1,2,3};vector<int> v2 = {1,2,3,4,5};

• C++11库中提出了⼀个std::initializer_list的类, auto il = { 10, 20, 30 }; // thetype of il is an initializer_list ,这个类的本质是底层开⼀个数组,将数据拷⻉过来,std::initializer_list内部有两个指针分别指向数组的开始和结束。

• 这是他的⽂档:initializer_list,std::initializer_list⽀持迭代器遍历。

https://legacy.cplusplus.com/reference/initializer_list/initializer_list/

• 容器⽀持⼀个std::initializer_list的构造函数,也就⽀持任意多个值构成的 {x1,x2,x3...} 进⾏初始化。STL中的容器⽀持任意多个值构成的 {x1,x2,x3...} 进⾏初始化,就是通过std::initializer_list的构造函数⽀持的。

#include<iostream> 1
#include<vector>
#include<string>
#include<map>
using namespace std;int main()
{
std::initializer_list<int> mylist;
std::initializer_list<int> mylist3 = { 1,2,3,43,2 };//构造加拷贝构造
std::initializer_list<int> mylist1(mylist);//拷贝构造
std::initializer_list<int> mylist2({ 1,1,1,1});//构造加拷贝构造
mylist = { 10, 20, 30 };
cout << sizeof(mylist) << endl;
// 这⾥begin和end返回的值initializer_list对象中存的两个指针
// 这两个指针的值跟i的地址跟接近,说明数组存在栈上
int i = 0;
cout << mylist.begin() << endl;
cout << mylist.end() << endl;
cout << &i << endl;// {}列表中可以有任意多个值
// 这两个写法语义上还是有差别的,第⼀个v1是直接构造,
// 第⼆个v2是构造临时对象+临时对象拷⻉v2+优化为直接构造
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 };
// 这⾥是pair对象的{}初始化和map的initializer_list构造结合到⼀起⽤了
map<string, string> dict = { {"sort", "排序"}, {"string", "字符串"}};
// initializer_list版本的赋值⽀持
v1 = { 10,20,30,40,50 };
return 0;
}

总结:

如果当前容器支持initializer_list构造的话,那么这个initializer_list中就存放对应容器存储的元素就行了

比如vector<int> v,这个v对象存储的元素是int类型,那么initializer_list对象中也要存储int类型的数据。


本期收录于博主的专栏——C++专栏,适用于编程初学者,感兴趣的朋友们可以订阅,不懂的地方也可以评论区留言哦。

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:小董 不懂  *( ̄▽ ̄)°★*

http://www.dtcms.com/a/389041.html

相关文章:

  • 黑马头条_SpringCloud项目阶段二:FreeMarker组件以及MinIO系统集成
  • MySQL 数据库基础操作指南:从创建管理到备份恢复全解析
  • 【Java】-- rjvm 项目分析
  • Markdown 常用语法参考
  • 11.2.3 固定话题聊天实现
  • CAN(控制器局域网)工业协议教学文档(一)
  • PHP基础-变量与常量(第八天)
  • SQ01,SQ02,SQ03,SE93事务码配置
  • AI提示词Excel 表格提取数据准确度处理
  • DeviceNet 转 EtherNet/IP 实现罗克韦尔 PLC 与库卡机器人在汽车白车身焊接的微秒级数据同步协作案例
  • GPT-5 vs Gemini 2.5 Pro:两大AI旗舰模型深度技术对比
  • 31、GPT核心引擎完整手工构建:从算法原理到工程优化(Generative Pre-trained Transformer)
  • MySQL MHA 完整配置与故障后原主库还原指南
  • 栈-946.验证栈序列-力扣(LeetCode)
  • spring boot3.0整合rabbitmq3.13
  • Scrapy爬虫利器:CrawlSpider详解
  • 从零开始学Flink:数据源
  • GRPO算法复现
  • AI+Flask博客项目实战提示词笔记 20250918
  • 无人设备遥控器之时间戳技术篇
  • 模块四 展望微服务
  • RN 添加 <NavigationContainer>组件报错
  • 深入理解 AVL 树
  • 软考中级习题与解答——第八章_计算机网络(2)
  • FinalShell远程连接CentOS下方文件列表信息不显示且刷新报空指针异常
  • 贪心算法应用:线性规划贪心舍入问题详解
  • 设计模式学习笔记(二)
  • 轻量化录屏插件,MP4输出格式
  • 静态代理 设计模式
  • Salesforce知识点:触发器:自动化业务逻辑的核心工具详解