c++ - operador - punteros a estructuras
¿Qué puedo usar en lugar del operador de flecha, `->`? (5)
¿Para qué sirve el operador de flecha ( ->
)?
El lenguaje C ++ define el operador de flecha ( ->
) como un sinónimo para desreferenciar un puntero y luego usar el .
-operador en esa dirección.
Por ejemplo:
Si tiene un objeto, un Objeto y un puntero, un Puntero:
SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
Para poder utilizar uno de los métodos de los objetos, puede eliminar la referencia del puntero y hacer una llamada a un método en esa dirección:
(*aPointer).method();
Que podría escribirse con el operador de flecha:
aPointer->method();
La razón principal de la existencia del operador de flecha es que acorta el tipeo de una tarea muy común y también es fácil olvidar los paréntesis que rodean la desreferenciación del puntero. Si olvidó los paréntesis,.-Operator enlazará más fuerte que * -operator y hará que nuestro ejemplo se ejecute como:
*(aPointer.method()); // Not our intention!
Algunas de las otras respuestas también mencionaron que los operadores de C ++ pueden estar sobrecargados y que no es tan común.
En C ++ 0x, el operador obtiene un segundo significado, que indica el tipo de retorno de una función o expresión lambda
auto f() -> int; // "->" means "returns ..."
Las siguientes dos expresiones son equivalentes:
a->b
(*a).b
(sujeto a la sobrecarga del operador, como menciona Konrad, pero eso es inusual).
Lo leo principalmente de derecha a izquierda y llamo "in"
foo->bar->baz = qux->croak
se convierte en:
"baz in bar in foo se convierte en croak en qux".
a->b
es generalmente un sinónimo de (*a).b
. Los paréntesis aquí son necesarios debido a la fuerza vinculante de los operadores *
y .
: *ab
no funcionaría porque .
se une más fuerte y se ejecuta primero. Esto es equivalente a *(ab)
.
Sin embargo, tenga cuidado con la sobrecarga: dado que tanto ->
como *
pueden estar sobrecargados, su significado puede variar drásticamente.