C++11之列表初始化
列表初始化
(1)C++98{}初始化 --- 缺陷: 只能初始化内置类型
//C++98使用{}对数组初始化
int arr[] = {1,2,3};
int arr[4] = {1};
//但对于自定义类型会报错
vector<int> v{1,2,3,4};
(2)C++11内置类型列表初始化 --- {}之前可以使用=,效果一样
//内置类型
int x1 = {10};
int x2{10};
int x3 = 1+2;
int x4 = {1+2};
int x5{1+2};
//数组
int arr1[5] {1,2,3,4,5};
int arr2[] {1,2,3,4,5};
//动态数组 , C++98不支持
int* arr3 = new int[5]{1,2,3,4,5};
//标准容器
vector<int> v{1,2,3,4,5};
map<int,int> m{{1,1},{2,2},{3,3}};
(3)C++11自定义类型列表初始化
//1.支持对单个对象直接列表初始化
class Point{
public:
Point(int x = 0, int y = 0):_x(x),_y(y)
{}
private:
int _x;
int _y;
};
Point p{1,1};
//2.多个对象列表初始化需要重载一个带有initialzer_list类型参数的构造函数
//initialzer_list: 系统自定义类模板 主要方法:begin(),end(),size()
//模拟Vector借用initialzer_list实现多对象初始化
#include<class T>
class Vector{
public:
//...
Vector(initialzer_list<T> l): _cap(l.size()), _size(0)
{
_arr = new T[_cap];
for(auto e : l)
{
_arr[_size++] = e;
}
}
Vector<T>& operator=(initialzer_list<T> l)
{
delete _arr;
size_t i = 0;
for(auto e : l)
{
_arr[i++] = e;
}
return *this;
}
//...
private:
T* _arr;
size_t _cap;
size_t _size;`
};
initialzer_list基本用法:


浙公网安备 33010602011771号