¿Qué significa sobrecargar operadores en C++ y como hacerlo? [Resuelto con ejemplo]

¿Qué significa sobrecargar operadores en C++ y como hacerlo? [Resuelto con ejemplo]

¿Qué significa sobrecargar operadores en C++?

También se dice hacer “overload” de operadores (operator overloading) y se trata básicamente de configurar un comportamiento de “algunos” operadores, de tal manera que estos se comporten como tú has definido específicamente en tu clase.



He dicho “algunos”, puesto que existen un par de excepciones y limitaciones:


  • No se puede definir algún operador nuevo
  • Los operadores = , ->, ( ), [ ] y ->* solo pueden ser sobrecargados por medio de métodos de una clase
  • Los operadores ?:::. , .*, typeid, sizeof y los C++ Cast-Operators no pueden ser sobrecargados.

¡Manos a la obra!

En lo siguiente vamos a utilizar la clase Fracción, para sobrecargar los operadores +, -, *, y /.


De esto modo queremos que sea posible hacer algo como:


Fracción A = B + C, donde A,B y C son objectos de la clase Fracción.


Si B = 1/3 y C = 2/4, entonces A debería ser = 10/12 = 0.8333...


El siguiente codigo representa 


El siguiente código representa la clase Fracción, la cual esta formada por las variables de tipo int: numerador y denominador.


Con ayuda del segundo constructor podremos crear “Fracciones” de un determinado numerador y denominador.


Además necesitaremos de la función print(), la cual nos imprime en la consola nuestra fracción y de este modo podemos seguir el proceso más de cerca.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <iostream>
#include <sstream>
using namespace std;

class Fraccion {
private:
    int numerador;
    int denominador;

public:
    Fraccion();
    Fraccion(int,int);
    void print();
};

--


Las sobrecargas consisten en aderir las siguientes funciones a nuestra clace, con sus respectivas implementaciones:


1
2
3
4
Fraccion operator*(const Fraccion&) const;
Fraccion operator+(const Fraccion&) const;
Fraccion operator-(const Fraccion&) const;
Fraccion operator/(const Fraccion&) const;

---


Siguiendo las reglas de suma, multiplicacion y division de fracciones, implementamos los operadores de la siguiente manera:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
Fraccion Fraccion::operator*(const Fraccion& rhs) const{
    return Fraccion(numerador * rhs.numerador, denominador * rhs.denominador);
}

Fraccion Fraccion::operator+(const Fraccion& rhs) const{
    return Fraccion(numerador * rhs.denominador + denominador * rhs.numerador, denominador * rhs.denominador);    
}

Fraccion Fraccion::operator-(const Fraccion& rhs) const{
    return Fraccion(numerador * rhs.denominador - denominador * rhs.numerador, denominador * rhs.denominador);       
}

Fraccion Fraccion::operator/(const Fraccion& rhs) const{
    return Fraccion(numerador * rhs.denominador, denominador * rhs.numerador);      
}

---


El resultado de las operaciones lo podemos testear de la siguiente manera:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    Fraccion A(1,3);
    Fraccion B(2,4);
    Fraccion C(3,2);

    Fraccion T = A + B;
    cout<< "resultado: ";
    A.print();
    cout<< " + ";
    B.print();
    cout<< " = ";
    T.print();
    cout<< endl;

---


Este y otras operaciones mas daran como resultado:


Resultado en la consola

---


Codigo completo

Tu mismo puedes testear el programa!


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream>
#include <sstream>

using namespace std;

class Fraccion {
private:
    int numerador;
    int denominador;

public:
    Fraccion();
    Fraccion(int,int);

    Fraccion operator*(const Fraccion&) const;
    Fraccion operator+(const Fraccion&) const;
    Fraccion operator-(const Fraccion&) const;
    Fraccion operator/(const Fraccion&) const;

    void print();
};

Fraccion Fraccion::operator*(const Fraccion& rhs) const{
    return Fraccion(numerador * rhs.numerador, denominador * rhs.denominador);
}

Fraccion Fraccion::operator+(const Fraccion& rhs) const{
    return Fraccion(numerador * rhs.denominador + denominador * rhs.numerador, denominador * rhs.denominador);    
}

Fraccion Fraccion::operator-(const Fraccion& rhs) const{
    return Fraccion(numerador * rhs.denominador - denominador * rhs.numerador, denominador * rhs.denominador);       
}

Fraccion Fraccion::operator/(const Fraccion& rhs) const{
    return Fraccion(numerador * rhs.denominador, denominador * rhs.numerador);      
}

void Fraccion::print(){
    cout<< "(" << this->numerador<< "/ " << this->denominador << ")";
}

Fraccion::Fraccion() {
    numerador = denominador = 0;
}

Fraccion::Fraccion(int numerador,int denominador) {
    this -> numerador = numerador;
    this -> denominador = denominador;
}

void TestOperadores(){
    Fraccion A(1,3);
    Fraccion B(2,4);
    Fraccion C(3,2);

    Fraccion T = A + B;
    cout<< "resultado: ";
    A.print();
    cout<< " + ";
    B.print();
    cout<< " = ";
    T.print();
    cout<< endl;

    T = A - B;
    cout<< "resultado: ";
    A.print(); 
    cout<< " - ";
    B.print();
    cout<< " = ";
    T.print();
    cout<< endl;

    T = A * B;
    cout<< "resultado: ";
    A.print(); 
    cout<< " * ";
    B.print();
    cout<< " = ";
    T.print();
    cout<< endl;

    T = A / B;
    cout<< "resultado: ";
    A.print(); 
    cout<< " / ";
    B.print();
    cout<< " = ";
    T.print();
    cout<< endl;
}

int main () {
    TestOperadores();
}

---


¿Te ha gustado el desarrollo de este ejercicio?

¿Quisieras más publicaciones como esta?

¡Coméntanos tus dudas y dinos que podríamos haber hecho mejor!, tal vez tengas una solución más sencilla a este ejercicio, ¡enséñanosla!


Por cierto, ¿aun no estas registrado en Thewhitecode.com?, crea ahora tu perfil y no te pierdas de nada!


Un Abrazo!
Master
https://thewhitecode.com/


Master

Professional Title

Reactions

0

0

0

0

Access hereTo be able to comment

TheWhiteCode.com is not the creator or owner of the images shown, references are: