C++11中的初始化列表构造函数(Initialize_list Constructors)是将std::initializer_list<T>作为第一个参数的构造函数,并且没有任何其他参数(或者其他参数具有默认值)。例如:
#include <iostream> #include <initializer_list>//必须包含该头文件 #include <vector> using namespace std; class A { private: vector<int> myVector; public: //参数为initializer_list<T> args A(initializer_list<int> args){ for(auto iter=args.begin();iter!=args.end();++iter) myVector.push_back(*iter); } A(const A &)=delete; void showVector(){ for(auto citer=myVector.cbegin();citer!=myVector.cend();++citer) std::cout<<*citer<<" "; cout<<endl; } }; int main() { A a={1,2,3,4,5,6,7,8,9,10,11,12}; //不能写成A a(1,2,3,4,5,6,7,8,9,10,11,12); //a.show(); a.showVector(); }
使用前请查看你的编译器是否支持该C++11特性.我的是GCC C++ 4.8.2完美支持。
编译时请附加特性-std=c++11
编译及运行结果。
有其他参数的情况
//ti2.cpp
<pre name="code" class="cpp">#include <iostream> #include <initializer_list>//必须包含该头文件 #include <vector> using namespace std; class A { private: vector<double> myVector; string str; public: //参数为initializer_list<T> args A(initializer_list<double> args,string s="initailizer_list"){ for(auto iter=args.begin();iter!=args.end();++iter) myVector.push_back(*iter); //i=ii;//i必须有默认值,并且其实这一句没用 str=s;//看后面的,因此这个默认值应该是类内成员初始化 //即定义时赋予初始值:string str="initailizer_list" //不能写成A a={1,2,3,4,5,6,7,8,9,10,11,12.5,55,“is this word!”}; } A(const A &)=delete; void showVector(){ for(auto citer=myVector.cbegin();citer!=myVector.cend();++citer) std::cout<<*citer<<" "; cout<<endl; cout<<"str="<<str<<endl; } }; int main() { A a={1,2,3,4,5,6,7,8,9,10,11,12.5,55}; //不能写成A a={1,2,3,4,5,6,7,8,9,10,11,12.5,55,“is this word!”}; //不能写成A a(1,2,3,4,5,6,7,8,9,10,11,12); //a.show(); a.showVector(); }
编译运行结果: