初始化一个动态数组

Initializing a dynamic array

我正在使用给定 class 的动态数组,我们称它为 'MyClass',问题是这个 class 有一个带有给定参数的专用构造函数。

据我所知初始化一个动态数组我应该使用这个:

MyClass *myArray = new MyClass[]();

有没有办法使用我的专用构造函数来初始化我的数组?类似于:

MyClass *myArray = new MyClass[](givenParameter);

这让我想到了另一个问题,MyClass *myArray = new MyClass[](); 行是在没有任何给定参数的情况下调用基本构造函数还是在内部执行其他操作?

这可能是显而易见的事情,但我找不到太多相关信息,至少不能解决我的第一个问题。谢谢大家。

MyClass *arr;
arr = new MyClass[2]{{10, "hello"},{20, "custom constructor"}};

我不确定是否有其他方法可以使用非标准构造函数初始化 C 数组。

但是如果您可以使用 std::vector 那么:

#include <vector>
size_t size = 2;
std::vector<MyClass> myArray(size, MyClass(givenParameter));

语法MyClass *myArray = new MyClass[size]();允许你在元素是普通的简单类型(如整数等,因此将它们设置为0)时对元素进行值初始化,但对于[=的元素意义不大29=] 类型,因此通常省略这些类型的 ()new[] 只能调用 class/struct 类型的默认构造函数,不允许调用非默认构造函数。

但是,一种处理方法是改用 placement-new,这样您就可以单独构造每个 MyClass 对象,甚至可以根据需要使用不同的参数值。

// allocate raw memory to hold the objects array...
char *myArrayBuf = new char[sizeof(MyClass) * NumberOfItems];
/* alternatively, in C++11 and later:
#include <type_traits>
using element_type = std::aligned_storage<sizeof(MyClass), alignof(MyClass)>::type;
element_type *myArrayBuf = new element_type[NumberOfItems];
*/

// call the constructor on each object in the array...
MyClass *myArray = reinterpret_cast<MyClass*>(myArrayBuf);
for(int i = 0; i < NumberOfItems; ++i) {
    new(&myArray[i]) MyClass(givenParameter);
}

// use myArray as needed ...

// call the destructor on each object in the array...
for(int i = 0; i < NumberOfItems; ++i) {
    myArray[i].~MyClass();
}

// deallocate the raw memory for the array...
delete[] myArrayBuf;

在 C++11 及更高版本中,使用 std::vector 会更容易处理(无论如何你都应该使用):

#include <vector>

std::vector<MyClass> myArray;
myArray.reserve(NumberOfItems);

for(int i = 0; i < NumberOfItems; ++i) {
    myArray.emplace_back(givenParameter);
}

// use myArray as needed ...

在 C++11 之前,您仍然可以使用 std::vector,但需要复制构造数组元素:

#include <vector>

std::vector<MyClass> myArray;
myArray.reserve(NumberOfItems);

for(int i = 0; i < NumberOfItems; ++i) {
    myArray.push_back(MyClass(givenParameter));
}

// use myArray as needed ...