2010-11-24 4 views
32

Есть ли вообще разница между выполнениемУказатель разыменования оператор ((*) против ->)

(*ptr).method() 

против

ptr->method() 

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

+0

BTW, комментарий был из этого вопроса: http://stackoverflow.com/questions/4263640/find-mapped-value-of-map/4263652#4263652 :) – wrongusername 2010-11-24 05:42:15

ответ

56

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

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

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

-> оператор более удобно, когда вы следуете цепь указателей, потому что . имеет более высокий приоритет, чем *, что требует много ungrokkable скобок.

Рассмотрим:

pBook->author->snailMail->zip 

против

(*(*(*pBook).author).snailMail).zip 
0

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

4

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

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

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

+0

эти операторы могут быть перегружены для классов, а затем два выражения могут иметь разный эффект. Нет!" является правильным для встроенных операторов. Cheers, – 2010-11-24 05:52:15

+0

@Alf: Добавлена ​​часть `except`. :) – 2010-11-24 05:55:23

9

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

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

12

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

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

+38

если класс делает это, конечно, у вас есть право ударить автора в лицо ... Жестко. – jalf 2010-11-24 06:42:43

1

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

8

C++ Standard 5.2.5/3:

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

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

2

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

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

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

Это означает, что -> ожидается возвращение типа разыменовываемое, в то время как * ожидается, возвращать разыменовываются типа, и, следовательно, это «цепочки» относится только ->.

Смежные вопросы