Diferencia entre revisiones de «Sobrecarga del operador selector indirecto de miembro (Programación)»
m (Texto reemplazado: «<div align="justify">» por «») |
|||
| (No se muestran 2 ediciones intermedias de otro usuario) | |||
| Línea 1: | Línea 1: | ||
| − | + | {{Definición|Nombre=Sobrecarga de operadores |imagen= |concepto=Se llama sobrecarga de operadores cuando reutilizando el mismo operador con un número de usos diferentes, y el compilador decide como usar ese operador dependiendo sobre qué opera.}} | |
'''Sobrecarga del operador selector indirecto de miembro (Programación)'''.El [[Operadores añadidos a expresión|selector indirecto de miembro ->]] es un operador binario que permite acceder a miembros de objetos cuando se dispone de [[Puntero (C++)|punteros]] a la clase correspondiente. Una expresión del tipo Cpt->membr representa el miembro de identificador membr de la clase Cl siempre que Cpt sea un puntero a dicha clase. Ejemplo: | '''Sobrecarga del operador selector indirecto de miembro (Programación)'''.El [[Operadores añadidos a expresión|selector indirecto de miembro ->]] es un operador binario que permite acceder a miembros de objetos cuando se dispone de [[Puntero (C++)|punteros]] a la clase correspondiente. Una expresión del tipo Cpt->membr representa el miembro de identificador membr de la clase Cl siempre que Cpt sea un puntero a dicha clase. Ejemplo: | ||
| Línea 41: | Línea 41: | ||
*[[Sobrecarga de operadores unarios (Programación)|Sobrecarga de operadores unarios (Programación)]] | *[[Sobrecarga de operadores unarios (Programación)|Sobrecarga de operadores unarios (Programación)]] | ||
*[[Sobrecarga de operadores lógicos (Programación)|Sobrecarga de operadores lógicos (Programación)]] | *[[Sobrecarga de operadores lógicos (Programación)|Sobrecarga de operadores lógicos (Programación)]] | ||
| − | |||
*[[Sobrecarga del operador subíndice (Programación)|Sobrecarga del operador subíndice (Programación)]] | *[[Sobrecarga del operador subíndice (Programación)|Sobrecarga del operador subíndice (Programación)]] | ||
| − | == Fuente == | + | == Fuente == |
| + | |||
* [http://www.zator.com/Cpp/E4_9_18e.htm Sobrecarga del operador ->] | * [http://www.zator.com/Cpp/E4_9_18e.htm Sobrecarga del operador ->] | ||
* [http://www.gratismil.com/apuntes/lenguaje-c/90-sobrecarga-de-operadores.htm Sobrecarga de operadores en c] | * [http://www.gratismil.com/apuntes/lenguaje-c/90-sobrecarga-de-operadores.htm Sobrecarga de operadores en c] | ||
última versión al 12:57 13 jul 2019
| ||||
Sobrecarga del operador selector indirecto de miembro (Programación).El selector indirecto de miembro -> es un operador binario que permite acceder a miembros de objetos cuando se dispone de punteros a la clase correspondiente. Una expresión del tipo Cpt->membr representa el miembro de identificador membr de la clase Cl siempre que Cpt sea un puntero a dicha clase. Ejemplo:
Sumario
Sinopsis
La gramática C++ permite definir una función miembro operator-> que puede ser invocada con la sintaxis del operador selector indirecto de miembro ->. Por ejemplo, siendo obj una instancia de la clase Cl para la que se define la función operator->, y membr un miembro de la misma, la expresión: obj->membr; Es transformada por el compilador en una invocación del tipo: ( obj.operator->() )->membr; La parte entre paréntesis obj.operator->(), representa la invocación del método operator-> sobre el objeto obj. Puesto que el valor devuelto por la función será considerado a su vez el primer operando de -> aplicado a membr, la función operator-> debe devolver un puntero a un objeto de la clase sobre el que se pueda aplicar el operador ->. Es decir, su diseño debe tener el siguiente aspecto:
class Vector {
...
Vector* operator-> () {
...
return this;
}
};
El puntero que se obtiene como resultado de la invocación obj.operator->() no depende de la naturaleza del operando membr. Por esta razón se considera a veces que operator-> es un operador unario posfijo. Lo que significa que una expresión como
v.operator->();
Tiene sentido y devuelve un puntero al objeto:
Vector v1; Vector* vptr; vptr = v1.operator->(); // Ok! vptr señala ahora a v1
Condiciones
Para conseguir este comportamiento el compilador impone ciertas limitaciones, de forma que la función operator-> solo puede ser sobrecargada cumpliendo simultáneamente las siguientes condiciones: a. Ser una función-miembro no estática (que incluya el puntero this como argumento implícito). b. Ser una función-miembro que no acepte argumentos. Ejemplo:
class Cl {
...
friend Cl* operator->(); // Error debe ser una función-miembro
Cl* operator->(int i) {/*...*/} // Error no acepta argumentos
Cl* operator->() {/*...*/} // Ok.
};
El operador -> no puede ser sobrecargado
El compilador se limita a sustituir el primer operando de la expresión obj->membr por la invocación a una función-miembro, y una posterior utilización del resultado como primer operando de la versión global del operador, mientras el segundo operando se mantiene invariable. Además, en dicha expresión (invocación de la función-miembro), el primer operando debe ser necesariamente un objeto (instancia) de la clase y no un puntero Cl* como exige el uso regular del selector ->.
Puede Consultar
- Operadores
- Sobrecarga de operadores
- Sobrecarga de operadores binarios (Programación)
- Sobrecarga de operadores unarios (Programación)
- Sobrecarga de operadores lógicos (Programación)
- Sobrecarga del operador subíndice (Programación)