Почему С++ не позволяет `new` вызывать конструктор при создании массивов
Предположим, вы создаете массив объектов на куче, например:
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);
...
Ответы
Ответ 1
Почему С++ не позволяет 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)};
}
Ответ 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
Таким образом вы динамически выделяете указатели на объекты, которые вы можете создать отдельно.