2012-02-21 2 views
1

Так что у меня есть объект/указатель/независимо от определения такого понятия является:Разница между обработкой объекта как такового или указателем?

A* a = new A(); 

, которые, случается, есть методы

b(); 
c(); 

Способ делать вещи, которые я узнал это:

a->b(); 

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

(*a).b(); 

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

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

+1

Без разницы просто понять, что он делает. Плюс другие языки называют методы таким образом. – qwertymk

ответ

6

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

0

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

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

2

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

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

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

Я думаю, вы хотите сказать '(* pointer_to_A) .b();' в вашем коде. Поправьте меня если я ошибаюсь. Кроме того, я понимаю, что вы имеете в виду. Таким образом, сделка отличается от самоинициализирующегося объекта. – Yokhen

+0

@Yokhen - Спасибо. Я исправил это сейчас. –

Смежные вопросы