C++11中的{}与std::initializer_list深度解析

 更新时间:2025年11月18日 10:23:24   作者:学困昇  
C++11引入了统一的初始化方式,使用{}进行初始化,支持内置类型和自定义类型,C++11还引入了std::initializer_list类,支持对容器的初始化,方便地用多参数构造对象,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

1.C++11中的{}

1.1.C++98中传统的{}

用于对一般数组结构体的初始化

struct A {
	int _x;
	int _y;
};
int main() 
{
	int arr1[] = { 1,2,3,4,5,6 };
	int arr2[] = { 0 };
	A a = { 3,4 };
	return 0;
}

1.2.C++11中的{}

  • 从C++11开始,想要统一初始化方式,实现一切对象都可用{}进行初始化,用{}初始化也叫列表初始化
  • 内置类型和自定义类型均支持用{}初始化,自定义类型本质是隐式类型转换,会产生临时变量(优化以后变成直接构造)
  • 用{}初始化,=可以省略
  • C++11中列表初始化统一了初始化方,在用多参数构造对象时,用{}初始化(相比有名对象和匿名对象传参)会方便很多
#include <iostream>
#include <vector>
using namespace std;
struct A {
	int _x;
	int _y;
};
class Student {
public:
	Student(const string& name, const int id = 0, const int age = 0)
		:_name(name)
		,_id(id)
		,_age(age){}
	Student(const Student& s) 
		:_name(s._name)
		,_id(s._id)
		,_age(s._age){ }
private:
	string _name;
	int _id;
	int _age;
};
int main() 
{
	// C++98中的{}
	int arr1[] = { 1,2,3,4,5,6 };
	int arr2[] = { 0 };
	A a = { 3,4 };
	//C++11中的{}
	//内置类型初始化
	int a = { 1 };
	//自定义类型初始化
	Student stu1 = { "WangPeng", 20251117, 19 };
	//这里stu2引用的是{ "YiYi", 20258888, 18 }临时变量
	const Student& stu2 = { "YiYi", 20258888, 18 };
	//只有{}初始化,才可以省略=
	double num{ 3.14159 };
	Student s{ "ZhangWei", 20236666, 22 };
	vector<Student> students;
	students.push_back(stu1);
	students.push_back(Student{ "WangPeng", 20251117, 19 });
	//相比有名对象和匿名对象传参,{}更加方便
	students.push_back({ "WangPeng", 20251117, 19 });
	return 0;
}

2.std::initializer_list

  • 通过{}初始化已经很方便了,但是对象容器的初始化还是不太方便,假设想对一个vector对象进行初始化,要用N个值构造初始化,那么需要构造多次才能实现(因为容器中元素数量不确定,所以每个元素都要执行对应的构造函数)
vector<int> = {1, 2, 3, 4};
  • C++11库中,新增了一个std::initializer_list类,它的本质是底层开一个数组,将数据拷贝到数组中,其中包含两个指针分别指向开始(begin)和结束(end)
auto il = {98, 99, 100};
  • initializer_list支持迭代器遍历
  • STL中的容器支持std::initializer_list的构造函数(即支持任意多个值构成的{x1, x2, x3, …}进行初始化)
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main()
{
	std::initializer_list<int> mylist;
	mylist = { 23,24,25,26,27 };
	int i = 0;
	//my_list中只存了两个首尾指针(在64位环境下大小均为8个字节)
	cout << sizeof(mylist) << endl;//输出16 
	//首尾指针地址与变量i地址接近 说明该数组存储在栈上
	cout << mylist.begin() << endl;
	cout << mylist.end() << endl;
	cout << &i << endl;
	//直接构造
	vector<int> v1({ 1,2,3,4,5 });
	//构造临时对象->临时对象拷贝给v2->优化为直接构造
	vector<int> v2 = { 6,7,8,9,10 };
	const vector<int>& v3 = { 11,22,33,44,55 };
	//pair类型的{}初始化 + map的initializer_list构造
	map<string, string> dict = { {"a","一个"},{"stack","栈"},{"queue","队列"} };
	//initializer_list赋值可以这样写
	v1 = { 111,222,333,444,555 };
	return 0;
}

到此这篇关于C++11中的{}与std::initializer_list的文章就介绍到这了,更多相关c++ std::initializer_list内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++ Protobuf解决数据传输瓶颈面试精讲

    c++ Protobuf解决数据传输瓶颈面试精讲

    这篇文章主要介绍了c++ Protobuf解决数据传输瓶颈利器面试精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 在Centos7中使用vscode和gdb调试PG插件的方法

    在Centos7中使用vscode和gdb调试PG插件的方法

    这篇文章主要介绍了在Centos7中使用vscode和gdb调试PG插件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Qt自定义实现一个等待提示Ui控件

    Qt自定义实现一个等待提示Ui控件

    等待样式控件是我们在做UI时出场率还挺高的控件之一,所以这篇文章主要为大家介绍了Qt如何自定义一个好看的等待提示Ui控件,感兴趣的可以了解下
    2024-01-01
  • C++ LeetCode1769移动所有球到每个盒子最小操作数示例

    C++ LeetCode1769移动所有球到每个盒子最小操作数示例

    这篇文章主要为大家介绍了C++ LeetCode1769移动所有球到每个盒子所需最小操作数示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Qt C++实现录屏录音功能的示例详解

    Qt C++实现录屏录音功能的示例详解

    实现一个录屏+录音的功能且需要快速开发,Qt无疑是一个非常好的选择。他有丰富的类库和接口可以很好的满足开发需求。本文就来和大家聊聊具体的实现方法吧
    2023-03-03
  • C++面试八股文之STL标准模板库使用详解

    C++面试八股文之STL标准模板库使用详解

    这篇文章主要为大家介绍了C++面试八股文之STL标准模板库使用详解,<BR>有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • C++使用ffmpeg实现rtsp取流的代码

    C++使用ffmpeg实现rtsp取流的代码

    这篇文章主要介绍了C++使用ffmpeg实现rtsp取流,文章介绍了ffmepg采用rtsp取流流程图,CMakeLists.txt编写方法,通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • C++类型转换和IO流操作处理教程

    C++类型转换和IO流操作处理教程

    这篇文章主要给大家介绍了关于C++类型转换和IO流操作处理的相关资料,标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符,文中给出了详细的代码示例,需要的朋友可以参考下
    2023-08-08
  • C语言图书借阅系统源码

    C语言图书借阅系统源码

    这篇文章主要为大家分享了C语言图书借阅系统源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C++ Primer Plus 第四章之C++ Primer Plus复合类型学习笔记

    C++ Primer Plus 第四章之C++ Primer Plus复合类型学习笔记

    数组(array)是一种数据格式,能够存储多个同类型的值。每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素,今天给大家重点介绍C++ Primer Plus复合类型的实例详解,感兴趣的朋友一起看看吧
    2021-07-07

最新评论