Разница между Pointer-> Call () и (* Pointer) .Call ()

Возможный дубликат:
ptr->Привет(); / * VERSUS * / (* ptr) .hello ();

Я изучаю C ++, и мой вопрос, есть ли разница между использованием оператора стрелки (->) или разыменование указателя * для вызова функции.

Эти два случая иллюстрируют мой вопрос.

Class* pointer = new Class();
(*pointer).Function();         // case one
pointer->Function();           // case two

В чем разница?

2

Решение

Дано

Class* pointer = new Class();

затем

(*pointer).Function();         // case one

разыменовывает указатель и вызывает функцию-член Function на указанный объект. Он не использует перегруженный оператор. Операторы не могут быть перегружены для необработанного указателя или аргументов встроенного типа.

pointer->Function();           // case two

Это делает так же, как первый, используя встроенный -> так как pointer это необработанный указатель, но этот синтаксис лучше подходит для более длинных цепочек разыменования.

Рассмотрим, например,

(*(*(*p).pSomething).pSomethingElse).foo()

против

p->pSomething->pSomethingElse->foo()

-> обозначения также более очевидны с первого взгляда.

2

Другие решения

Если операторы * а также -> не перегружены, обе версии выполняют одно и то же.

6

По вопросам рекламы [email protected]