Подтвердить что ты не робот

Ptr-> привет();/* VERSUS */(* ptr).hello();

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

*ptr.hello();

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

Ответ 5

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