C++标准库--C++11语言新特性一致性初始化(Uniform Initialization)与初值列(initializerList)

(1)可以使用大括号初始化数据

int values[] {1,2,3};
std::vector<int> v{2,3,5,7,11,13,17};
std::vector<std::string> cities{"beijing", "shanghai"};
std::complex<double> c{4.0,3.0};

(2)窄化(narrowing)–也就是精度降低造成数值变动–对大括号而言是不可成立的

int x1(5.3); //ok but OUCH x1 becomes 5
int x2 = 5.3; //ok but OUCH x1 becomes 5
int x3{5.0}; //ERROR:narrowing
int x4={5.3};//ERROR:narrowing
char c1{7}; //ok:even though 7 is an int ,this is not narrowing
char c2{99999} //ERROR :narrowing (if 99999 doesn't fit into a char)
std::vector<int> v1{1,2,3,5}; //OK
std::vector<int> v2{1,2.3,4,5.6} // ERROR: narrowing doubles to ints

(3) 用户自定义初始值列(initializer lists for user-defined types)概念 ,C++11提供了 class template std::initializer_list<>,用来支持一系列(a list of values) 进行初始化,或在"你想要处理一系列值(a list of value)"的任何地点进行初始化。

void print(std::initializer_list<int> vals)
{
	for(auto p=vals.begian(); p!= vals.end(); ++p)
	{
		std::cout<<*p<<std::endl;
	}
}

说明:在“”指明实数个数“”和"指明一个初值列"的构造函数(ctor)同时存在,带有初值列的那个版本胜出。

class P
{
	public:
	P(int, int);
	P(std::initializer_list<int>);
};

P p(3,5); //calls P::P(int ,int)
P q{77, 5}; //calls P::P(initializer_list)
P r{77,5,42}; //calls P::P(initializer_list)
P s = {77,5}; //calls P::P(initializer_list)

说明2:explicit 关键字的的构造方法,初始值列的方式,失去隐式转换能力

class P{
	P(int ,int);
	explicit P(int, int ,int );
};

P x(1, 5); // ok
P y{1, 5}; //ok
p z{77,5,42}; //ok
P v={77,5};// ok implicit type conversion allowed 
P w = {77, 5, 42}; //ERROR due to explicit (no implicit type conversion allowed)

void fp(const P&);
fp({47, 11}); //ok implicite conversion of {47,11} into P
fp({47,11,3}); //error: duto explicit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值