Может ли кто-нибудь объяснить мне, что означает «->» на C++?Что означает оператор «->» на C++?
Примеры, если вы можете, они помогают мне лучше понять. Спасибо.
Может ли кто-нибудь объяснить мне, что означает «->» на C++?Что означает оператор «->» на C++?
Примеры, если вы можете, они помогают мне лучше понять. Спасибо.
Это ярлык для разыменования, за которым следует доступ к свойствам (или вызов метода).
В коде, вот некоторые примеры этой эквивалентности:
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;
Это гораздо удобнее.Вот фрагмент кода из какого-то реального кода, указав указатель на дескриптор ресурса ('rd'), он получает дружественное имя сервера, на котором размещен ресурс:' rd-> resource-> GetServer() -> GetFriendlyName() '. Функция GetServer возвращает указатель на сервер, на котором размещается ресурс. 'resource' является членом структуры дескриптора ресурса. Подумайте, насколько уродливым будет форма '(*).'. –
как и почти все операторы в C++, вы должны сделать добавление, что и '*' и '->' могут быть перегружены так '(* a) .b' и' a-> b', хотя обычно они не имеют гарантии эквивалентно, если 'a' не является указателем. – PeterT
Его часто называют оператором доступа к члену. В принципе, a->b
- это лучший способ написать (*a).b
. Вы можете думать о a->b
как «доступ к объекту b
в объекте a
указывает на». Вы можете прочитать это вслух (или подумать об этом сами) как «a
доступ для членов b
».
В случайном образце структурированного кода на C++, который я только что проверил (из нескольких разных проектов, написанных разными людьми), 10% строк кода (не считая заголовков) содержало хотя бы один оператор доступа к члену.
В вашем ответе есть заметное отсутствие упоминания термина «указатель». Да, оператор-> может быть перегружен, но даже тогда это реально сделано только для объектов, имитирующих указатели. –
@NicolBolas Обычно вы обычно (то есть почти всегда) используете объект доступа элемента к чему-то, что буквально является указателем или экземпляром класса, который действует как указатель. Я говорю, что он обращается к объекту 'a' * points * to. –
Да, вы это говорите, но затем говорите, что можете читать его как «' '' доступ к члену 'b'. Это невозможно, если 'a' является голым указателем, поскольку указатели на самом деле не имеют членов. Это «размытие», затем доступ к члену «b». И «разыгрывание» не имеет смысла, не говоря о указателях. –
->
оператор используется с указателем (или указательным объектом) на LHS и структурой или классом на RHS (lhs->rhs
). Обычно это эквивалентно (*lhs).rhs
, что является другим способом доступа к члену. Это более удобно, если вы игнорируете Закон Деметры и должны написать lhs->mid->rhs
(что, как правило, легче читать, чем (*(*lhs).mid).rhs
).
Вы можете перегружать оператора ->
, и умные указатели часто делают. AFAIK Вы не можете перегрузить команду .
.
Вы правы, что '.' не может быть перегружен (наряду с'. * ',' :: 'и' '?:'). –
+1 Я не знаю, почему люди сбрасывают вас. Это основной вопрос, но что? Это не плохо. –
+1: Это простой вопрос, но очень сложно искать в Интернете такие персонажи. Вы, вероятно, выиграли бы от [хорошей книги] (http://stackoverflow.com/q/388242/78845). – Johnsyweb
Правда, это основной вопрос. Но это также вопрос, на который легко ответить *, глядя на * любую * книгу на C++ или C. Google - это не только * исследование, которое должны делать люди. –