【C++11】列表初始化

📝前言:
这篇文章我们来讲讲C++11引入的列表初始化{},注意这不是构造函数里的初始化列表!!!
在阅读文章之前,请你记住一句重点万物皆可{}初始化

🎬个人简介:努力学习ing
📋个人专栏:C++学习笔记
🎀CSDN主页 愚润求学
🌄其他专栏:C语言入门基础python入门基础python刷题专栏Linux


一,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,然后用一个元素为pairinitializer_list直接构造dict1

示例3:

vector<int> v3;
v3 = { 10,20,30,40,50 };

说明:
initializer_list的赋值支持


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚润泽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值