В C++ для класса автоматически создаются следующие конструкторы (если они не были явно определены программистом):
-
Конструктор по умолчанию (без параметров)
- Создается автоматически только если не определен никакой другой конструктор.
- Выполняет инициализацию членов класса значениями по умолчанию.
- Для встроенных типов это будут случайные значения (мусор).
- Для объектов других классов вызываются их конструкторы по умолчанию.
-
Конструктор копирования
- Создает новый объект как копию существующего.
- Выполняет полное побайтовое копирование (shallow copy).
- Прототип конструктора:
ClassName(const ClassName& other)
.
-
Конструктор перемещения (начиная с C++11)
- Перемещает ресурсы из одного объекта в другой, не создавая копии.
- Прототип:
ClassName(ClassName&& other)
. - Оставляет исходный объект в валидном, но неопределенном состоянии.
-
Оператор присваивания копированием
- Копирует содержимое одного объекта в другой существующий
- Прототип:
ClassName& operator=(const ClassName& other)
-
Оператор присваивания перемещением (начиная с C++11)
- Перемещает ресурсы между существующими объектами.
- Прототип:
ClassName& operator=(ClassName&& other)
.
-
Деструктор
- Вызывается автоматически при выходе объекта из области видимости.
- Освобождает ресурсы при уничтожении объекта.
- Прототип:
~ClassName()
. - Не очищает указатель объекта при динамическом выделении памяти.
Важно отметить:
- Если вы явно определите хотя бы один конструктор, компилятор не будет создавать конструктор по умолчанию.
- Если вы управляете ресурсами в классе (например, динамической памятью), следует явно определить или запретить эти специальные функции-члены.
- С C++11 можно явно указать компилятору создать (
=default
) или запретить (=delete
) любую из этих функций