// II17 2005-06 // Tema2/Misterios.cpp // 18-11-2005 // Ejemplo del Tema 2: // Esto es un ejemplo simplificado para ilustrar varios conceptos // que suele costar entender pero que interesa tener claros para // resolver los problemas de sobrecarga de operadores: // - El uso de un constructor como conversor. // - La importancia de declarar si una funcion es const. // - La devolucion por referencia. #include using namespace std; class Caja { int dato; public: Caja(int x) : dato(x) {} void Ver() const { cout << dato << endl;} Caja & Sumar(int x) { dato += x; return *this;} }; void misterio (const Caja & c) { c.Ver(); // En esta llamada el compilador nos indicaria un error si no // hubiesemos declarado que la funcion Ver es const. Quita el // "const" de la declaracion de Ver y pruebalo, y fijate en lo // que dice el compilador para reconocerlo cuando te pase. // Un argumento const no podemos pasarselo como argumento implicito a una // funcion que no sea const. Por tanto, olvidando el "const" de una // funcion estariamos limitando innecesariamente el uso que se puede hacer // de ella. } int main () { misterio(33); // Aunque la funcion misterio espera como argumento una // Caja, le podemos pasar un entero gracias a que existe un // constructor que convierte el entero en una Caja, el // mismo constructor que nos permite hacer una declaracion // como la siguiente: Caja c(55); c.Sumar(10).Sumar(2).Sumar(4).Ver(); // Esto mostrara al valor 71. // Podemos encadenar asi estas llamadas gracias a que la funcion Sumar // devuelve una Caja, y sobre esa Caja que devuelve se invoca la siguiente // llamada. c.Ver(); // Esto tambien mostrara el valor 71. Pero si el tipo de retorno // de la funcion Sumar fuese "Caja" en vez de "Caja &", // devolveria una copia de *this hecha por el constructor de // copia, y la llamada a Sumar(2) habria actuado sobre esa copia, // no sobre c, con lo que al llegar aqui la funcion Ver mostraria // el valor 65 aunque la de la instruccion anterior seguiria // mostrando el 71. Quita el "&" del tipo de retorno de la // funcion Sumar y pruebalo. }