我正在使用给定类的动态数组,我们将其称为“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和更高版本中,使用
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 ...