В чем разница между оператором 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 и его волшебную палочку разыменования:
Ответ 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
Примечание. Для класса способ доступа к элементам-членам класса также будет таким же образом