STL(standard template libraray 标准模板库)使用过程中可以发现它的初始化列表可以是任意长度。直接在变量名之后用花括号进行数据初始化
std::initializer_list<std::string>
事例代码1
void Log(std::initializer_list<std::string> list) { for (auto ite=list.begin();ite!=list.end();ite++) { std::cout<<*ite<<" "; } std::cout<<std::endl; } //调用接口,实现多个参数的创建 //可变长度参数 Log({"dfs","gfbg","fdgb"});
事例代码2:
struct InitExc { std::vector<int> data; InitExc(std::initializer_list<int> list) { for (auto iter = list.begin(); iter != list.end(); ++iter) { data.push_back(*iter); } } };
列表初始化:
列表初始化:
std::initializer_list<std::string>
C++11扩大了初始化列表的适用范围,使其可用于所有内置类型和用户定义的类型
得益于此,列表初始化时,不限定个数优点:
- 方便,且基本上可以替代括号初始化
- 可以使用初始化列表接受任意长度
- 可以防止类型窄化,避免精度丢失的隐式类型转换
多种实现方式
1、花括号进行初始化
std::vector<int> v{1,2,3};
2、函数返回值,作为初始化内容
// 函数返回值,作为初始化内容 std::vector<int> func() { return {1,2,3}; } std::vector<int> v = func();
3、普通数据类型
int C_init{10};
int C_init = 10; //3种方式等价
int C_init2 = {10};
std::cout<<C_init<<" "<<C_init2<<std::endl;
又如:
char ch={'d'};
char ch2 = 'a';
char ch3{'a'};
std::cout<<ch<<ch2<<ch3<<std::endl;
4、类对象的初始化
class A { private: public: A(int) { std::cout<<"构造函数"<<std::endl; } ~A(){} }; //类对象的初始化 A Class_init1{11}; A Class_init2(12); A Class_init3 = {13};