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