如何创建用列表初始化的构造函数?

时间:2014-02-19 01:35:41

标签: c++ list c++11 constructor

如何使用包含n个元素的列表初始化构造函数?

X x = {4, 5, 6, ...};

3 个答案:

答案 0 :(得分:7)

对于包含n个元素的列表,您需要使用std :: initializer_list。

  

Initializer_list对象自动构造为数组   分配了类型T的元素,其中每个元素都在   列表被复制初始化为数组中的相应元素,   使用任何必要的非缩小隐式转换。

举个例子:

#include <iostream>
#include <initializer_list>
#include <vector>

template<class T>
class X {
  long unsigned int size;
  std::vector<T> _elem;
public:
  X(std::initializer_list<T> l): size{l.size()} {
    for(auto x: l)
      _elem.push_back(x);
  }

  void print() {
    for(auto x: _elem)
      std::cout << x << " ";
  }
};

int main(int argc, char **argv) {
  X<int> x = {4, 5, 10 ,8 ,6};
  x.print();
  return 0;
}

有关std :: initializer_list的更多信息: http://www.cplusplus.com/reference/initializer_list/initializer_list/

答案 1 :(得分:2)

您是否在询问如何制作一个接受initializer_list的构造函数?

#include <initializer_list>

class X {
public:
  X(std::initializer_list<int> ilist);
};

答案 2 :(得分:2)

您可以定义所谓的 初始化列表构造函数 ,并使用类std::initializer_list的迭代器来访问列表中的元素。

根据C ++标准

  

初始化列表构造函数,如果其第一个参数是类型   std :: initializer_list或对cv-qualified的引用   某些类型E的std :: initializer_list,并且没有   其他参数或所有其他参数都有默认参数

例如

#include <iostream>
#include <vector>
#include <initializer_list>

class A
{
public:
   A() = default;
   A( std::initializer_list<int> l ) : v( l ) {}
   std::vector<int> v;
};

int main() 
{
    A a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    for ( int x : a.v ) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}