Sobrecarga de operadores Programacin Orientada a Objetos Operadores
Sobrecarga de operadores Programación Orientada a Objetos
Operadores sobrecargables El lenguaje C++ permite la sobrecarga de operadores Se pueden sobrecargar todos los operadores unitarios o binarios excepto: “#”, “##”, “: ”, “. *” o “? ”. La sintaxis para sobrecargar operadores en la siguiente: Sobrecarga de operadores binarios fuera de una clase <tipo> operator<operador binario>(lista de parámetros); Sobrecarga de operadores binarios dentro de una clase <tipo> nombre_clase: : operator<operador unario>(lista de parámetros);
Racional con sobrecarga de operadores class Racional{ int num, den; public: Racional(){num = 0; den = 1; }; Racional(int a){num = a; den = 1; }; Racional(int a, int b){num = a; den = b; }; Racional operator+(Racional a); Racional operator-(Racional a); Racional operator*(Racional a); Racional operator/(Racional a); void escribe(); };
Implementación #include <iostream> #include "racional. h" using namespace std; Racional: : operator+(Racional a) { Racional r; r. num = num*a. den+den*a. num; r. den = den*a. den; return r; }
Racional: : operator-(Racional a) { Racional r; r. num = num*a. den-den*a. num; r. den = den*a. den; return r; } Racional: : operator*(Racional a) { Racional r; r. num = num*a. num; r. den = den*a. den; return r; }
Racional: : operator/(Racional a) { Racional r; r. num = num*a. den; r. den = den*a. num; return r; } void Racional: : escribe(){ cout << num << "/" << den << "n"; }
Alternativa usando this Se puede utilizar el apuntador this para evitar el uso de una variable temporal: Racional: : operator+(Racional a) { this->num=this->num*a. den+this-> den*a. num; this->den=this-> en*a. den; return *this; } De la misma forma los demás métodos.
Sobrecarga de operadores fuera de una clase Podemos sobrecargar operadores fuera de una clase. La sobrecarga debe hacerse en el mismo archivo.
Ejemplo class Racional{ public: int num, den; Racional(){num = 0; den = 1; }; Racional(int a){num = a; den = 1; }; Racional(int a, int b){num = a; den = b; }; void escribe(){std: : cout<<num<<"/"<< den << "n"; }; }; Racional& operator+(const Racional &a, const Racional &b) { return *(new Racional(b. num*a. den+b. den*a. num, b. den*a. den)); }
Algunas anotaciones sobre = Al sobrecargar el signo igual “=“, My. Class & operator=(const My. Class &rhs); tome en cuenta lo siguiente: Se regresa una referencia My. Class para permitir encadenamiento: a = b = c = d; Ojo con las auto asignaciones, a = a. My. Class & operator=(const My. Class &rhs){ if(this != rhs){//hacer la asignación } return *this; }
Operadores relacionales El operador == se sobrecarga fácilmente ya que regresan un booleano.
Sobrecarga de operadores unitarios La sobrecarga de operadores unitarios no requiere la especificación de parámetros ya que el operador se aplica sobre el objeto que utiliza el operador. Para distinguir entre un operador prefijo y posfijo se le agrega un parámetro int al método posfijo.
Algunas notas sobre la clase Racional Note que la asignación Racional a(1, 2); a = a+1; Suma 1/1 al racional, esto debido a que existe el constructor con un parámetro que crea un Racional con denominador 1, este Racional es el que se suma a a. Sin embargo lo siguiente no funciona porque el compilador no sabe que hacer con la asignación Racional a(1); int b; b = a;
Operadores de conversión La sintaxis para sobre cargar un operador de conversión es la siguiente operator <tipo> () No requiere especificar el tipo ya que el tipo regresado es el que se especifica. Además no se requiere argumentos ya que se aplican al objeto involucrado.
- Slides: 14