2010-11-24 19 views
32

¿Existe una diferencia general entre hacerpuntero operador eliminar la referencia ((*) vs ->)

(*ptr).method() 

vs

ptr->method() 

vi esta pregunta en un comentario en otra pregunta y pensé que lo haría pregunta aquí Aunque acabo de recordar que casi todos los operadores en C++ pueden estar sobrecargados, así que supongo que la respuesta dependerá. Pero, en general, ¿hay alguna diferencia entre hacer uno versus el otro?

+0

Por cierto, el comentario fue de esta pregunta: http://stackoverflow.com/questions/4263640/find-mapped-value-of-map/4263652#4263652 :) – wrongusername

Respuesta

56

Como ya se mencionó "jamesdlin", los operadores * y -> se pueden sobrecargar para los tipos de clase.

Y luego las dos expresiones (*ptr).method() y ptr->method() pueden tener un efecto diferente.

Sin embargo, para los operadores incorporados , las dos expresiones son equivalentes.

El operador -> es más conveniente cuando se está siguiendo una cadena de punteros, porque . tiene mayor precedencia que *, por lo que requiere una gran cantidad de paréntesis ungrokkable.

considerar:

pBook->author->snailMail->zip 

frente

(*(*(*pBook).author).snailMail).zip 
0

Son sinónimos. El último es una forma abreviada de lo primero.

4

Pero, en general, ¿hay alguna diferencia entre hacer uno frente al otro?

No! (a menos que -> y * estén explícitamente sobrecargados para realizar funciones diferentes)

ptr->method() y (*ptr).method() son equivalentes.

+0

estos operadores pueden estar sobrecargados para las clases, y luego las dos expresiones pueden tener un efecto diferente. ¡El no!" es correcto para los operadores integrados. Cheers, –

+0

@Alf: se agregó la parte 'a menos'. :) –

9

Sí. ptr->method() es dos caracteres más cortos que (*ptr).method().

También es más bonita.

12

Para los tipos de punteros sin procesar, son equivalentes.

Y sí, para los tipos generales, la respuesta es de hecho "depende", ya que las clases pueden sobrecargar operator* y operator-> para tener diferentes comportamientos.

+38

si una clase hace eso, por supuesto, está autorizado a golpear al autor en la cara ... Difícil. – jalf

1

La secuencia -> sirve como un indicador visual de que apunta hacia algo. Ambos operadores realizan exactamente la misma secuencia de operaciones.

8

C++ Standard 5.2.5/3:

Si E1 tiene el tipo “puntero a la clase X”, entonces la expresión E1-> E2 es convertido a la forma equivalente (* (E1)). E2;

Para valores sin puntero, los operadores podrían estar sobrecargados.

2

sentimos que cavar este post, pero a pesar de las expresiones de la OP son equivalentes para los tipos de puntero primas, Creo que hay al menos un importante diferencia que debe mencionarse en C++, además de todo lo que se ha dicho:

De Wikipedia, la enciclopedia libre (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#cite_note-arrowptr-6):

El tipo de operador de retorno ->() debe ser un tipo para el que se puede aplicar la operación -> , como un tipo de puntero. Si x es del tipo C donde C sobrecarga el operador ->(), x-> y se expande a x.operator ->() -> y.

Esto implica que se espera -> a devolver un tipo Dereferenceable, mientras que * se espera para devolver una dereferenced tipo, y por lo tanto este "encadenamiento" se aplica sólo a ->.

+0

No veo tu punto? Los diferentes tipos de devolución son un axioma básico inherente a la sintaxis/ubicación de los dos operadores. Como Alf ha demostrado, esto no impide que puedas hacer exactamente las mismas cosas con '* (ptr)' si te molesta escribir suficientes asteriscos y paréntesis. (Como operador conceptual, '->' es un regalo; solo desearía que no usara dos caracteres.) –

+1

Mi punto es que su implementación (y uso) son leve pero importante; en particular, podría no ser intuitivo que '->' debería devolver un "puntero" y no una "referencia", y esta pequeña diferencia es la razón fundamental por la cual uno puede encadenarse fácilmente y no el otro (el encadenamiento solo puede suceder si la entrada y la salida se comportan de la misma manera). Algunas personas (como usted parecería) prefieren explicaciones fácticas en términos de diferencia de uso práctico, prefiero razones fundamentales (de las cuales puedo derivar las diferencias de hecho). – Sheljohn

+0

Veo lo que quiere decir, pero tal vez sea diferente para diferentes personas: dado que '->' anula un operador que se originó en punteros, solo esperé que funcionara en un objeto tipo puntero (no de referencia), y yo, eso es lo fundamental. Pero estoy seguro de que me han confundido las cosas más simples, así que cualquier cosa que ayude a cada persona a entenderlo está bien. –

Cuestiones relacionadas