【问题标题】:Constructor using {a,b,c} as argument or what is {a,b,c} actually doing?使用 {a,b,c} 作为参数的构造函数或 {a,b,c} 实际在做什么?
【发布时间】:2018-11-02 11:53:39
【问题描述】:

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

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}}到底在做什么?

我总是发现,你可以用这种方式初始化数据,但从来没有精确地做什么。

【问题讨论】:

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


【解决方案1】:

它被称为 list initialization 并且您需要一个 std::initilizer_list 构造函数,这将在您的my_class 中实现。

(Live Demo)

#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;
}

【讨论】:

    【解决方案2】:

    您可以在构造函数中使用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)
    }
    

    【讨论】:

    • 是否需要复制构造函数?
    • 是的,它是必需的。 Q(Q const&amp;) = delete; 将在编译时通过错误initializer-list constructor (not copy constructor)
    【解决方案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

    如果初始值设定项是(非括号)braced-init-list 或者是= braced-init-list,对象或引用是list-initialized

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 2017-04-19
      相关资源
      最近更新 更多