ptr-> привет (); / * VERSUS * / (* ptr) .hello (); - PullRequest
12 голосов
/ 15 января 2009

Я изучал указатели C ++, и оператор -> показался мне странным. Вместо ptr->hello(); можно было бы написать (*ptr).hello();, потому что это также, кажется, работает, поэтому я подумал, что первое - просто более удобный способ.

Это так или есть какая-то разница?

Ответы [ 6 ]

35 голосов
/ 15 января 2009

Оператор -> это просто синтаксический сахар , потому что (*ptr).hello() является типом PITA. С точки зрения инструкций, генерируемых на уровне ASM, нет никакой разницы. На самом деле, в некоторых языках (на ум приходит D) компилятор вычисляет все по типу. Если вы делаете ptr.hello(), это просто работает, потому что компилятор знает, что ptr является указателем и не имеет свойства hello (), поэтому вы должны иметь в виду (*ptr).hello().

15 голосов
/ 15 января 2009

Другие уже ответили по поводу встроенных указателей. Что касается классов, то возможно перегрузить оператор -> (), operator & () и operator * (), но не оператор. ().

Это означает, что объект может действовать по-разному, в зависимости от того, какой синтаксис вы вызываете.

8 голосов
/ 15 января 2009

Основным преимуществом с точки зрения читабельности является необходимость цепочки вызовов функций, т. Е .:

.
ptr->getAnotherPtr()->getAThirdPtr()->print()

Я даже не собираюсь делать это с оператором *.

7 голосов
/ 15 января 2009

Единственная причина использования оператора '->' - сделать его более удобным и сохранить ошибки, такие как:

*ptr.hello();

Потому что так легко забыть скобки.

5 голосов
/ 15 января 2009

Они генерируют один и тот же точный машинный код, но для меня ptr-> arg () гораздо легче читать, чем (* ptr) .arg ().

0 голосов
/ 15 января 2009

Эти альтернативные режимы синтаксиса взяты из C, и вы можете получить дополнительное понимание от Учебное пособие по указателям и массивам в C , в частности, глава 5, Указатели и структура .

...