La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Sobrecarga de operadores

Presentaciones similares


Presentación del tema: "Sobrecarga de operadores"— Transcripción de la presentación:

1 Sobrecarga de operadores
Programación Orientada a Objetos

2 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);

3 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(); };

4 Implementación #include <iostream> #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 this
Se 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 clase
Podemos 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<<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)); }

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 relacionales
El operador == se sobrecarga fácilmente ya que regresan un booleano.

12 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.

13 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;

14 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.


Descargar ppt "Sobrecarga de operadores"

Presentaciones similares


Anuncios Google