初始化动态数组

马克·波菲亚斯(Marc Bofias)

我正在使用给定类的动态数组,我们将其称为“ MyClass”,问题是此类具有带有给定参数的专用构造函数。

据我所知初始化动态数组,我应该使用此:

MyClass *myArray = new MyClass[]();

有没有办法使用我的专用构造函数初始化数组?就像是:

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

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

这可能很明显,但我无法在此上找到很多信息,至少不能解决我的第一个问题。谢谢大家。

雷米·勒博

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

但是,一种解决方法是使用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及更高版本中,这将更容易使用astd::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 ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章