gratiszona

sobrecarga de operadores en el lenguaje C

Sobrecarga de operadores.
La sobrecarga de operadores permite redefinir ciertos operadores, como '+' y '-', para usarlos con las clases que hemos definido. Se llama sobrecarga de operadores porque estamos reutilizando el mismo operador con un numero de usos diferentes y el compilador decide como usar ese operador dependiendo sobre que opera.
La sobrecarga de operadores solo se puede utilizar con clases, no se pueden redefinir los operadores para los tipos simples predefinidos.
Los operadores logicos && y || pueden ser sobrecargados para las clases definidas por el programador, pero no funcionaran como operadores de short circuit. Todos los miembros de la construccion logica seran evaluados sin ning´n problema en lo que se refiere a la salida. Naturalmente los operadores logicos predefinidos continuaran siendo operadores de short circuit como era de esperar, pero no los sobrecargados.
Los siguientes operadores no pueden ser sobrecargados:
    • El operador ternario ?.

    • El operador de acceso a una clase o estructura : .

    • El operador scope::


Sobrecarga de operadores binarios.
Un operador binario es el que tiene dos operandos.
Ejemplo donde sobrecargamos el operador + para, a partir de dos cajas, crear otra de dimensiones igual a la suma de las dimensiones de las cajas dadas:
#include <iostream.h>
class Caja {
double longitud;
double anchura, altura;
public:
void set(int l, int w, int h) {longitud = l; anchura = w; altura = h;}
double volumen(void) {return longitud * anchura * altura;}
Caja operator+(Caja a);
};
Caja operator+(Caja a) {
Caja temp;
temp.longitud = longitud + a.longitud;
temp.anchura = anchura + a.anchura;
temp.altura = altura + a.altura;
return temp;
}
main() {
Caja pequeña, mediana, grande;
Caja temp;
pequeña.set(2, 4, 5);
mediana.set(5, 6, 8);
grande.set(8, 10, 12);
cout << 'El volumen es ' << pequeña.volumen() << '\n';
cout << 'El volumen es ' << mediana.volumen() << '\n';
cout << 'El volumen es ' << grande.volumen() << '\n';
temp = pequeña + mediana;
cout << 'El nuevo volumen es ' << temp.volumen() << '\n';
}
El resultado de la ejecucion sera:
El volumen es 40.
El volumen es 240.
El volumen es 960.
El volumen es 840.
Observamos que:
· El operador se llama desde la clase que precede al operador y el objeto que le sigue es enviado como parametro. Esto significa que el parametro (a) es mediana.
· El operador puede acceder a los miembros privados del parametro que es enviado. En el ejemplo, accede a a.longitud, a.anchura, a.altura.
Operadores amigos
#include <iostream.h>
class Caja {
double longitud;
double anchura, altura;
public:
void set(int l, int w, int h) {longitud = l; anchura = w; altura = h;}
int volumen(void) {return longitud * anchura * altura;}
friend Caja operator+(Caja a, Caja b); // Add two Cajas
friend Caja operator+(int a, Caja b); // Add a constant to a Caja
friend Caja operator*(int a, Caja b); // Multiply a Caja by a constant
};
Caja operator+(Caja a, Caja b) {
Caja temp;
temp.longitud = a.longitud + b.longitud;
temp.anchura = a.anchura + b.anchura;
temp.altura = a.altura + b.altura;
return temp;
}
Caja operator+(int a, Caja b) { // Add a constant to a Caja
Caja temp;
temp.longitud = a + b.longitud;
temp.anchura = a + b.anchura;
temp.altura = a + b.altura;
return temp;
}
Caja operator*(int a, Caja b) { // Multiply a Caja by a constant
Caja temp;
temp.longitud = a * b.longitud;
temp.anchura = a * b.anchura;
temp.altura = a * b.altura;
return temp;
}
main() {
Caja pequeña, mediana, grande;
Caja temp;
pequeña.set(2, 4, 5);
mediana.set(5, 6, 8);
grande.set(8, 10, 12);
cout << 'El volumen es ' << pequeña.volumen() << '\n';
cout << 'El volumen es ' << mediana.volumen() << '\n';
cout << 'El volumen es ' << grande.volumen() << '\n';
temp = pequeña + mediana;
cout << 'El nuevo volumen es ' << temp.volumen() << '\n';
temp = 10 + pequeña;
cout << 'El nuevo volumen es ' << temp.volumen() << '\n';
temp = 4 * grande;
cout << 'El nuevo volumen es ' << temp.volumen() << '\n';
}
El resultado de la ejecucion es:
El volumen es 40
El volumen es 240.
El volumen es 960.
El nuevo volumen es 840.
El nuevo volumen es 2520.
El nuevo volumen es 61440.
· Hemos sobrecargado los operadores + y *, declarandolos como funciones amigas, de forma que podemos utilizar funciones con dos parametros. Si no los hubiesemos utilizado la construccion friend, la funcion seria parte de uno de los objetos y ese objeto seria el objeto al que se le pasa el mensaje.
· No hay limite superior para el numero de operadores o de funciones sobrecargadas. Se puede definir cualquier numero de operadores sobrecargados, siempre que difieran en la lista de argumentos.
· Se observa que la implementacion de las funciones amigas no es realmente parte de la clase porque el nombre de la clase no precede al de la funcion.
Sobrecarga de operadores unarios.
Un operador unario solo tiene un operando. Ejemplos de operadores unitarios son ++ y --.
#include <iostream.h>
class Burrito {
private:
int amtbeef, amtbean;
public:
Burrito(int beef, int bean) {
amtbeef = beef;
amtbean = bean;
}
Burrito operator ++() {
amtbeef++; amtbean++;
return Burrito(amtbeef, amtbean);
}
int getBeef() { return amtbeef; }
};
main() {
Burrito b1(5,10);
cout << 'Burrito #1 has' << b1.getBeef() << 'ounces of beef.' << '\n';
b1++;
cout << 'Now Burrito #1 has' << b1.getBeef() << 'ounces of beef.'<< '\n';
}
Vemos que sobrecargar un operador unario es muy similar a la forma en que se hace para uno binario. De hecho, la unica diferencia real es que ahora no se pasa ningun parametro al operador, ya que ahora solo hay un operando, que es el objeto cuyo operador se usa.
Hay si embargo una pequeña cuestion que debe tenerse EN EL LENGUAJE Cuenta cuando se sobrecargan los operadores ++ y --. Sabemos que b = ++a; es diferente a b=a++;. La primera expresion equivale a a = a +1; b = a;, mientras que la segunda es: b = a; a = a +1;. Sin embargo, cuando se sobrecarga el operador ++ (o el --) no se puede hacer distincion entre estas dos situaciones. Los dos usos del operador tienen el mismo efecto.
Anterior: objetos encadenados

Tal vez te interese sobre lenguaje c: