Перегрузка операторов доступа для собственного умного указателя

operator* должен возвращать ссылку на управляемый объект, а operator-> — указатель на него. Они предоставляют доступ, но не меняют счётчик владельцев.

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

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

operator* должен возвращать ссылку на управляемый объект, а operator-> — указатель на него. Они предоставляют доступ, но не меняют счётчик владельцев.

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

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

Условие

Необходимо реализовать перегрузку операторов разыменования (*) и доступа к членам (->) для класса CustomSharedPtr, позволяя получать объект, которым управляет этот умный указатель.

Ответ

operator* должен возвращать ссылку на управляемый объект, а operator-> — указатель на него. Они предоставляют доступ, но не меняют счётчик владельцев.

Для шаблона CustomSharedPtr<T>, где resource имеет тип T*:

T& operator*() const noexcept { return *resource; }
T* operator->() const noexcept { return resource; }
explicit operator bool() const noexcept {
    return resource != nullptr;
}

Как и у стандартного shared_ptr, const самого указателя не делает объект неизменяемым: для этого нужен CustomSharedPtr<const T>. Разыменовывать пустой указатель нельзя. В учебной реализации можно добавить проверки, но тогда следует согласовать их с noexcept и контрактом ошибок.

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

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

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

Подробнее