Разница между обработкой объекта как такового или указателя? - PullRequest
1 голос
/ 21 февраля 2012

Итак, скажем, у меня есть объект / указатель / каково бы ни было определение такой вещи:

A* a = new A();

у кого есть методы

b();
c();

Способ, который я обнаружил, таков:

a->b();

и метод работал очень хорошо. Однако теперь я видел людей, делающих это так:

(*a).b();

Вопрос заключается в следующем: какова разница (т. Е. Как управляются адреса и значения в каждом) между этими двумя способами вызова методов и в соответствии с тем, какой из них лучше использовать?

Если это дубликат другого вопроса, просто дайте мне знать, я сотру его после того, как увижу исходный вопрос.

Ответы [ 4 ]

6 голосов
/ 21 февраля 2012

Разницы нет. Это просто другое обозначение.

2 голосов
/ 21 февраля 2012

Для указателей нет разницы:

Если вы объявите:

A* pointer_to_A = new A();

Тогда эти два эквивалентны по определению:

pointer_to_A->b();
(*pointer_to_A).b();

Если, однако, вы объявляете об объекте:

A a;

Тогда эти два не обязательно эквивалентны:

a->b();
(*a).b();

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

0 голосов
/ 21 февраля 2012

Обозначение -> является синтаксическим сахаром.

0 голосов
/ 21 февраля 2012

Разницы нет. Предпочитаю ->, так как он чище и гласит, что вы имеете в виду лучше.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...