自学内容网 自学内容网

C++11统一列表初始化,initializer_list

目录

1.C++11统一了列表的初始化

2.initializer_list

3.initializer_list是如何支持的


1.C++11统一了列表的初始化

现在无论内置类型和自定义类型都可以用列表初始化。

class Date
{
 public:
  Date(int year, int month, int day)
   :_year(year)
   ,_month(month)
   ,_day(day) 
  {}
  
 private:
  int _year;
  int _month;
  int _day;
}

int main()
{
    int x = 0;//之前初始化
    int y = {1}//c++11初始化
    int z {2}//c++11初始化    
    vector<int> v1 = {1,2,3,4,5};//c++11初始化  
    vector<int> v2 {1,2,3,4,5};//c++11初始化  
    Date day1(2004,02,06);//c++98
    Date day2{2004,02,06};//c++11
    Date day3 = {2004,02,06};//c++11
    //new也支持用列表初始化
    int * pa = new int[4]{1,2,3,4}
  
    return 0;
}

2.initializer_list

vector之所以能向上面那样写,是因为c++11引入了initializer_list,用initializer_list作为参数,进行重载了一个构造函数。

This type is used to access the values in a C++ initialization list, which is a list of elements of type const T.

这个类型被用于访问C++的初始化列表,这个列表的的元素类型是const T。

包含<initializer_list>头文件就可以使用initializer_list

auto lt  = {1,2,3,4,5}

这个lt的类型就是 initializer_list,就是用来接收{1,2,3,4,5}。

The initializer_list object refers to the elements of this array without containing them: copying an initializer_list object produces another object referring to the same underlying elements, not to new copies of them。

initializer_list对象引用数组的元素,但是并不包含他们,拷贝一个initializer_list的对象,产生的另一个对象,底层引用相同的元素,不是新拷贝一份。

如果参数是列表,myclass(initializer_list<int> lt);会被优先调用。

struct myclass
{
  myclass(int a,int b);
  myclass(initializer_list<int> lt);
};

int mian()
{
 myclass s1(1,1)//myclass(int a,int b)
 myclass s2{1,1}// myclass(initializer_list<int> lt)
 return 0;
}

3.initializer_list是如何支持的

这里拿vector举例

template<class T>
class vector
{
public:
typedef T* iterator;

vector()
{}
vector(const initializer_list<T>& lt)
{
cout << "vector(const initializer_list<T>& lt)" << endl;
_start = new T[lt.size()];
_finsh = _start + lt.size();
_endofstorage  = _start + lt.size();
iterator vit = _start;

for (auto it : lt)
{
*vit++ = it;
}

}

vector& operator=(const initializer_list<T>& lt)
{
cout << "vector& operator=(const initializer_list<T>& lt)" << endl;
vector<T> tmp(lt);
std::swap(_start,tmp._start);
std::swap(_finsh,tmp._finsh);
std::swap(_endofstorage,tmp._endofstorage);
return *this;
    }

private:
T* _start;
T* _finsh;
T* _endofstorage;
};


原文地址:https://blog.csdn.net/W2155/article/details/137993925

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!