Каково различие между точечным (.) оператором и-> в C++? [дубликат]

В Excel, если Вы включаете блокировку прокрутки, с помощью клавиш со стрелками, прокручивает электронную таблицу вместо того, чтобы изменить ячейку, в которой находится курсор.

300
задан JoeG 31 August 2010 в 20:25
поделиться

12 ответов

Точечный оператор не может быть перегружен, оператор стрелки может быть перегружен. Оператор стрелки обычно предназначен для применения к указателям (или объектам, которые ведут себя как указатели, например интеллектуальным указателям). К указателям нельзя применять оператор точки.

EDIT При применении к стрелке указателя оператор эквивалентен применению оператора точки к указателю, например ptr-> field эквивалентно (* ptr) .field .

.
57
ответ дан 23 November 2019 в 01:27
поделиться

foo-> bar () совпадает с (* foo) .bar () .

Вышеупомянутые круглые скобки необходимы из-за привязки прочность * и . операторы.

* foo.bar () не будет работать, потому что сначала вычисляется оператор Dot (. ) (см. приоритет оператора )

The Dot (. ) оператор не может быть перегружен, оператор стрелки ( -> ) может быть перегружен.

Оператор Dot (. ) не может применяться к указатели.

См. также: Какой оператор стрелки (->) является синонимом в C ++?

303
ответ дан 23 November 2019 в 01:27
поделиться

Оператор стрелки похож на точку, за исключением того, что он разыменовывает сначала указатель. foo.bar () вызывает метод bar () для объекта foo , foo-> bar вызывает метод bar на объекте, на который указывает указатель foo .

29
ответ дан 23 November 2019 в 01:27
поделиться

Для указателя мы могли бы просто использовать

*pointervariable.foo

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

(*pointervariable).foo

Но набирать () все время сложно, поэтому они разработали -> как ярлык, чтобы сказать то же самое. Если вы обращаетесь к свойству объекта или ссылки на объект, используйте . Если вы обращаетесь к свойству объекта через указатель, используйте ->

69
ответ дан 23 November 2019 в 01:27
поделиться

. Оператор предназначен для прямого доступа к члену.

object.Field

Стрелка разыменовывает указатель, чтобы вы могли получить доступ к объекту / памяти, на который он указывает

pClass->Field
16
ответ дан 23 November 2019 в 01:27
поделиться
pSomething->someMember

эквивалентно

(*pSomething).someMember
13
ответ дан 23 November 2019 в 01:27
поделиться

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

#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.
}
3
ответ дан 23 November 2019 в 01:27
поделиться

. Оператор (точка) обычно используется для получения поля / вызова метода из экземпляра класса (или статического поля / метода класса).

p.myField, p.myMethod () - p экземпляр класса

Оператор -> (стрелка) используется для получения поля / вызова метода из содержимого, на которое указывает класс.

p-> myField, p-> myMethod () - p указывает на класс

]
1
ответ дан 23 November 2019 в 01:27
поделиться

Используйте -> , если у вас есть указатель. Используйте . когда у вас есть структура (класс).

Если вы хотите указать атрибут, который принадлежит структуре, используйте . :

structure.attribute

Если вы хотите указать на атрибут, который ссылается на память, с помощью указателя используйте -> :

pointer->method;

или то же самое, что:

(*pointer).method
9
ответ дан 23 November 2019 в 01:27
поделиться

Это просто: всякий раз, когда вы видите

 x->y

, знайте, что это то же самое, что и

 (*x).y
2
ответ дан 23 November 2019 в 01:27
поделиться

Цель. точка работает на объектах; стрелка работает с указателями на объекты.

std::string str("foo");
std::string * pstr = new std::string("foo");

str.size ();
pstr->size ();
10
ответ дан 23 November 2019 в 01:27
поделиться

-> - это просто синтаксический сахар для разыменования указателя,

Как говорили другие:

pointer-> method ();

- это простой способ сказать:

(* pointer) .method ();

Чтобы получить больше удовольствия от указателя, посмотрите на Бинки и его волшебную палочку разыменования:

http://www.youtube.com/watch?v=UvoHwFvAvQE

2
ответ дан 23 November 2019 в 01:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: