Los tres operadores distintos que C ++ usa para acceder a los miembros de una clase u objeto de clase, a saber, el doble ::
punto .
, el punto y la flecha ->
, se usan para tres escenarios diferentes que siempre están bien definidos. Sabiendo esto le permite saber de inmediato mucho sobre a
y b
con sólo mirar a::b
, a.b
o a->b
, respectivamente, en cualquier código que mira.
a::b
solo se usa si b
es miembro de la clase (o espacio de nombres) a
. Es decir, en este caso a
siempre será el nombre de una clase (o espacio de nombres).
a.b
solo se usa si b
es miembro del objeto (o referencia a un objeto) a
. Entonces a.b
, a
siempre será un objeto real (o una referencia a un objeto) de una clase.
a->b
es, originalmente, una notación abreviada para (*a).b
. Sin embargo, ->
es el único de los operadores de acceso de miembros que se puede sobrecargar, por lo que si a
es un objeto de una clase que se sobrecarga operator->
(estos tipos comunes son punteros e iteradores inteligentes), entonces el significado es lo que sea que haya implementado el diseñador de la clase. Para concluir: con a->b
, si a
es un puntero, b
será un miembro del objeto al que se a
refiere el puntero . Sin embargo, si a
es un objeto de una clase que sobrecarga este operador, entonces operator->()
se invoca la función de operador sobrecargado .
La letra pequeña:
- En C ++, tipos declarados como
class
, struct
o union
se consideran "de tipo de clase". Entonces, lo anterior se refiere a los tres.
- Las referencias son, semánticamente, alias a los objetos, por lo que también debería haber agregado "o referencia a un puntero" al # 3. Sin embargo, pensé que esto sería más confuso que útil, ya que las referencias a punteros (
T*&
) rara vez se usan.
- Los operadores de punto y flecha se pueden usar para referirse a miembros de clase estáticos de un objeto, aunque no sean miembros del objeto. (¡Gracias a Oli por señalar esto!)
.
y->
también puede usarse para acceder a estadísticas de clase a través de un objeto, aunque no sean estrictamente "miembros del objeto".operator*()
también se puede sobrecargar, ¡y que nada obliga a esa sobrecarga a ser consistenteoperator->()
! (No voté en contra de BTW, solo llegué aquí a través de una larga secuencia de duplicados)->
al sobrecargaroperator*
y usar.
. Solo lasoperator->
sobrecargas consiguen eso.Sugerir una alternativa para el punto 3 de sbi
a->b
solo se usa sia
es un puntero. Es una abreviatura de(*a).b
, elb
miembro del objeto quea
apunta. C ++ tiene dos tipos de punteros, punteros "regulares" e inteligentes. Para punteros regulares comoA* a
, el compilador implementa->
. Para punteros inteligentes comostd::shared_ptr<A> a
,->
es una función miembro de la claseshared_ptr
.Justificación: el público objetivo de estas preguntas frecuentes no está escribiendo punteros inteligentes. No necesitan saber
->
que realmente se llamaoperator->()
, o que es el único método de acceso de miembros que se puede sobrecargar.fuente
+1
solo por proporcionar una respuesta alternativa.->
también está sobrecargado para los iteradores estándar que cualquier programador de C ++ debería cumplir pronto, por lo que decir que solo se usa para punteros podría ser confuso.En el ejemplo de codificación anterior, vemos que:
* Acceso a miembros (atributos y funciones) desde una instancia (u objeto) utilizando el operador de punto (
.
)* Acceso a miembros (atributos y funciones) desde un puntero a un objeto (o creado por
new
) usando el operador de puntero (->
)* Accediendo a funciones miembro estáticas desde la propia clase sin tener un objeto como asa usando los dos puntos (
::
). [ Nota: también puede invocar la función miembro estática desde una instancia con.
o->
que no se recomienda]fuente
->
que solo puede ser utilizado por un puntero que se asigna en el montónnew
? A continuación, el segundo elemento, creo que realmente dejo en claro que->
es para el puntero. Y antes de votar a favor, mejor intenteclassName::non_static_member_function()
con c ++ 14 usted mismo. La referencia no es un puntero, por lo que puede usarse.
, y lo dejaré más claro en mi respuesta.El operador de punto se utiliza en escenarios de selección directa de miembros.
Aquí, estamos accediendo
b
, que es un miembro directo de un objetoa
. Entonces, principalmente,a
es un objeto yb
es un miembro (función / variable, etc.) dea
.El operador de flecha se utiliza en escenarios de selección indirecta de miembros.
Aquí, estamos accediendo a
b
cuál es un miembro del objeto, al que señalaa
. Es una abreviatura de(*a).b
y, por lo tanto, aquía
es principalmente un puntero a un objeto yb
es un miembro de ese objeto.El operador Double Colon (Scope) se utiliza en escenarios de selección de miembros directos relacionados con el espacio de nombres.
Aquí, estamos accediendo a
b
cuál es un miembro de la clase / espacio de nombresa
. Entonces, principalmente,a
es una clase / espacio de nombres yb
es un miembro (función / variable, etc.) dea
.fuente