Инициализация массива объектов, созданных в куче
Учитывая нетривиальную структуру данных:
claas MyClass
{
public:
MyClass():x(0), p(nullptr)
{}
private:
int x;
int* p;
};
Есть ли какая-либо гарантия, предоставляемая спецификацией С++, что конструктор по умолчанию будет вызываться для каждого экземпляраMyClass
в массиве, указанномptr
?
основной () { MyClass* ptr = новый MyClass[5]; }
1 ответ
Есть ли какая-либо гарантия, предоставляемая спецификацией С++, что конструктор по умолчанию будет вызываться для каждого экземпляра
MyClass
в массиве, указанномptr
?
Да, это гарантируется, как описано ниже.
Из документации нового выражения :
::(optional) new new-type initializer(optional) (2)
Объект, созданный a, инициализируется в соответствии со следующими правилами:
Если тип или
new-type
является типом массива , инициализируется массив объектов.
- Если инициализатор отсутствует, каждый элемент инициализируется по умолчанию .
И далее из документации по инициализации по умолчанию :
new T (2)
Инициализация по умолчанию выполняется в трех случаях:
2) когда объект с динамическим сроком хранения создается
new-expression
без инициализатора;
Более того,
Последствия инициализации по умолчанию:
- если
T
является типом массива, каждый элемент массива инициализируется по умолчанию;
(выделено мной)
Обратите внимание на самое последнее утверждение, в котором говорится, что «каждый элемент инициализирован по умолчанию» , что означает (в вашем примере) конструктор по умолчанию будет вызываться в соответствии с пунктом 1:
если T является (возможно, cv-квалифицированным) типом класса, отличным от POD (до C++11), конструкторы рассматриваются и подвергаются разрешению перегрузки для пустого списка аргументов. Выбранный конструктор (который является одним из конструкторов по умолчанию) вызывается для предоставления начального значения для нового объекта;
Это означает, что в вашем примере гарантированно будет вызван конструктор по умолчанию.