Какая польза от перегрузки оператора доступа члена?
Возможный дубликат:
Перегрузка оператора
Оператор доступа к элементу -> может быть перегружен для возврата указателя на элемент данных или какую-либо другую переменную.
Где эта функция используется? Какие проблемы кодирования он решает или, наоборот, что облегчает?
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.:)