Для указателей нет разницы:
Если вы объявите:
A* pointer_to_A = new A();
Тогда эти два эквивалентны по определению:
pointer_to_A->b();
(*pointer_to_A).b();
Если, однако, вы объявляете об объекте:
A a;
Тогда эти два не обязательно эквивалентны:
a->b();
(*a).b();
В этом случае первая строка вызывает A::operator->()
, а вторая - A::operator*()
. (Кроме того: этот случай несколько редок. Он чаще всего используется для объектов, которые ведут себя как указатели: итераторы, умные точки и т. Д. Если они хорошо спроектированы, то две вышеупомянутые формы все еще идентичны.)