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

6

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

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}} 是在做什么呢?

我总是发现,虽然可以用这种方式初始化数据,但从未确切知道其作用。


5
http://en.cppreference.com/w/cpp/language/list_initialization - rustyx
3
编写一个接受 std::initializer_list 作为参数的构造函数。 - Ron
1
我想,就这样了,谢谢。我不知道list_initialization这个词,所以找不到它。 - Markus
3个回答

10

这被称为列表初始化,您需要在my_class中实现std::initializer_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;
}

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)
}

有需要使用拷贝构造函数吗? - Joseph D.
是的,这是必需的。Q(Q const&) = delete; 将在编译时抛出一个错误,提示“初始化列表构造函数(而非复制构造函数)”。 - Sumit Jha

3

怎么可能呢?

如果你有一个初始化列表。

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

这个语句 "{{1, 2}, {3, 4}}" 是一个被称为“列表初始化”的操作。如果初始化器是一个(非括号)大括号初始化列表,或者是“= 大括号初始化列表”,那么对象或引用就会进行列表初始化。参考链接:list-initialization

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接