Инициализация массива объектов, созданных в куче

Учитывая нетривиальную структуру данных:

      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), конструкторы рассматриваются и подвергаются разрешению перегрузки для пустого списка аргументов. Выбранный конструктор (который является одним из конструкторов по умолчанию) вызывается для предоставления начального значения для нового объекта;


Это означает, что в вашем примере гарантированно будет вызван конструктор по умолчанию.

Другие вопросы по тегам