3

我是 C++ 新手,我需要对构造函数进行一些说明,我的问题是:

  1. 我们可以在创建类对象数组时使用参数化构造函数吗?
  2. 还是只能在创建类对象数组时使用默认构造函数?

请解释它是如何做到的,或者为什么不能做到。我需要对此有更深入的了解。

4

3 回答 3

6

您可以使用参数化构造函数来初始化数组。请参阅以下示例。

class Foo
{
public:
    Foo(int _a, bool _b) : a{_a}, b{_b} {}
private:
    int a;
    bool b;
};

int main() {
    Foo things[] = {{5, true},
                    {3, false},
                    {7, true}};
    return 0;
}

数组thingsFoo对象。我正在使用统一初始化Foo在数组中构造 3 个对象。这些依赖于我在类中定义的参数化构造函数。

于 2015-02-11T13:44:24.660 回答
4

是的,这是可能的,尽管在 C++03 中有一些限制。这是有效的:

A a[3] = { x, y, z };

但是要调用带有多个参数的构造函数,您需要执行以下操作:

A a[3] = { A(x1, x2, x3), A(y1, y2, y3), A(z1, z2, z3) };

在 C++11 中,由于新的统一初始化语法,它更容易:

A a[3] = { {x1, x2, x3}, {y1, y2, y3}, {z1, z2, z3} };
于 2015-02-11T13:44:16.660 回答
2

假设我们有这个类:

class Foo
{
public:
    Foo(int i, const std::string& s);
    // ...
};

然后

  1. 是的:

    std::vector<Foo> myFooVector(5, Foo(1, "bar"));
    

    上面创建了一个包含五个对象的向量Foo,每个对象都有参数1并发"bar"送到参数化构造函数。

    您还可以使用数组,例如

    std::array<Foo, 2> myFooArray = {
        { 1, "bar" },
        { 2, "quug" }
    };
    

    上面创建了一个包含两个对象的数组Foo,每个对象都使用参数化构造函数构造。

  2. 如果您没有显式调用任何构造函数,则将使用默认构造函数。使用上面的示例:

    std::vector<Foo> myFooVector(5);
    

    这将创建一个包含五个默认构造Foo对象的向量。

    std::array<Foo, 2> myFooArray;
    

    Foo这将创建一个包含两个默认构造对象的数组。

于 2015-02-11T13:46:36.177 回答