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

Оператор разыменования указателя ((*) vs ->)

Существует ли общая разница между выполнением

(*ptr).method()

против

ptr->method()

Я видел этот вопрос в комментарии к другому вопросу и думал, что попрошу его здесь. Хотя я только что вспомнил, что почти каждый оператор на С++ может быть перегружен, поэтому я думаю, что ответ будет зависеть. Но в целом, есть ли разница между тем, как делать друг против друга?

4b9b3361

Ответ 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

Это синонимы. Последнее является сокращением для первого.