【C++11】列表初始化
📝前言:
这篇文章我们来讲讲C++11引入的列表初始化{},注意这不是构造函数里的初始化列表!!!
在阅读文章之前,请你记住一句重点:万物皆可{}初始化
🎬个人简介:努力学习ing
📋个人专栏:C++学习笔记
🎀CSDN主页 愚润求学
🌄其他专栏:C语言入门基础,python入门基础,python刷题专栏,Linux
列表初始化
- 一,C++98 的 {}
- 二,C++11 的 {}
- 初始化内置类型
- 初始化自定义类型
- 隐式类型转换
- initializer_list
一,C++98 的 {}
C++98 中,一般数组和结构体可以用{}
进行初始化
如:
struct Date
{Date(int year = 1945, int month = 9, int day = 3):_year(year),_month(month),_day(day){}int _year;int _month;int _day;
};int main()
{// 数组int a[] = { 1,2,3,4 };// 结构体Date d1 = { 2025, 4, 25 };return 0;
}
二,C++11 的 {}
C++11 以后,⼀切对象皆可用{}
初始化({}
初始化也叫做列表初始化)
{}
初始化的特点:
- 内置类型支持,自定义类型也支持,自定义类型本质是类型转换,中间会产生临时对象,优化了以后变成直接构造
{}
初始化的过程中,可以省略掉=
(两者在编译器不优化时,过程略有区别)
初始化内置类型
以下三种写法效果相同⬇️
int a = 11;
int b = { 11 };
int c{ 11 };
初始化自定义类型
以下两种写法结果相同,但过程略有区别⬇️
Date d1 = { 2025 };
Date d2{ 2025, 4 };
本质:
d1
:先用{2025}
构造一个Date
临时对象(第二、三个参数用缺省值),再用临时对象拷贝构造d1
。(编译器优化,合二为一以后就是:用{2025}
直接构造d1
)d2
:直接使用提供的初始化值{ 2025, 4 }
来调用Date
合适的构造函数(即使编译器不优化也是一样)
其他引用场景⬇️
vector<Date> v;
v.push_back(d1); // 插入有名对象
v.push_back(Date(2025, 1, 1)); // 插入匿名对象// 更好用的:用{2025, 1, 1}构造一个临时对象
v.push_back({ 2025, 1, 1 });
隐式类型转换
再看Date d1 = { 2025 };
:其实是调用构造函数进行隐式类型转换,即:2025
变成Date
类型
C++98 已经支持了单参数构造函数的隐式类型转换:
Date d1 = { 2025 };
Date d2 = 2025; //与 d1 效果相同
C++11 以后,也支持多参数的:
Date d3 = { 2025, 4, 25 };
如果,想禁止构造函数用于隐式类型转换,可以在构造函数之前加:explicit
explicit Date(int year = 1945, int month = 9, int day = 3)
// 以下就无法执行:
// Date d1 = { 2025 };
// Date d3 = { 2025, 4, 25 };
initializer_list
initializer_list
给{}
初始化插上翅膀!
std::initializer_list
的本质是底层开⼀个数组,将数据拷贝过来,内部有两个指针分别指向数组的开始和结束
有什么作用呢?
STL中的容器都增加了⼀个initializer_list
的构造,容器的赋值也支持使用initializer_list
示例1:
vector<int> v1{ 1,2,3,4,5 }; // 和 vector<int> v1({ 1,2,3,4,5 }); 一样
vector<int> v2 = { 1,2,3,4,5 };
说明:
v1
:直接用initializer_list: {1,2,3,4,5}
来构造v2
:用initializer_list: {1,2,3,4,5}
构造一个临时对象,然后再用临时对象拷贝构造v2
【不过编译器优化成:{1,2,3,4,5}
直接构造v2
】
示例2:
map<string, string> dict1{ {"left","左边"},{"right", "右边"}};
说明:
{"left","左边"}
隐式类型转换成pair
,然后用一个元素为pair
的initializer_list
直接构造dict1
示例3:
vector<int> v3;
v3 = { 10,20,30,40,50 };
说明:
initializer_list
的赋值支持
🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!