Для поля shared_ptr все пять специальных операций обычно достаточно объявить = default. Копирование разделяет владение тем же int, а перемещение передаёт его, не создавая отдельной копии числа.
Класс с умным указателем и соблюдением правила пяти
Для поля shared_ptr все пять специальных операций обычно достаточно объявить = default. Копирование разделяет владение тем же int, а перемещение передаёт его, не создавая отдельной копии числа.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать класс, внутри которого хранится объект типа std::shared_ptr. Требуется полностью реализовать правило пяти: пользовательский конструктор копирования, оператор копирования, конструктор перемещения, оператор перемещения и деструктор.
class MyClass {
std::shared_ptr<int> data;
public:
// правило пяти
};
Ответ
Для поля shared_ptr все пять специальных операций обычно достаточно объявить = default. Копирование разделяет владение тем же int, а перемещение передаёт его, не создавая отдельной копии числа.
#include <memory>
class MyClass {
std::shared_ptr<int> data;
public:
MyClass() = default;
MyClass(const MyClass&) = default;
MyClass& operator=(const MyClass&) = default;
MyClass(MyClass&&) noexcept = default;
MyClass& operator=(MyClass&&) noexcept = default;
~MyClass() = default;
};
Это явное оформление правила пяти без дублирования логики shared_ptr. Если нужны собственные тела для демонстрации, в copy-операциях копируйте data, в move — присваивайте std::move(other.data). Для реального класса без дополнительных ресурсов предпочтительно правило нуля: вообще не объявлять эти операции.