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

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

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

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

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

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

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

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

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

 *pointervariable.foo 

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

 (*pointervariable).foo 

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

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

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

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

 pSomething->someMember 

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

 (*pSomething).someMember 

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

 object.Field 

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

 pClass->Field 

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

 std::string str("foo"); std::string * pstr = new std::string("foo"); str.size (); pstr->size (); 

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

 #include  int main() { std::vector iVec; iVec.push_back(42); std::vector* iVecPtr = &iVec; //int i = iVecPtr->[0]; // Does not compile int i = (*iVecPtr)[0]; // Compiles. } 

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

  x->y 

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

  (*x).y 

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

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

 structure.attribute 

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

 pointer->method; 

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

 (*pointer).method 

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

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

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

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

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

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

pointer-> метод ();

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

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

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

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

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

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

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

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

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

 struct class{ int num_students; int yr_grad; }; 

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

 cout << curr_class->num_students << endl; 

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

 cout << class_2016.num_students << endl; 

Для указателя на class оператор -> эквивалентен

 (*obj).mem_var 

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

  • Что нужно переопределить в структуре, чтобы обеспечить правильное функционирование равенства?
  • Разница между & и && в Java?
  • Какие символы разрешены для операторов haskell?
  • Что делает знак вопроса и точечный оператор?. означает в C # 6.0?
  • Существуют ли объявляемые имена для обычных операторов Haskell?
  • Оператор копирования и оператор присваивания
  • Вставить vs emplace vs operator в c ++ map
  • Что означает $ mean / do в Haskell?
  • Почему операторам Java + =, - =, * =, / = сложного присваивания не требуется кастинг?
  • Для чего нужен оператор?
  • Математическая цепочка оператора сравнения - как и в случае, если ((5 <j <= 1)) "
  • Interesting Posts

    Можно ли настроить цвета Windows 8.1 аналогично тому, как это было с Win95 в «Advanced Appearance Settings»?

    Как открыть конвейер GStreamer из OpenCV с помощью VideoWriter

    onKeyDown в службе? (Глобальные горячие клавиши)

    Прямое удаление с помощью клавиатуры Apple

    Модернизация ноутбука

    Могу ли я скрыть / показать asp: пункты меню на основе роли?

    Когда компиляторы встроены в код C ++?

    Windows: как перевести Internet Explorer 8 на более раннюю версию?

    Как удалить все не буквенно-цифровые символы из строки в c ++?

    Является ли сдвиг слева (<<) отрицательным целым неопределенным поведением в C ++ 11?

    Почему Facebook Graph API говорит, что моя учетная запись неактивна?

    Как разобрать динамический ключ JSON в результате результата Nested JSON?

    Точная резервная копия диска или синхронизация файлов и папок, поддерживающая метаданные

    Что отключает мой DSL-модем?

    В чем разница между «throw new Error» и «throw someObject»?

    Давайте будем гением компьютера.