为什么C ++在创建数组时不允许`new`调用构造函数

时间:2014-06-10 20:50:23

标签: c++ arrays constructor new-operator

让我们假设您正在堆上创建一个目标数组,如下所示:

myClass * objectPtr = new myClass[10];

new只调用默认构造函数,并且(根据我的读数)不允许调用任何其他构造函数。

为什么new无法调用任何其他构造函数,是否有任何逻辑?做一些像

这样的事情似乎更好
myClass * objectPtr = new myClass[10](12);

而不是

myClass * objectPtr = new myClass[10];
objectPtr[0] = myClass(12);
objectPtr[1] = myClass(12);
...

2 个答案:

答案 0 :(得分:15)

  

为什么C ++在创建数组时不允许new调用构造函数

确实如此。这有点单调乏味:

struct my_class
{
    my_class() {}
    my_class(int, int) {}   
};

int main() 
{
  my_class* objectPtr = new my_class[3]{my_class(1,2),
                                        my_class(), 
                                        my_class(3,4)};
}

答案 1 :(得分:-2)

通常,您不希望多次构造同一个对象,因此您构建了许多默认对象,并使用for循环可以根据需要更改它们。

您可以使用的另一种方式是:

myClass **ObjectPointers = new myClass*[NUMBER_OF_OBJECTS];
for (int i=0; i<NUMBER_OF_OBJECTS; ++i)
    ObjectPointers[i] = new myClass(1,2,3,...); # <-- non-default constructor

这样,您可以动态地分配指向可以单独构建的对象的指针。