2012-02-12 3 views
3

Может ли кто-нибудь объяснить мне, что означает «->» на C++?Что означает оператор «->» на C++?

Примеры, если вы можете, они помогают мне лучше понять. Спасибо.

+1

+1 Я не знаю, почему люди сбрасывают вас. Это основной вопрос, но что? Это не плохо. –

+1

+1: Это простой вопрос, но очень сложно искать в Интернете такие персонажи. Вы, вероятно, выиграли бы от [хорошей книги] (http://stackoverflow.com/q/388242/78845). – Johnsyweb

+4

Правда, это основной вопрос. Но это также вопрос, на который легко ответить *, глядя на * любую * книгу на C++ или C. Google - это не только * исследование, которое должны делать люди. –

ответ

9

Это ярлык для разыменования, за которым следует доступ к свойствам (или вызов метода).

В коде, вот некоторые примеры этой эквивалентности:

Foo *foo; 

// field access 
foo->bar = 10; 
(*foo).bar = 10; 

// method invocation 
foo->baz(); 
(*foo).baz(); 

Это особенно удобно, если у вас есть длинная последовательность из них. Например, если у вас есть односвязана структура списка данных, в которой каждый элемент имеет указатель на следующий, следующие эквивалентные способы поиска пятого элемента (но выглядит гораздо лучше):

linked_list *head, *fifth; 
fifth = head->next->next->next->next; 
fifth = (*(*(*(*head).next).next).next).next; 
+0

Это гораздо удобнее.Вот фрагмент кода из какого-то реального кода, указав указатель на дескриптор ресурса ('rd'), он получает дружественное имя сервера, на котором размещен ресурс:' rd-> resource-> GetServer() -> GetFriendlyName() '. Функция GetServer возвращает указатель на сервер, на котором размещается ресурс. 'resource' является членом структуры дескриптора ресурса. Подумайте, насколько уродливым будет форма '(*).'. –

+0

как и почти все операторы в C++, вы должны сделать добавление, что и '*' и '->' могут быть перегружены так '(* a) .b' и' a-> b', хотя обычно они не имеют гарантии эквивалентно, если 'a' не является указателем. – PeterT

6

Его часто называют оператором доступа к члену. В принципе, a->b - это лучший способ написать (*a).b. Вы можете думать о a->b как «доступ к объекту b в объекте a указывает на». Вы можете прочитать это вслух (или подумать об этом сами) как «a доступ для членов b».

В случайном образце структурированного кода на C++, который я только что проверил (из нескольких разных проектов, написанных разными людьми), 10% строк кода (не считая заголовков) содержало хотя бы один оператор доступа к члену.

+1

В вашем ответе есть заметное отсутствие упоминания термина «указатель». Да, оператор-> может быть перегружен, но даже тогда это реально сделано только для объектов, имитирующих указатели. –

+0

@NicolBolas Обычно вы обычно (то есть почти всегда) используете объект доступа элемента к чему-то, что буквально является указателем или экземпляром класса, который действует как указатель. Я говорю, что он обращается к объекту 'a' * points * to. –

+0

Да, вы это говорите, но затем говорите, что можете читать его как «' '' доступ к члену 'b'. Это невозможно, если 'a' является голым указателем, поскольку указатели на самом деле не имеют членов. Это «размытие», затем доступ к члену «b». И «разыгрывание» не имеет смысла, не говоря о указателях. –

1

-> оператор используется с указателем (или указательным объектом) на LHS и структурой или классом на RHS (lhs->rhs). Обычно это эквивалентно (*lhs).rhs, что является другим способом доступа к члену. Это более удобно, если вы игнорируете Закон Деметры и должны написать lhs->mid->rhs (что, как правило, легче читать, чем (*(*lhs).mid).rhs).

Вы можете перегружать оператора ->, и умные указатели часто делают. AFAIK Вы не можете перегрузить команду ..

+0

Вы правы, что '.' не может быть перегружен (наряду с'. * ',' :: 'и' '?:'). –

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