Конструктор по умолчанию — это конструктор, который может быть вызван без аргументов. Он может быть:
= delete
)Примеры:
class ImplicitDefault {
// Компилятор сгенерирует конструктор по умолчанию
};
class ExplicitDefault {
public:
ExplicitDefault() {} // Явное определение
};
class DeletedDefault {
public:
DeletedDefault() = delete; // Явное удаление
};
Компилятор автоматически генерирует конструктор по умолчанию, если:
Позволяет явно указать компилятору сгенерировать реализацию по умолчанию:
class Widget {
public:
Widget() = default; // Явное указание использовать реализацию по умолчанию
};
Преимущества = default
:
Явно запрещает использование определенных функций:
class NonCopyable {
public:
NonCopyable(const NonCopyable&) = delete; // Запрет копирования
};
Применение = delete
:
class MoveOnly {
public:
MoveOnly() = default;
MoveOnly(const MoveOnly&) = delete;
MoveOnly(MoveOnly&&) = default;
};
void process(int x);
void process(double) = delete; // Запрещаем вызов с double
template<typename T>
void log(T value);
template<>
void log<void>(void) = delete; // Запрещаем вызов с void
= default
— явное указание использовать реализацию по умолчанию, сохраняет тривиальность типа= delete
— мощный инструмент для:
Использование default
и delete
делает код более выразительным и безопасным, явно документируя намерения разработчика.