Выбор ответа Junior Правило 0/3/5 обновлено
Куда пропал конструктор по умолчанию
Вопрос
В класс добавили конструктор Point(int x, int y). Теперь Point p; не компилируется. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Объявление любого конструктора отменяет неявный конструктор по умолчанию. Неявный конструктор по умолчанию создаётся, только если пользователь не объявил ни одного конструктора.
Варианты ответа
- Конструктор по умолчанию всегда нужно писать вручную, компилятор его не создаёт
- У класса с
int-членами не бывает конструктора по умолчанию - Нужно было объявить деструктор, тогда конструктор сгенерируется
- Объявление любого конструктора отменяет неявный конструктор по умолчаниюправильный ответ
Разбор
Неявный конструктор по умолчанию создаётся, только если пользователь не объявил ни одного конструктора. Вернуть его просто: Point() = default; (и лучше дать членам инициализаторы int x = 0;).
- Без пользовательских конструкторов компилятор сгенерирует его сам.
- Тип членов на это не влияет.
- Деструктор не связан с конструктором по умолчанию.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Правило 0/3/5»
- Длинная арифметика: класс BigUint и факториал
- Класс матрицы 2×2 и быстрое возведение в степень
- Что даёт copy-and-swap
- Когда не генерируется перемещение
- Что объявили и что сгенерирует компилятор
- Объявили перемещающий конструктор
- Почему move должен быть noexcept
- Что выведет: деструктор отключил перемещение