В Excel, если Вы включаете блокировку прокрутки, с помощью клавиш со стрелками, прокручивает электронную таблицу вместо того, чтобы изменить ячейку, в которой находится курсор.
Точечный оператор не может быть перегружен, оператор стрелки может быть перегружен. Оператор стрелки обычно предназначен для применения к указателям (или объектам, которые ведут себя как указатели, например интеллектуальным указателям). К указателям нельзя применять оператор точки.
EDIT
При применении к стрелке указателя оператор эквивалентен применению оператора точки к указателю, например ptr-> field
эквивалентно (* ptr) .field
.
foo-> bar ()
совпадает с (* foo) .bar ()
.
Вышеупомянутые круглые скобки необходимы из-за привязки прочность *
и .
операторы.
* foo.bar ()
не будет работать, потому что сначала вычисляется оператор Dot (.
) (см. приоритет оператора )
The Dot (.
) оператор не может быть перегружен, оператор стрелки ( ->
) может быть перегружен.
Оператор Dot (.
) не может применяться к указатели.
См. также: Какой оператор стрелки (->) является синонимом в C ++?
Оператор стрелки похож на точку, за исключением того, что он разыменовывает сначала указатель. foo.bar ()
вызывает метод bar ()
для объекта foo
, foo-> bar
вызывает метод bar
на объекте, на который указывает указатель foo
.
Для указателя мы могли бы просто использовать
*pointervariable.foo
Но .
Оператор имеет больший приоритет, чем оператор *
, поэтому .
оценивается в первую очередь. Поэтому нам нужно принудительно использовать круглые скобки:
(*pointervariable).foo
Но набирать () все время сложно, поэтому они разработали ->
как ярлык, чтобы сказать то же самое. Если вы обращаетесь к свойству объекта или ссылки на объект, используйте .
Если вы обращаетесь к свойству объекта через указатель, используйте ->
.
Оператор предназначен для прямого доступа к члену.
object.Field
Стрелка разыменовывает указатель, чтобы вы могли получить доступ к объекту / памяти, на который он указывает
pClass->Field
pSomething->someMember
эквивалентно
(*pSomething).someMember
Обратите внимание, что оператор -> нельзя использовать для определенных вещей, например, для доступа к оператору [].
#include <vector>
int main()
{
std::vector<int> iVec;
iVec.push_back(42);
std::vector<int>* iVecPtr = &iVec;
//int i = iVecPtr->[0]; // Does not compile
int i = (*iVecPtr)[0]; // Compiles.
}
. Оператор (точка) обычно используется для получения поля / вызова метода из экземпляра класса (или статического поля / метода класса).
p.myField, p.myMethod () - p экземпляр класса
Оператор -> (стрелка) используется для получения поля / вызова метода из содержимого, на которое указывает класс.
p-> myField, p-> myMethod () - p указывает на класс
] Используйте ->
, если у вас есть указатель.
Используйте .
когда у вас есть структура (класс).
Если вы хотите указать атрибут, который принадлежит структуре, используйте .
:
structure.attribute
Если вы хотите указать на атрибут, который ссылается на память, с помощью указателя используйте ->
:
pointer->method;
или то же самое, что:
(*pointer).method
Это просто: всякий раз, когда вы видите
x->y
, знайте, что это то же самое, что и
(*x).y
Цель. точка работает на объектах; стрелка работает с указателями на объекты.
std::string str("foo");
std::string * pstr = new std::string("foo");
str.size ();
pstr->size ();
-> - это просто синтаксический сахар для разыменования указателя,
Как говорили другие:
pointer-> method ();
- это простой способ сказать:
(* pointer) .method ();
Чтобы получить больше удовольствия от указателя, посмотрите на Бинки и его волшебную палочку разыменования: