initializer_list 列表初始化
C++ 11扩大了用大括号{}括起来给一些对象进行初始化,可以是内置类型和自定义类型,使用大括号进行初始化时,还可以忽略=号:
比如
int x = {0};
double y {1.11};
另外,开辟空间时的用new也可以进行初始化。
int* p = new int[5]{1,2,3,4,5};
在创建类的对象时,使用大括号{}且没有一个叫initializer_list的构造函数,那就会调用对象的构造函数。
class A
{
private:
int a = 0;
double b = 0.0;
public:
A(int _a,double _b):a(_a),b(_b){}
}
A a1{1,1.1};//C++ 11 构造
A a2 = {1,1.1};//C++ 11 构造
如果类模板有initializer_list这个构造函数作为参数,则只要这个构造函数可以使用初始化列表。比如
vector a1(10);//代表的是vector开辟了10给连续的int类型的空间。
vector a2{10};//代表开了一个空间,是用initializer_list初始化的,开辟了一个空间,储存的值是10。
vector a3{1,2,3};//代表了开辟了三个空间,也是initializer_list初始化的,分别存储了1,2,3三个值。
#include <iostream>
#include <initializer_list>
using namespace std;
class A
{
public:
A()
{
_a = (int*)malloc(sizeof(int) * 10);
}
A(initializer_list<int> L)
{
_a = (int*)malloc(sizeof(int) * 10);
for (auto e : L)
{
_a[index++] = e;
}
}
void Push(int num)
{
_a[index] = num;
index++;
}
void Print()
{
for (int i = 0; i < 5; i++)
{
cout << _a[i] << " ";
}
}
int* _a = nullptr;
int index = 0;
};
int main()
{
A a1{ 1,3,5,7,9 };
a1.Print();
return 0;
}
这里的a1用大括号进行初始化,开辟的空间里有5个数据,一开始的五个数据在initializer_list,在常量区,因为initializer_list有指向开始和结束的两个原生指针(_First和_Last)和迭代器,和成员变量begin()和end(),所以支持范围for的使用方法。通过遍历列表的数据对类A的对象进行初始化。
如果直接用auto 一个对象并用大括号,就会识别成一个initializer_list的类型。C++11新特性增加了容器使用初始化列表进行初始化。像C语言初始化数组一样方便。