La sobrecarga se refiere a la posibilidad de tener dos o más funciones con el mismo nombre y permite que dos o más clases se relacionen. Casi todos los operadores de C++ se pueden sobrecargar, sin embargo no se puede cambiar la aridad de los operadores ni inventar otros.
Todos los lenguajes de programación cuentan con tipos de datos como: int, double, char, etc. Y cada uno de estos datos contienen operadores integrados, como el de suma (+), multiplicación (*) o división (/) como se muestra en el siguiente código. Y una de las características de C++ es que nos permite agregar estos operadores a las clases.
int a = 3; int b = 2; int c = 0; ++b; c = a + b;
Para sobrecargar un operador se debe declarar y crear una función operadora de la siguiente forma respectivamente:
class operator<operador> (args);
return-type class::operator<operador> (args) {
Instrucciones
}Cuando un operador se sobrecarga no pierde su contenido original. Al contrario gana contenido nuevo. Veamos el siguiente ejemplo sencillo que permite la suma de dos clases ‘numero’.
#include <iostream>
using namespace std;
class numero {
int x;
public:
numero() {
x = 0;
}
numero(int n) {
x = n;
}
int Valor() const {
return x;
}
// Declaramos la función operativa
numero operator+ (numero arg);
};
// Función operativa
numero numero::operator+ (numero args) {
numero temp;
temp.x = x + args.x;
return temp;
}
int main (int argc, char *argv[])
{
numero n1(10), n2(2), n3;
cout << "Valor de n1 = " << n1.Valor() << endl;
cout << "Valor de n2 = " << n2.Valor() << endl;
cout << "Valor de n3 = " << n3.Valor() << endl;
n3 = n1 + n2;
cout << "La suma de n1 + n2 = " << n3.Valor() << endl;
return 0;
}$ g++ -o Ejemplo Ejemplo.cpp $ ./Ejemplo Valor de n1 = 10 Valor de n2 = 2 Valor de n3 = 0 La suma de n1 + n2 = 12
En este ejemplo se utilizo la función Valor para regresar o retornar el valor actual de las clases n1, n2, n3 y poder imprimir el valor que tomo cada una de ellas. Sin embargo esa función es innecesaria ya que C++ nos permite utilizar los operadores de entrada >> y salida <<.
Vamos a declarar de la siguiente forma las funciones operativas:
friend ostream& operator<< (ostream & salida, const numero & args); friend istream& operator>> (istream & entrada, numero & args);
Las funciones deben ser friend ya que debemos acceder a los atributos de la clase; recuerda que en la programación orientada a objetos los atributos debes ser privados. Estos operadores toman dos argumentos exactamente.
ostream &operator<< (ostream & salida, const numero & args) {
salida << args.x ;
return salida;
}
istream &operator>> (istream & entrada, numero & args) {
entrada >> args.x;
return entrada;
}
Este es nuestro código completo con otros operadores básicos.
#include <iostream>
using namespace std;
class numero {
int x;
public:
// Declaramos los constructores
numero();
numero(int a);
// Declaramos las funciones operativas
numero operator+ (numero arg);
numero operator- (numero arg);
numero operator* (numero arg);
numero operator/ (numero arg);
// Entrada y Salida
friend ostream& operator<< (ostream & salida, const numero & args);
friend istream& operator>> (istream & entrada, numero & args);
};
// Constructores
numero::numero() {
x = 0;
}
numero::numero(int n) {
x = n;
}
// Funciones operativas
numero numero::operator+ (numero args) {
numero temp;
temp.x = x + args.x;
return temp;
}
numero numero::operator- (numero args) {
numero temp;
temp.x = x - args.x;
return temp;
}
numero numero::operator* (numero args) {
numero temp;
temp.x = x * args.x;
return temp;
}
numero numero::operator/ (numero args) {
numero temp;
temp.x = x / args.x;
return temp;
}
ostream &operator<< (ostream & salida, const numero & args) {
salida << args.x ;
return salida;
}
istream &operator>> (istream & entrada, numero & args) {
entrada >> args.x;
return entrada;
}
int main (int argc, char *argv[])
{
cout << "Escribe un número entero: ";
numero n1;
cin >> n1;
cout << "Escribe otro número entero: ";
numero n2;
cin >> n2;
numero n3;
n3 = n1 + n2;
cout << "La suma de " << n1 << "+" << n2 << "=" << n3 << endl;
return 0;
}$ g++ -o Ejemplo-2 Ejemplo-2.cpp $ ./Ejemplo-2 Escribe un número entero: 5 Escribe otro número entero: 8 La suma de 5+8=13