Sobrecarga de Operadores en C++


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

Posted in

Leave a Reply