使用{a,b,c}作为参数或{a,b,c}实际上在做什么的构造函数?

时间:2018-05-23 13:07:11

标签: c++ class c++11 constructor stdinitializerlist

我知道,我可以像这样初始化数据。

int array[3] = { 1, 2, 3 };

甚至

int array[2][2] = { {1, 2}, {3, 4} };

我也可以使用std::vector

来完成
std::vector<int> A = { 1, 2, 3 };

假设我想写自己的课程:

class my_class
{
     std::vector< int > A;
     public:
     //pseudo code
           my_class(*x) { store x in A;} //with x={ {1, 2}, {3, 4} }
     // do something
};

是否可以编写这样的构造函数,怎么可能?这是什么声明

{{1, 2}, {3, 4}}实际上在做什么?

我总是发现,你可以用这种方式初始化数据,但绝不是它正在做的事情。

3 个答案:

答案 0 :(得分:10)

它被称为 list initialization ,你需要一个 std::initilizer_list 构造函数,这将在#include <iostream> #include <vector> #include <initializer_list> // std::initializer_list class my_class { std::vector<int> A; public: // std::initilizer_list constructor my_class(const std::initializer_list<int> v) : A(v) {} friend std::ostream& operator<<(std::ostream& out, const my_class& obj) /* noexcept */; }; std::ostream& operator<<(std::ostream& out, const my_class& obj) /* noexcept */ { for(const int it: obj.A) out << it << " "; return out; } int main() { my_class obj = {1,2,3,4}; // now possible std::cout << obj << std::endl; return 0; } 中实现。

参见Live Demo

@KafkaListener

答案 1 :(得分:3)

您可以在构造函数中使用initializer_list来获得此选项。

struct X {
    X() = default;
    X(const X&) = default;
};

struct Q {
    Q() = default;
    Q(Q const&) = default;
    Q(std::initializer_list<Q>) {}
};

int main() {
  X x;
  X x2 = X { x }; // copy-constructor (not aggregate initialization)
  Q q;
  Q q2 = Q { q }; // initializer-list constructor (not copy constructor)
}

答案 2 :(得分:3)

  

怎么可能?

如果您有初始化列表。

#include  <initializer_­list> // use std::initializer_list template
my_class(const std::initializer_list<int>& v) : A(v) {}
  

这句话是什么&#34; {{1,2},{3,4}}&#34;实际上在做什么?

这称为list-initialization

  

如果初始化程序是(非括号内的) braced-init-list =    braced-init-list ,对象或引用是 list-initialized