列表初始化
(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基本用法: