我正在使用给定类的动态数组,我们将其称为“ 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] 删除。
我来说两句