¿Para qué funciona la sobrecarga de operadores?

Iniciado por Rockstar97, 20 Mayo 2015, 21:36 PM

0 Miembros y 1 Visitante están viendo este tema.

Rockstar97

Pues eso, no sé para qué funciona la sobrecarga de operadores.
Me mandaron a hacer un reloj en C++ y me pidieron que pidiera la hora al usuario y dependiendo eso iba a ir incremento los segundos, luego los minutos y luego la hora, pero me han pedido que sobrecargue el ">>" y el "<<" y no sé para qué rayos querría yo sobrecargar esos operadores, si sencillamente pido los datos al usuario con un cin, un cout  y luego aplico la lógica "if(hora; hora<=24; hora++) y lo mismo haría con el minuto y los segundos... Por favor, alguien que me explique cómo y para qué se sobrecargan los operadores.

DarK_FirefoX

Sobrecargar los operadores te permite realizar una implementación distinta para esos operadores. Por ejemplo, si crearas una clase para almacenar Fechas, ¿que sentido tendria para ti hacer una suma (+) entre dos fechas? Si sobrecargas el operador de suma entre las dos fechas puedes darle un sentido y devolver un resultado que tu consideres correcto de acuerdo al significado que tu le quieras dar a la suma entre esas dos fechas.

Espero hayas entendido algo.
Salu2s

Rockstar97

Vale, es lo sabía un poco y me ha quedado más claro... Ahora mi pregunta es la siguiente, si por ejemplo yo sobrecargo el operador ">>" de la siguiente manera:

Código (cpp) [Seleccionar]
friend istream& operator >> (istream& in , clase& a)
{
in>>a.nombre;
return in
}

¿Cómo haría que lo muestre en el main? Eso es solo un ejemplo, la verdad es que me confundo mucho con eso.

Peregring-lk

#3
Cuando tu escribes en el main algo como:

Código (cpp) [Seleccionar]

clase a;
cin >> a; // (1)


El compilador sustituye la línea (1) por:

Código (cpp) [Seleccionar]

operator>>(cin, a);


Y el operador que has escrito manualmente es llamado de forma implícita.

De hecho, excepto para tipos primitos (enteros, chars, punteros), todo operador no es más que una función con un nombre especial (operator bla bla bla), y cuando utilizas el operador, éste siempre es sustituído por la forma con sintáxis de llamada a función (tú también podrías escribirlo así en el código si quisieras, pero por supuesto, ese no es el objetivo; para eso crearías una función y la llamarías por su nombre, mejor que con `operator>>(/* lo que sea*/`).

Bueno, en realidad es algo más complejo. El compilador sustituiría la llamada anterior por:

Código (cpp) [Seleccionar]

operator>>(cin, a); // (1)

// Pero tambien por:
cin.operator>>(a); // (2)


Y se queda con la versión que exista de los dos. En tu caso, debido a que el `operator>>` es externo a la clase iostream (dado que no puedes modificar la clase `iostream` para añadirlo), la versión (2) falla al no existir tal método dentro de la clase `iostream`, luego solo queda la (1), que por supuesto, no falla dado que ya la has definido.

Si no hubiera sobrecarga adecuada ni para (1) ni para (2), ni siquiera tras posibles conversiones implícitas, o hubiese sobrecargas para ambas, se produciría el error de compilación pertinente.