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 и контрактом ошибок.