Конструктор и деструкторы по умолчанию - это просто товар, если вам не нужно делать что-то особенное с вашим классом, вам не нужно писать пустую версию вручную.Это распространено в других языках OO, например, в Java вам не нужно предоставлять конструктор, если достаточно нулевой инициализации членов.В то же время это требование обратной совместимости с C. Если у вас есть struct
в C, у него не будет конструктора или деструктора (у C нет таких понятий), чтобы иметь возможность обрабатывать этот код в C ++, которыйдолжен быть действительный код.
Другая опция могла бы объявить на языке, что у класса не может быть конструктора или деструктора, но тогда вся спецификация языка должна учитывать тот факт, что некоторые типы могут иметь конструкторы.и деструкторы, в то время как другие не делают, и это сделает язык более сложным и трудным для определения.Хотя наличие неявно определенных версий не меняет поведение и облегчает спецификацию.
На этом уровне это похоже на термин overrider , применяемый к методу в базовом классе.В базовом классе ничего не переопределяет , переопределять нечего!И все же язык явно заявляет, что виртуальный не чистый метод, объявленный в базе, является переопределением.Это позволяет спецификации просто сказать, что final overrider будет вызываться, когда метод вызывается через указатель или ссылку, без необходимости добавления extre * или реализации базового метода, если переопределения для этого конкретного метода не существуетв этой конкретной иерархии.