(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