C++11之统一的列表初始化

news/2024/9/20 14:11:25 标签: c++, 算法, 数据结构

一.{}初始化

在c++98中,标准允许使用{}对数组或结构体元素进行统一的列表初始值设定:

struct mess
{
	int _x;
	string _str;
};
int main()
{
	//注意,使用new的一定是指针
	int* arr = new int[4] {1, 2, 3, 4};
	//数组初始化
	int arr[] = { 1,3,5,6 };
	int arr[10] = { 0 };
	//结构体初始化
	mess m = { 1,"hello" };
	return 0;
}

c++11扩大了使用列表初始化的范围,使其可以用于所有的自定义类型和内置类型是初始化,使用时,可以加=可以不加=:

struct mess
{
	int _x;
	string _str;
};
int main()
{
	//数组初始化
	int arr[] = { 1,3,5,6 };
	int arr2[10]{ 0 };
	//结构体初始化
	mess m = { 1,"hello" };
	mess m2{ 1,"hello" };
	//整型初始化
	int x1 = 10;
	int x2{ 20 };
	return 0;
}

如上,注意m2的第二种构造,使用的是{}列表!!!而不是(),因为如果使用(),那就是调用构造函数,但是咱们没有写带参的构造函数!!!

但是下面的这个类是写了构造函数的,所以当使用{}时,就是调用构造函数:

class Date
{
private:
	int _year;
	int _month;
	int _day;
public:
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "构造函数" << endl;
	}
};
int main()
{
	Date d{ 2023,4,5 };
	Date d2 = { 2024,5,6 };
	Date d3(2024, 6, 7);
}

那d2和d3都是调用构造函数,难道没有什么区别吗?

有区别:d3就是直接调用构造函数,而d和d2本质上是类型转换!!!它是先使用列表构造一个date临时对象,再用临时对象去拷贝构造d3!!!,如下可以验证:

说明,必须是const引用才能接收初始化列表。

二.initializer_list

如上介绍,它是用于接收列表中的元素的,他是一个list,里面的元素都是const类型;该类型的对象是由编译器从初始化列表中构建出来的。

但注意,他和链表无关,支持迭代器

使用场景:

一般是作为构造函数的参数,c++11的stl就对不少容器添加了initializer_list作为函数参数的构造函数,基于这个原因,容器可以如下创建

本质和多参数构造的类型转换不同!!!!!,它是先生initializer_list对象,再用迭代器区间进行构造。

那我们自己手撕是vector能否这样构造呢?不可以,因为我们没有实现一个支持initializer_list的构造函数,所以应如下做:

写上这个构造函数,就能够使用列表初始化了


http://www.niftyadmin.cn/n/5667213.html

相关文章

数据结构------二叉树简单介绍及实现

如果不是满二叉树或者完全二叉树&#xff0c;就要用链式存储 //搜索二叉树&#xff1a;左子树的所有值比根小&#xff0c;右子树的所有值比根大 // 实现查找&#xff0c;最多找高度次&#xff08;类似二分法&#xff09; //二分查找存在的问题&#xff1a…

分类预测 | Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预测

分类预测 | Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预测 目录 分类预测 | Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预测&#xff0…

Activiti7《第三式:破刀式》——工作流中的刀锋利刃

冲冲冲&#xff01;开干 这篇文章将分为九个篇章&#xff0c;带你逐步掌握工作流的核心知识。欢迎来到 “破刀式” 篇章&#xff01;在工作流的开发过程中&#xff0c;锋利的利器就是 精湛的设计与代码优化。本篇文章将探讨如何像一把利刃一样&#xff0c;用最直接的方式切入复…

JVM 内存模型:堆、栈、方法区讲解

1. 引言 Java 虚拟机&#xff08;JVM&#xff09;的内存模型是 Java 程序运行时的基础之一。JVM 内存模型主要包括 堆、栈、和 方法区。它们各自有不同的作用和管理方式&#xff0c;并且影响着程序的性能和稳定性。为了更好地理解 JVM 的内存管理机制&#xff0c;我们将结合电…

MATLAB系列03:分支语句和编程设计

MATLAB系列03&#xff1a;分支语句和编程设计 3. 分支语句和编程设计3.1 自上而下的编程方法简介3.2 伪代码的应用3.3 关系运算符和逻辑运算符3.3.1 关系运算符3.3.2 小心和~运算符3.3.3 逻辑运算符3.3.4 逻辑函数 3.4 选择结构3.4.1 if结构3.4.2 switch结构3.4.3 try/catch结构…

中电金信:构建银行级数智化平台 做好数字金融大文章

近年来&#xff0c;党中央高度重视数字经济发展&#xff0c;2023年召开的中央金融工作会议将数字金融列为金融“五篇大文章”之一&#xff0c;要求着力打造现代金融机构和市场体系&#xff0c;疏通资金进入实体经济的渠道&#xff0c;为数字金融建设指明了目标方向。新形势下&a…

Java 集合(数据结构)面试题总结

一、栈和队列的区别 具体的场景应用 栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;是两种基本的数据结构&#xff0c;它们在数据的存取顺序上有不同的规则。以下是它们的主要区别以及具体的应用场景。 1. 栈&#xff08;Stack&#xff09; 特点&…

2024 屡发屡中的论文方向:时空预测!

【时空预测】是一种专门处理具有时间和空间属性的数据的分析技术&#xff0c;随技术发展&#xff0c;用于解决复杂的时空问题的新预测方法和模型不断涌现。仅2024上半年&#xff0c;时空大模型UrbanGPT、通用城市时空预测模型UniST、即插即用的时空提示调整机制FlashST……各大…