Следующие два выражения эквивалентны:
a->b
(*a).b
(подвергающийся перегрузке оператора, как Konrad упоминает, но это необычно).
a->b
обычно синоним для (*a).b
. Круглые скобки здесь необходимы из-за обязательной силы операторов *
и .
: *a.b
не работал бы, потому что .
связывает более сильный и выполняется сначала. Это таким образом эквивалентно *(a.b)
.
Остерегаются перегрузки, хотя: С тех пор и ->
и *
может быть перегружен, их значение может отличаться решительно.
C ++-language определяет оператор (->
) стрелки как синоним для разыменования указателя, и затем используйте .
- оператор на том адресе.
, Например:
, Если у Вас есть объект, anObject
, и указатель, aPointer
:
SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
, Чтобы быть в состоянии использовать один из методов объектов Вы разыменовываете указатель и делаете вызов метода на том адресе:
(*aPointer).method();
, Который мог быть записан с оператором стрелки:
aPointer->method();
главная причина existents оператора стрелки состоит в том, что это сокращает ввод очень общей задачи, и это также довольно легкий к забыло круглые скобки вокруг разыменования указателя. Если Вы забыли круглые скобки, с. операторами свяжет более сильный тогда *-operator и заставит наш пример выполниться как:
*(aPointer.method()); // Not our intention!
Часть другого ответа имеет также упоминание и что операторы C++ могут быть перегрузкой и что не то, чтобы распространенный.
Я главным образом считал его справа налево, и вызов "в"
foo->bar->baz = qux->croak
становится:
"baz в панели в нечто становится карканьем в qux".