Оператор разыменования указателя ((*) vs ->)
Существует ли общая разница между выполнением
(*ptr).method()
против
ptr->method()
Я видел этот вопрос в комментарии к другому вопросу и думал, что попрошу его здесь. Хотя я только что вспомнил, что почти каждый оператор на С++ может быть перегружен, поэтому я думаю, что ответ будет зависеть. Но в целом, есть ли разница между тем, как делать друг против друга?
Ответы
Ответ 1
Как уже отмечалось, "jamesdlin", операторы *
и ->
могут быть перегружены для типов классов.
И тогда два выражения (*ptr).method()
и ptr->method()
могут иметь разный эффект.
Однако для встроенных операторов два выражения эквивалентны.
Оператор ->
более удобен, когда вы следуете цепочке указателей, потому что .
имеет более высокий приоритет, чем *
, что требует много неперехваченных круглых скобок.
Рассмотрим:
pBook->author->snailMail->zip
против
(*(*(*pBook).author).snailMail).zip
Ответ 2
Для типов raw-указателей они эквивалентны.
И да, для общих типов ответ действительно "зависит", поскольку классы могут перегружать operator*
и operator->
, чтобы иметь разные типы поведения.
Ответ 3
Да. ptr->method()
на два символа короче (*ptr).method()
.
Он также красивее.
Ответ 4
Стандарт С++ 5.2.5/3:
Если E1 имеет тип "указатель на класс" X ", то выражение E1- > E2 является преобразуется в эквивалентную форму (* (E1)) E2;.
Для значений без указателей операторы могут быть перегружены.
Ответ 5
Но в общем, есть ли разница между тем, как делать одно в сравнении с другим?
Нет! (если ->
и *
явно не перегружены для выполнения различных функций)
ptr->method()
и (*ptr).method()
эквивалентны.
Ответ 6
Извините, что вырыли это сообщение, но хотя выражения в OP эквивалентны для типов необработанных указателей, я думаю, что есть хотя бы одно важное отличие, упомянутое в С++, в дополнение ко всему, что было сказано:
Из Википедии (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#cite_note-arrowptr-6):
Возвращаемый тип оператора → () должен быть типом, для которого → может применяться операция, такая как тип указателя. Если x имеет тип C где C перегружает оператор → (), x- > y расширяется до x.operator → () -. > у
Это означает, что ожидается, что ->
возвращает разыменованный тип, в то время как *
, как ожидается, вернет разыменованный тип, и поэтому эта "цепочка" применяется только к ->
.
Ответ 7
Последовательность ->
служит визуальным индикатором того, что она указывает на что-то. Оба оператора выполняют ту же последовательность операций.
Ответ 8
Это синонимы. Последнее является сокращением для первого.