使用{a,b,c}作为参数或{a,b,c}实际执行的构造函数

Mar*_*kus 6 c++ constructor class c++11 stdinitializerlist

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

int array[3] = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

甚至

int array[2][2] = { {1, 2}, {3, 4} };
Run Code Online (Sandbox Code Playgroud)

我也可以这样做 std::vector

std::vector<int> A = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

假设我想写自己的课程:

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
};
Run Code Online (Sandbox Code Playgroud)

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

{{1, 2}, {3, 4}} 实际上在做.

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

JeJ*_*eJo 10

它被称为列表初始化,你需要一个std :: initilizer_list构造函数,它将在你的实现中实现my_class.

#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;
}
Run Code Online (Sandbox Code Playgroud)

现场演示