本文参考了[std::initializer_list]当中的内容,做一个简单的读书笔记。
基本概念
template<class T> class initializer_list; // 初始化列表类型
从这个定义我们看出,initializer_list是一个模板类。具体来说这个类的作用就是根据c++语言当中的初始化列表声明,构造一个初始化列表对象。这样就可以将这个将这个初始列表的声明保存下来。和之前的函数对象有异曲同工之妙,就是赋予初始化列表变量的语义。
#include <iostream>
#include <vector>
#include <initializer_list>
int main( void ){
int arr[] = {1,2,3}; // initialization list declarations
// store the initialization list declarations
std::initializer_list<int> init_list = {1,2,3};
return 0;
}
initializer_list< T >类型只能通过迭代器进行访问。
#include <iostream>
#include <vector>
#include <initializer_list>
int main( void ){
std::initializer_list<int> il = {1,2,3};
typedef std::initializer_list<int>::iterator iter;
iter b = il.begin();
iter e = il.end();
while(b != e){
std::cout << *b << std::endl;
++b;
}
return 0;
}
它的主要用法是可以通过initializer_list来为对象提供一种通过初始化列表构造对象的方法。注意:这里要区分它和参数初始化列表,他们两不是同一个东西,后者并没有提供多余的对象初始化方法。
#include <iostream>
#include <vector>
#include <initializer_list>
int main( void ){
std::vector<int> arr = {1,2,3}; // legal in c++11
return 0;
}
#include <iostream>
#include <vector>
#include <initializer_list>
class Point {
public:
Point() : x(0), y(0) {}
Point( int xx, int yy ) : x(xx), y(yy) {}
Point( const std::initializer_list<int>& il ) {
typedef std::initializer_list<int>::const_iterator const_iter;
const_iter b = il.begin();
x = *b;
y = *(b+1);
}
void print(){
std::cout << x << "," << y << std::endl;
}
private:
int x;
int y;
};
int main( void ){
Point p1;
p1.print();
Point p2(1,2);
p2.print();
Point p3 = {3,4}; // implicit conversion 通过初始化列表为构造多提供了一种可能
p3.print();
std::initializer_list<int> il = {5,6};
Point p4(il);
p4.print();
return 0;
}