首页 > 代码库 > C++学习笔记18,C++11中的初始化列表构造函数(二)

C++学习笔记18,C++11中的初始化列表构造函数(二)

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();
}

编译运行结果: