Оператор разыменования указателя ((*) vs ->) - PullRequest
34 голосов
/ 24 ноября 2010

Есть ли общая разница между

(*ptr).method()

против

ptr->method()

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

Ответы [ 8 ]

59 голосов
/ 24 ноября 2010

Как уже отмечал "jamesdlin", операторы * и -> могут быть перегружены для типов классов.

И тогда два выражения (*ptr).method() и ptr->method() могут иметь разный эффект.

Однако для встроенных операторов оба выражения эквивалентны.

Оператор -> более удобен, когда вы следуете за цепочкой указателей, потому что . имеет более высокий приоритет, чем *, поэтому требуется множество незапятнанных скобок.

Рассмотрим:

pBook->author->snailMail->zip

против

(*(*(*pBook).author).snailMail).zip
12 голосов
/ 24 ноября 2010

Для необработанных типов указателей они эквивалентны.

И да, для общих типов ответ действительно «зависит», поскольку классы могут перегружать operator* и operator->, чтобы иметь различное поведение.

10 голосов
/ 24 ноября 2010

Да.ptr->method() на два символа короче (*ptr).method().

Это также красивее.

8 голосов
/ 24 ноября 2010

C ++ Стандарт 5.2.5 / 3:

Если E1 имеет тип «указатель на класс» X », тогда выражение E1-> E2 преобразован в эквивалентную форму (* (E1)) E2;.

Для значений без указателей операторы могут быть перегружены.

5 голосов
/ 24 ноября 2010

Но в целом, есть ли разница между выполнением одного и другого?

Нет! (если -> и * явно не перегружены для выполнения различных функций)

ptr->method() и (*ptr).method() эквивалентны.

2 голосов
/ 22 июля 2014

Извините, что копаю этот пост, но хотя выражения в OP эквивалентны для необработанных типов указателей, я думаю, что есть хотя бы одно важное отличие, которое следует упомянуть в C ++, помимо всего, что было сказано:

Из Википедии (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#cite_note-arrowptr-6):

Возвращаемый тип оператора -> () должен быть типом, для которого -> Операция может быть применена, например, тип указателя. Если х имеет тип С где C перегружает оператор -> (), x-> y расширяется до x.operator -> () -> у

.

Это означает, что -> должен возвращать разыменованный тип , тогда как * должен возвращать разыменованный тип, и, следовательно, эта "цепочка" применяется к * Только 1016 *.

1 голос
/ 24 ноября 2010

Последовательность -> служит визуальным индикатором того, что она указывает на что-то. Оба оператора выполняют одинаковую последовательность операций.

0 голосов
/ 24 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...