CC++编程:列表初始化列表赋值列表初始化
由来
C++在初始化数组时,可以使⽤下⾯花括号加初始值的形式:
int arr[]={1,2,3};
tune是什么意思
在C++中,如有下⾯这样的类:
class Tester
{
public:
Tester(int value):m_value(value *2){}
void print(){
cout << m_value << endl;
奇骏与柯迪亚克哪个好
瓜子二手车评估价格
}
private:
int m_value;
};
那么它的初始化可以写成这样:
Tester tester_array[]={6,7,8,9,10};
Tester的构造函数可以被正常的调⽤
问题是这种⽅法的运⽤范围很窄,很多场景都⽤不了。⽐如vector
vector<int> int_vector;
它的初始化⽅法就下⾯两种:
int_vector.push_back(5);
int_vector.push_back(4);
int_vector.push_back(3);
int_vector.push_back(2);
int_vector.push_back(1);
int int_array[]={1,2,3,4,5};
for(int i =0; i <sizeof(int_array)/sizeof(int_array[0]);++i)
{
int_vector.push_back(int_vector[i]);
}
⽆论哪种⽅法,都给⼈⼀种如鲠在喉的感觉
因此,C++11中扩展了使⽤花括号初始化变量的应⽤范围,称这种初始化⽅式为列表初始化
⽐如:
vector<int> int_vector ={5,4,3,2,1};
list<int> int_list ={5,4,3,2,1};
map<int,const char*> id2Name ={{1,"Zhang"},{2,"Wang"},{3,"Li"}};
另⼀种写法:
下⾯和写法也合法,和上⾯的⼏种写法等价。
vector<int> int_vector{5,4,3,2,1};
list<int> int_list {5,4,3,2,1};
map<int,const char*> id2Name{{1,"Zhang"},{2,"Wang"},{3,"Li"}};
奔驰车主承认撒谎
使⽤场景
几何c在使⽤⼤括号内的初始值设定项列表初始化变量时,将发⽣列表初始化。 ⼤括号内的初始值设定项列表可在以下情况中使⽤:初始化变量
新赛欧1.2
使⽤关键字初始化类 new
从函数返回对象
⾃变量传递给函数
直接初始化中的⾃变量之⼀
在⾮静态数据成员的初始值设定项中
在构造函数初始值设定项列表中
class MyClass {
public:
MyClass(int myInt,char myChar){}
private:
int m_int[]{3};
char m_char;
};
class MyClassConsumer{
public:
void set_class(MyClass c){}
MyClass get_class(){return MyClass{0,'\0'};}
};
struct MyStruct{
int my_int;
char my_char;
MyClass my_class;
};
int main(){
MyClass mc1{1,'a'};
MyClass* mc2 =new MyClass{2,'b'};
MyClass mc3 ={3,'c'};
MyClassConsumer mcc;
mcc.set_class(MyClass{3,'c'});
mcc.set_class({4,'d'});
MyStruct ms1{1,'a',{2,'b'}};
}
使⽤⼤括号包围的值列表赋值
{}包围的值列表除了可以⽤于初始化变量外,还可以⽤于赋值语句中。
也就是说:
vector<int> vi{1,2,3,4,5};
也可以:
vector<int> vi;
vi ={6,7,8,9,10};
和初始化⼀样,使⽤{}包围的值列表也有同样的优势:
⼀个是防⽌窄化,可以简单的理解为防⽌精度降低。⽐如,下⾯的代码是⽆法编译通过的:
double pai =3.1415926;
int pi;
pi ={pai};//编译错误。
另外,如果{}⾥的初始化列表为空,编译器会创建⼀个值初始化的临时量并赋值给赋值对象