【问题标题】:How to create a constructor initialized with a list?如何创建一个用列表初始化的构造函数?
【发布时间】:2014-03-19 02:49:29
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    举个例子:

    #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/

    【讨论】:

      【解决方案2】:

      您是在问如何创建一个接受initializer_list 的构造函数?

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

      【讨论】:

        【解决方案3】:

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

        根据 C++ 标准

        一个初始化列表构造函数,如果它的第一个参数是类型 std::initializer_list 或对可能 cv 限定的引用 某些类型 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;
        }
        

        【讨论】:

          猜你喜欢
          • 2022-12-14
          • 1970-01-01
          • 2021-01-05
          • 1970-01-01
          • 1970-01-01
          • 2013-10-03
          • 2012-03-19
          • 2017-05-02
          • 2018-06-20
          相关资源
          最近更新 更多