Возможный дубликат:
ptr->Привет(); / * VERSUS * / (* ptr) .hello ();
Я изучаю C ++, и мой вопрос, есть ли разница между использованием оператора стрелки (->
) или разыменование указателя *
для вызова функции.
Эти два случая иллюстрируют мой вопрос.
Class* pointer = new Class();
(*pointer).Function(); // case one
pointer->Function(); // case two
В чем разница?
Дано
Class* pointer = new Class();
затем
(*pointer).Function(); // case one
разыменовывает указатель и вызывает функцию-член Function
на указанный объект. Он не использует перегруженный оператор. Операторы не могут быть перегружены для необработанного указателя или аргументов встроенного типа.
pointer->Function(); // case two
Это делает так же, как первый, используя встроенный ->
так как pointer
это необработанный указатель, но этот синтаксис лучше подходит для более длинных цепочек разыменования.
Рассмотрим, например,
(*(*(*p).pSomething).pSomethingElse).foo()
против
p->pSomething->pSomethingElse->foo()
->
обозначения также более очевидны с первого взгляда.
Если операторы *
а также ->
не перегружены, обе версии выполняют одно и то же.