为什么在创建 class 对象数组时不能调用参数化构造函数?
Why parameterized constructor can't be called while creating array of class Objects?
我是 C++ 的新手,我需要一些关于构造函数的说明,我的问题是:
- 我们可以在创建 class 个对象的数组时使用参数化构造函数吗?
- 或者只有在创建 class 个对象的数组时才能使用默认构造函数?
请解释如何做到或为什么不能。我需要对此有更深入的了解。
是的,这是可能的,尽管在 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} };
您可以使用参数化构造函数来初始化数组。请参阅以下示例。
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;
}
数组 things
包含 Foo
个对象。我正在使用统一初始化在数组中构造 3 个 Foo
对象。这些依赖于我在 class.
中定义的参数化构造函数
假设我们有这个 class:
class Foo
{
public:
Foo(int i, const std::string& s);
// ...
};
然后
是:
std::vector<Foo> myFooVector(5, Foo(1, "bar"));
上面创建了一个包含五个 Foo
对象的 vector,每个对象都有参数 1
和 "bar"
发送到参数化构造函数。
您也可以使用数组,例如
std::array<Foo, 2> myFooArray = {
{ 1, "bar" },
{ 2, "quug" }
};
上面创建了一个包含两个 Foo
对象的 array,每个对象都使用参数化构造函数构造。
如果您没有显式调用任何构造函数,那么将使用默认构造函数。使用上面的示例:
std::vector<Foo> myFooVector(5);
这将创建一个包含五个默认构造的 Foo
对象的向量。
和
std::array<Foo, 2> myFooArray;
这将创建一个包含两个默认构造的 Foo
对象的数组。
我是 C++ 的新手,我需要一些关于构造函数的说明,我的问题是:
- 我们可以在创建 class 个对象的数组时使用参数化构造函数吗?
- 或者只有在创建 class 个对象的数组时才能使用默认构造函数?
请解释如何做到或为什么不能。我需要对此有更深入的了解。
是的,这是可能的,尽管在 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} };
您可以使用参数化构造函数来初始化数组。请参阅以下示例。
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;
}
数组 things
包含 Foo
个对象。我正在使用统一初始化在数组中构造 3 个 Foo
对象。这些依赖于我在 class.
假设我们有这个 class:
class Foo
{
public:
Foo(int i, const std::string& s);
// ...
};
然后
是:
std::vector<Foo> myFooVector(5, Foo(1, "bar"));
上面创建了一个包含五个
Foo
对象的 vector,每个对象都有参数1
和"bar"
发送到参数化构造函数。您也可以使用数组,例如
std::array<Foo, 2> myFooArray = { { 1, "bar" }, { 2, "quug" } };
上面创建了一个包含两个
Foo
对象的 array,每个对象都使用参数化构造函数构造。如果您没有显式调用任何构造函数,那么将使用默认构造函数。使用上面的示例:
std::vector<Foo> myFooVector(5);
这将创建一个包含五个默认构造的
Foo
对象的向量。和
std::array<Foo, 2> myFooArray;
这将创建一个包含两个默认构造的
Foo
对象的数组。