Создание класса с поддержкой глубокого копирования

При глубоком копировании новый объект получает собственный динамический ресурс с тем же содержимым. В присваивании сначала создайте копию и только после успеха заменяйте старый ресурс.

Короткий ответ

Что ответить на собеседовании

При глубоком копировании новый объект получает собственный динамический ресурс с тем же содержимым. В присваивании сначала создайте копию и только после успеха заменяйте старый ресурс.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо написать класс, у которого определён пользовательский конструктор копирования и оператор присваивания, правильно работающие с полями, размещёнными в динамической памяти.

class CustomClass {
    // поля с динамической памятью
    // реализовать глубокое копирование
};

Ответ

При глубоком копировании новый объект получает собственный динамический ресурс с тем же содержимым. В присваивании сначала создайте копию и только после успеха заменяйте старый ресурс.

#include <memory>
#include <utility>

class CustomClass {
    std::unique_ptr<int> data;
public:
    explicit CustomClass(int value) : data(std::make_unique<int>(value)) {}
    CustomClass(const CustomClass& other)
        : data(other.data ? std::make_unique<int>(*other.data) : nullptr) {}
    CustomClass& operator=(const CustomClass& other) {
        if (this != &other) {
            auto copy = other.data ? std::make_unique<int>(*other.data) : nullptr;
            data = std::move(copy);
        }
        return *this;
    }
    CustomClass(CustomClass&&) noexcept = default;
    CustomClass& operator=(CustomClass&&) noexcept = default;
    ~CustomClass() = default;
};

unique_ptr отвечает за освобождение памяти. Если создание копии бросит исключение, прежнее data сохранится. Пустое состояние после перемещения также корректно копируется, а самоприсваивание безопасно.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее