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 ay bcon sólo mirar a::b, a.bo a->b, respectivamente, en cualquier código que mira.
a::bsolo se usa si bes miembro de la clase (o espacio de nombres) a. Es decir, en este caso asiempre será el nombre de una clase (o espacio de nombres).
a.bsolo se usa si bes miembro del objeto (o referencia a un objeto) a. Entonces a.b, asiempre será un objeto real (o una referencia a un objeto) de una clase.
a->bes, 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 aes 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 aes un puntero, bserá un miembro del objeto al que se arefiere el puntero . Sin embargo, si aes 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, structo unionse 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->bsolo se usa siaes un puntero. Es una abreviatura de(*a).b, elbmiembro del objeto queaapunta. 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
+1solo 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,aes un objeto ybes 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
bcuál es un miembro del objeto, al que señalaa. Es una abreviatura de(*a).by, por lo tanto, aquíaes principalmente un puntero a un objeto ybes 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
bcuál es un miembro de la clase / espacio de nombresa. Entonces, principalmente,aes una clase / espacio de nombres ybes un miembro (función / variable, etc.) dea.fuente