C++11 关于{}的初始化简析

2023-09-22 14:33:28

序言

别问我为什么都是标记简析,深入分析我还没那个精力,为什么写这个这么简单的文章?在某次与群友探讨时才发现自己对于{}的理解是错的,我原来以为{}的使用并没有使用其本身的构造函数,所以特记录铭记。

聚合初始化

在以下条件下,即无任何可用的,用户自己写的,或继承来的构造函数,所有成员变量均是公有的,且非静态

  1. 没有私有或者受保护非静态数据成员
  2. 没有用户声明的构造函数
  3. 没有用户提供的构造函数(允许显式预置或弃置的构造函数)
  4. 没有用户提供、继承或 explicit 构造函数(允许显式预置或弃置的构造函数)
  5. 没有用户声明或者继承的构造函数
  6. 没有虚、私有或受保护 (C++17 起)基类
  7. 没有虚拟成员函数
  8. 无默认成员初始化器(C++11 起)(C++14 前)

例子:

struct Test
{
	bool a = true;
	int b = 4;
	std::string c;
};

Test t{false, 5, "str"};

其初始化是要注重于顺序的。

有构造的{}初始化

普通类

普通有自己声明的构造函数,其 {} 初始化 和()无区别,若无对应的构造函数则无法初始化,有对应的构造函数则是直接调用其构造函数。

class Test
{
public:
	Test(const int& a, const int& b) :
		_a(a), _b(b)
	{}
	
private:
	int _a;
	int _b;
};

Test t(5, 10);	//与下一样无区别
Test e{5, 10};	//与上一样无区别

Test s(4);	//编译错误:no matching constructor for initialization of 'Test'
Test d{4};	//编译错误:no matching constructor for initialization of 'Test'

使用initializer_list的类

如果该类是使用std::initializer_list作为构造的形参,{}就又有所不一样了

```cpp
class Test
{
public:
	Test(const int& a, const int& b) :				//设是T1构造
	{}
	Teed(std::initializer_list< int > ins)			//设是T2构造
	{}
	Teed(const int& a, const std::string& c)		//设是T3构造
	{}
	
private:
	...
};

Test q(5, 10);		//运行T1
Test w{5, 10};		//运行T2
Test e(5, "10");	//运行T3
Test r{5, "10"};	//运行T3

Test t(4);	//编译错误:no matching constructor for initialization of 'Test'
Test y{4};	//运行T2

当用std::initializer_list作为构造的形参时,如果{}的初始化内容是刚好符合的,则会优先使用T2构造而非T1构造

但如果是不符合的,但就会使用符合其参数顺序的构造函数T3构造。

注:T1,T2,T3仅是个代号,无任何实际含义和非专业名称

更多推荐

hive操作

Hive启动类功能说明命令启动hiveserver2服务bin/hiveserver2启动beelinebin/beeline连接hiveserver2beeline>!connectjdbc:hive2://hadoop102:10000metastroe服务bin/hive--servicemetastorehiv

【EI会议】第二届声学,流体力学与工程国际学术会议(AFME 2023)

第二届声学,流体力学与工程国际学术会议20232ndInternationalConferenceonAcoustics,FluidMechanicsandEngineering(AFME2023)声学、流体力学两个古老的学科发展至今,无时无刻都在影响着我们的生活。小到日常使用的耳机、风扇,大到制造的轮船、飞机。时代发

学习记忆——宫殿篇——记忆宫殿——记忆桩——单间+客厅+厨房+厕所+书房+院子

文章目录单间客厅厨房厕所书房院子单间水壶水龙头香皂果汁机电视门空间花红酒葡萄不锈钢白毛沙发彩色垫子吉他皮椅挂画风扇糖抱枕盒子花土水晶腿衣柜笔三环相框水壶壁挂台灯被网球拍足球抽屉闹钟蝴蝶心斑马三轮车音响椅子碗玩偶烟灰缸电视窗帘玻璃上铺镜子壁灯枕头电话纸盘鱼长方形镜子垃圾桶电视柜地板砖折叠凳窗帘挂坠毯子竹节式台灯台灯床头床

如何利用好Twitter的功能进行营销

虽然Twitter不是最复杂的社交网络,但您需要了解其中的一些特性和功能。这些是我们进行基本操作的地方。您进行探索并想出更多有创意的方式来使用这些功能。推文。推文是您可以分享的帖子和更新,限制在140个字符内。每一条推文都有存档,您可以查看自己和其他用户的推文。通过浏览其他用户的近期推文,您可以更好地了解他们关注的话题

SpringCLoud——docker中的数据卷

数据卷容器与数据耦合的问题不便于修改当我们要改Nginx的HTML内容时,需要进入容器内部修改,很不方便。数据不可复用在容器内的修改对外是不可见的。所有修改对新的容器是不可复用的。升级维护困难数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了。数据卷(Volume)是一个虚拟目录,指向宿主机文件系统中的某

MQ和分布式事务

MQmq通知时,消费者没消费到怎么办简单聊聊消息中间件?你了解那些具体的消息中间件产品?mq的消费端是怎么处理的?整理一下你的消费端的整个处理逻辑流程,然后说说你的ack是在哪里返回的。按照你这样画的话,如果数据库突然宕机,你的消息该怎么确认已经接收?那如果发送端的服务是多台部署呢?你保存消息的时候数据库就一直报唯一性

Vue中如何进行表格排序与过滤

Vue中如何进行表格排序与过滤在Vue.js中,表格是一个常见的数据展示方式。很多时候,我们需要对表格中的数据进行排序和过滤,以提供更好的用户体验。本文将介绍如何在Vue中实现表格的排序和过滤功能,并提供相关的代码示例。准备工作在开始之前,我们需要准备一些基本的工作。首先,确保你已经安装了Vue.js,并且创建了一个V

Service 层异常抛到 Controller 层处理还是直接处理?

0前言一般初学者学习编码和[错误处理]时,先知道[编程语言]有一种处理错误的形式或约定(如Java就抛异常),然后就开始用这些工具。但却忽视这问题本质:处理错误是为了写正确程序。可是1啥叫“正确”?由解决的问题决定的。问题不同,解决方案不同。如一个web接口接受用户请求,参数age,也许业务要求字段是0~150之间整数

JMeter:断言之响应断言

一、断言的定义断言用于验证取样器请求或对应的响应数据是否返回了期望的结果。可以是看成验证测试是否预期的方法。对于接口测试来说,就是测试Request/Response,断言即可以针对Request进行,也可以针对Response进行。但大部分是对Response做断言。JMeter常见的断言元件如下:1.响应断言2.J

【MySQL系列】如何在MySQL中使用触发器?MySQL触发器详解

MySQL可以通过触发器来实现自动化业务逻辑和操作。触发器是一种在数据库表发生特定操作时自动执行的存储过程,能够响应特定事件,如INSERT、UPDATE和DELETE语句。本文将详细介绍MySQL中的触发器概念、创建和使用方法,以及一些注意事项。一、概念触发器是一种与表相关联的一段代码,它会在特定事件(INSERT、

利用 SOAR 加快事件响应并加强网络安全

随着攻击面的扩大和攻击变得越来越复杂,与网络攻击者的斗争重担落在了安全运营中心(SOC)身上。SOC可以通过利用安全编排、自动化和响应(SOAR)平台来加强组织的安全态势。这一系列兼容的以安全为中心的软件可加快事件调查和响应速度。SOAR平台提高了对所有安全数据的可见性,简化了IT流程,自动执行了与安全相关的手动任务,

热文推荐