如何让它调用正确的构造函数

How do I make it call the right constructor?

本文关键字:构造函数 调用      更新时间:2023-10-16

当我像这样创建一个用户定义类的数组时,它将默认构造每个元素:

S s[5]; // calls default constructor five times, one for each S object

但是如果我的类不是默认可解释的呢?我将如何实例化和以后使用这个数组?

例如,我的类S可能不是默认可解释的,但它确实有另一个这样的构造函数:
S(int, int);

我如何使它调用这个构造函数而不是默认的构造函数?

struct S
{
   const int m;
   S(int p, int k) : m(p) {}
};
S arr[4] = {S(1,1), S(1,2), S(1,3), S(1,4)};

如果没有copy-ctor,您仍然可以使用下面的c++ 11列表初始化——正如Andy Prowl指出的那样,ctor可能不是explicit:

S arr[4] = {{1,1}, {1,2}, {1,3}, {1,4}};

对于更具可伸缩性的解决方案,您可以使用std::arraystd::vector:

std::array<S,4> make_array()
{
    // create array... and return
}
std::array<S,4> arr = make_array();

使用std::vector并填充由决定如何构造的对象。

例如,在c++ 11中,您可以使用emplace_back()成员函数编写如下内容:

#include <vector>
std::vector<S> v;
v.emplace_back(42, 1729);
v.emplace_back(0, 6);
// ...

甚至:

std::vector<S> v = { {42, 1729}, {0, 6} };

如果S的构造函数没有标记为explicit。如果是这种情况,您必须这样写:

std::vector<S> v = { S{42, 1729}, S{0, 6} }.

在c++ 03中,emplace_back()和统一初始化还不存在,你可以这样做:

#include <vector>
std::vector<S> v;
v.push_back(S(42, 1729));
v.push_back(S(0, 6));
// ...

但是你的类应该是可复制的,以便编译。

过去我做过一些:

S** s = new S*[5];
s[0] = new S(1, 2);
s[1] = new S(1, 2);

只是为了能够调用其他构造函数