¿Cuál es el ->
sinónimo del operador de flecha ( )?
112
Las siguientes dos expresiones son equivalentes:
a->b
(*a).b
(sujeto a sobrecarga del operador, como menciona Konrad, pero eso es inusual).
->
operador sobrecargado para algunos tipos de iteradores, por lo que tenía que usar*.
. Muchas bibliotecas los definen de manera inconsistente. Se vuelve realmente molesto cuando trabaja con plantillas y no conoce el tipo exacto.a[0].b
lugar de(*a).b
. Pero no estaría tan bien estructurado.a->b
es generalmente un sinónimo de(*a).b
. Los paréntesis aquí son necesarios debido a la fuerza de enlace de los operadores*
y.
:*a.b
no funcionaría porque se.
enlaza más fuerte y se ejecuta primero. Esto es, por tanto, equivalente a*(a.b)
.Sin embargo, tenga cuidado con la sobrecarga: dado que ambos
->
y*
pueden sobrecargarse, su significado puede diferir drásticamente.fuente
binding strength
Te refieres a la precedencia del operador? si no, ¿cuál es la diferencia entre los dos?El lenguaje C ++ define el operador de flecha (
->
) como sinónimo de desreferenciar un puntero y luego usa el.
operador -en esa dirección.Por ejemplo:
Si usted tiene un objeto,
anObject
y un puntero,aPointer
:Para poder usar uno de los métodos de objetos, elimine la referencia del puntero y realice una llamada al método en esa dirección:
Que podría escribirse con el operador de flecha:
La razón principal de la existencia del operador de flecha es que acorta la escritura de una tarea muy común y también es fácil olvidar los paréntesis alrededor de la desreferenciación del puntero. Si olvidó los paréntesis, el.-Operator se vinculará más fuerte que * -operator y hará que nuestro ejemplo se ejecute como:
Algunas de las otras respuestas también han mencionado que los operadores de C ++ pueden estar sobrecargados y que no es tan común.
fuente
new SomeClass()
devuelve un puntero (SomeClass *
), no elSomeClass
objeto. Y comienzas declarandoanObject
y luegoaPointer
usasp
.En C ++ 0x, el operador obtiene un segundo significado, que indica el tipo de retorno de una función o expresión lambda
fuente
::
es en realidad un operador, como.
or->
, y se llama "operador de resolución de alcance" en el estándar.Lo leo principalmente de derecha a izquierda y llamo "en"
se convierte en:
"baz in bar in foo se convierte en croak in qux".
fuente
->
se usa al acceder a datos a los que tiene un puntero.Por ejemplo, podría crear un puntero ptr a una variable de tipo int intVar como este:
Luego, podría usar una función, como foo, en él solo desreferenciando ese puntero, para llamar a la función en la variable a la que apunta el puntero, en lugar de en el valor numérico de la ubicación de memoria de esa variable:
Sin los paréntesis aquí, el compilador entendería que esto se
*(ptr.foo())
debe a la precedencia del operador, que no es lo que queremos.En realidad, esto es lo mismo que escribir
Como
->
elimina la referencia a ese puntero, y así llama a la funciónfoo()
de la variable a la que apunta el puntero.De manera similar, podemos usar
->
para acceder o configurar un miembro de una clase:fuente
Puede usar -> para definir una función.
No es una lambda. Realmente es una función. "->" indica el tipo de retorno de la función.
fuente