Код IT
← Каталог

Операторы и выражения в C++ — Пример — минимальный "умный указатель"

Фрагмент из «Операторы и выражения в C++»: Пример — минимальный "умный указатель".

C++ main.cpp
template<typename T>
class UniquePtr {
    T* ptr_;
public:
    explicit UniquePtr(T* p = nullptr) : ptr_(p) {}
    ~UniquePtr() { delete ptr_; }

    UniquePtr(const UniquePtr&) = delete;
    UniquePtr& operator=(const UniquePtr&) = delete;

    UniquePtr(UniquePtr&& other) noexcept : ptr_(other.ptr_) {
        other.ptr_ = nullptr;
    }

    UniquePtr& operator=(UniquePtr&& other) noexcept {
        if (this != &other) {
            delete ptr_;
            ptr_ = other.ptr_;
            other.ptr_ = nullptr;
        }
        return *this;
    }

    // Операторы разыменования
    T& operator*() const { return *ptr_; }      // возвращает lvalue
    T* operator->() const { return ptr_; }      // возвращает указатель

    // Проверка на "истинность"
    explicit operator bool() const { return ptr_ != nullptr; }

    // Отдача владения
    T* release() noexcept {
        T* p = ptr_;
        ptr_ = nullptr;
        return p;
    }

    void reset(T* p = nullptr) noexcept {
        delete ptr_;
        ptr_ = p;
    }
};
template<typename T>
class UniquePtr {
    T* ptr_;
public:
    explicit UniquePtr(T* p = nullptr) : ptr_(p) {}
    ~UniquePtr() { delete ptr_; }

    UniquePtr(const UniquePtr&) = delete;
    UniquePtr& operator=(const UniquePtr&) = delete;

    UniquePtr(UniquePtr&& other) noexcept : ptr_(other.ptr_) {
        other.ptr_ = nullptr;
    }

    UniquePtr& operator=(UniquePtr&& other) noexcept {
        if (this != &other) {
            delete ptr_;
            ptr_ = other.ptr_;
            other.ptr_ = nullptr;
        }
        return *this;
    }

    // Операторы разыменования
    T& operator*() const { return *ptr_; }      // возвращает lvalue
    T* operator->() const { return ptr_; }      // возвращает указатель

    // Проверка на "истинность"
    explicit operator bool() const { return ptr_ != nullptr; }

    // Отдача владения
    T* release() noexcept {
        T* p = ptr_;
        ptr_ = nullptr;
        return p;
    }

    void reset(T* p = nullptr) noexcept {
        delete ptr_;
        ptr_ = p;
    }
};