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基本用法:

       

 

posted @ 2020-03-16 18:40  Duikerdd  阅读(355)  评论(0编辑  收藏  举报