Sobrecarga de operadores

1 Sobrecarga de operadoresProgramación Orientada a Objeto...
Author: Dolores Muniz
0 downloads 5 Views

1 Sobrecarga de operadoresProgramación Orientada a Objetos

2 Operadores sobrecargablesEl 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 operator(lista de parámetros); Sobrecarga de operadores binarios dentro de una clase nombre_clase::operator(lista de parámetros);

3 Racional con sobrecarga de operadoresclass 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(); };

4 Implementación #include #include "racional.h"using namespace std; Racional Racional::operator+(Racional a) { Racional r; r.num = num*a.den+den*a.num; r.den = den*a.den; return r; }

5 Racional Racional::operator-(Racional a) {r.num = num*a.den-den*a.num; r.den = den*a.den; return r; } Racional Racional::operator*(Racional a) { r.num = num*a.num;

6 Racional Racional::operator/(Racional a) {r.num = num*a.den; r.den = den*a.num; return r; } void Racional::escribe(){ cout << num << "/" << den << "\n";

7 Alternativa usando thisSe puede utilizar el apuntador this para evitar el uso de una variable temporal: Racional 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.

8 Sobrecarga de operadores fuera de una clasePodemos sobrecargar operadores fuera de una clase. La sobrecarga debe hacerse en el mismo archivo.

9 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< }; Racional& operator+(const Racional &a,const Racional &b) { return *(new Racional(b.num*a.den+b. den*a.num, b.den*a.den)); }

10 Algunas anotaciones sobre =Al sobrecargar el signo igual “=“, MyClass & operator=(const MyClass &rhs); tome en cuenta lo siguiente: Se regresa una referencia MyClass para permitir encadenamiento: a = b = c = d; Ojo con las auto asignaciones, a = a. MyClass & operator=(const MyClass &rhs){ if(this != rhs){//hacer la asignación } return *this;

11 Operadores relacionalesEl operador == se sobrecarga fácilmente ya que regresan un booleano.

12 Sobrecarga de operadores unitariosLa 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.

13 Algunas notas sobre la clase RacionalNote 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;

14 Operadores de conversiónLa sintaxis para sobre cargar un operador de conversión es la siguiente operator () 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.