{}初始化和初始化列表

         C++98标准中允许使用花括号对数组自定义类型的变量进行初始化,C++11扩展了大括号的用途,允许使用花括号对所有的内置类型和自定义类型进行初始化,使用时,可以加=号,也可以不加。

        对于自定义类型,当花括号中的常量与构造函数的形参匹配时,调用相应的构造函数。

//初始化列表
using namespace std;
class test
{
public:
	test(int a, double b):tow(a),three(b)
	{
		cout << "test(int a,double b)" << endl;
	}
	int tow;
	double three;
};
int main()
{

	int a{ 11 };
	char b{ 'a' };
	double c{ 3.14 };
	int* d{ &a };

	test e{ 88,3.15 };

	test f{ "111",2,3.15 }; //本质是调用构造

	cout << d << endl;
	return 0;
}

        与{}在形式上相同的并且容易混淆的是初始化列表,它是c++中的一种类型:

        底层实际上是一个常量数组,存放在常量区,类成员的两个指针分别指向存放数据的常量区的开始和结束:

       对于自定义类型,如果你想要让自己实现的类能够用{ }初始化,就需要新增一个构造,比如:

        再比如map用初始化列表来初始化:

  最外层的花括号被识别成了初始化列表,由于每个节点的数据域是pair,里层的花括号会去调用pair的构造函数来构造pair。

        {}初始化和初始化列表是对内置类型和自定义类型初始化时底层的实现的差异,但是在语言层面实现的效果是相同的。对于内置类型或者自定义类型来说,用{}初始化是对C++98花括号功能的拓展,如果{}内的参数有相应的构造就去调用相应的构造,如果没有相应构造,并且{}内的参数类型与类成员变量类型匹配会依次赋值。

        如果{}内的参数类型与成员变量不匹配,并且没有相应的构造,编译器就会寻找构造函数中是否有initializer_list类型的形参,然后执行构造的代码。

        

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值