Какая польза от перегрузки оператора доступа члена?

Возможный дубликат:
Перегрузка оператора

Оператор доступа к элементу -> может быть перегружен для возврата указателя на элемент данных или какую-либо другую переменную.

Где эта функция используется? Какие проблемы кодирования он решает или, наоборот, что облегчает?

3 ответа

Решение

Оператор доступа к члену является несколько странным существом: он предназначен для возврата указателя или класса с перегруженным оператором доступа к члену. Как только он достигает указателя, он просто обращается к соответствующему члену. Основным использованием перегрузки оператора доступа к элементу являются интеллектуальные указатели, например, std::shared_ptr<T> а также std::unique_ptr<T>, Без этого оператора вам нужно было бы использовать что-то вроде

sp.get()->member

или же

(*sp).member

вместо

sp->member

Обратите внимание, что оба термина "переопределение" и "перегрузка" сильно вводят в заблуждение. Канонический -> Оператор обращается к члену объекта, на который ссылается указатель, то есть X* x; x->foo; получает доступ к чему-то, на что указывает x который имеет тип указателя (или, точнее, необработанный указатель).

Тем не менее operator-> то, что вы можете реализовать как нестатическую функцию-член в агрегатных типах (то есть "классах"), делает что-то другое. В X* x; x->foo;, -> все равно будет оператором канонической структуры, который нельзя изменить. Однако в Y y; y->foo, -> будет ссылаться на operator-> функция-член Y, Это, казалось бы, небольшое различие имеет решающее значение, поскольку один оператор может применяться только к необработанным типам указателей, а другой - только к типам без указателей.

Это обычно используется, чтобы позволить типам вести себя синтаксически так, как если бы они были необработанными указателями (с некоторыми семантическими различиями), как в shared_ptr и другие. Этого нельзя достичь без такой языковой поддержки, как shared_ptr<X> а также X* не может быть использован таким же образом, если не было shared_ptr<X>::operator-> позволяя имитировать каноническое -> оператор, который применим к X* (но нет X).

Когда вы моделируете указатель, и вы хотите сохранить обычный синтаксис для удобства. Просто взгляните на std::unique_ptr и std::shared_ptr.:)

Другие вопросы по тегам