В чем разница между оператором dot (.) И → в С++?

В чем разница между оператором dot (.) и → в С++?

Ответ 1

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

Указанные выше скобки необходимы из-за силы связи операторов * и ..

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

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

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

Также смотрите: Что такое оператор со стрелкой (- > ) в С++?

Ответ 2

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

*pointervariable.foo

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

(*pointervariable).foo

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

Ответ 3

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

РЕДАКТИРОВАТЬ При применении к стрелке указателя оператор эквивалентен применению точечного оператора к объекту, например ptr->field эквивалентен (*ptr).field.

Ответ 4

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

Ответ 5

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

object.Field

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

pClass->Field

Ответ 6

pSomething->someMember

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

(*pSomething).someMember

Ответ 7

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

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

str.size ();
pstr->size ();

Ответ 8

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

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

structure.attribute

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

pointer->method;

или такой же как:

(*pointer).method

Ответ 9

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

#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.
}

Ответ 10

Это просто, когда вы видите

 x->y

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

 (*x).y

Ответ 11

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

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

pointer- > метод();

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

(* указатель).method();

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

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

Ответ 12

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

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

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

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

Ответ 13

Простейшее различие между ними состоит в том, что "- > " разыскивает указатель перед тем, как он начнет смотреть на это поле объектов, функцию и т.д., тогда как "." сначала не разыгрывается. Используйте "- > " , когда у вас есть указатель на объект, и используйте "." . когда вы работаете с фактическим экземпляром объекта.

Другим эквивалентным способом обвинений в этом может быть использование разыменования "*" на указателе, а затем просто используйте "." . Мы пропускаем посредника с помощью "- > " .

Существуют и другие отличия, но другие ответы широко освещались.

Если у вас есть фон в Java, это может смутить вас, поскольку на Java все это указатели. Это означает, что нет причин иметь символ, который не разыскивает ваш указатель в первую очередь. В С++, однако, вы должны быть немного осторожны, помня, что такое и что не является указателем, и может быть хорошей идеей обозначить их префиксом "p_" или просто "p".

Ответ 14

Оператор → используется, когда мы работаем с указателем, а точка используется иначе. Поэтому, если у нас есть класс struct, например:

struct class{ int num_students; int yr_grad; };

и у нас есть экземпляр класса * curr_class (указатель класса), а затем получить доступ к числу студентов, которые мы будем делать

cout << curr_class->num_students << endl;

Если бы у нас был простой объект класса, скажем, class_2016, мы бы сделали

cout << class_2016.num_students << endl;

Для указателя на класс оператор → эквивалентен

(*obj).mem_var

Примечание. Для класса способ доступа к элементам-членам класса также будет таким же образом