Когда ты создаёшь массив объектов Fred, для каждого элемента вызывается конструктор по умолчанию. Это работает как для массивов на стеке, так и для динамически выделяемых массивов:
Fred a[10]; // вызывает конструктор по умолчанию 10 раз
Fred* p = new Fred[10]; // вызывает конструктор по умолчанию 10 раз
Если в твоём классе нет конструктора по умолчанию, попытка создать массив с помощью приведённого выше синтаксиса приведёт к ошибке компиляции:
class Fred {
public:
Fred(int i, int j); // нет конструктора по умолчанию
};
Fred a[10]; // ОШИБКА: нет конструктора по умолчанию
Fred* p = new Fred[10]; // ОШИБКА: нет конструктора по умолчанию
Вместо того чтобы полагаться на конструкторы по умолчанию, предпочитай std::vector обычным массивам. Это позволяет инициализировать все элементы любым конструктором:
std::vector<Fred> a(10, Fred(5, 7)); // все 10 объектов инициализированы Fred(5,7)
Если ты всё же должен использовать массивы без конструктора по умолчанию, используй синтаксис явной инициализации:
Fred a[10] = {
Fred(5,7), Fred(5,7), Fred(5,7), Fred(5,7), Fred(5,7),
Fred(5,7), Fred(5,7), Fred(5,7), Fred(5,7), Fred(5,7)
};
Placement-new позволяет вручную инициализировать объекты, но существенно усложняет код:
std::vectorУчитывая всё это, std::vector остаётся лучшим выбором почти во всех ситуациях.
При создании массива объектов, выделенного в стеке, без конструктора по умолчанию ошибка компиляции возникает во время выполнения, а не во время компиляции.
Новый — ещё не проверен сообществом
Вы