Programación II. Guía 8 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación II Tema: Sobrecarga de Operadores Unarios. Sobrecarga de Funciones. Objetivos Diferenciar sobrecarga de operadores binarios y unarios. Identificar cuando sobrecargar operadores. Implementar programas en C++ que sobrecarguen operadores unarios. Implementar programas en C++ que incluya sobrecarga de funciones Materiales y Equipo Computadora con el software DevC++ Guía Número 8 Introducción Sobrecarga de operadores unarios. Se conocen también como operadores unitarios. Un operador unitario es un operador que tiene un único operando, en otras palabras, es aquel que actúa sobre un único operando. El operador ++, por ejemplo es unario. Recordemos que los operadores unarios susceptibles de sobrecarga son: Operadores unarios + y - Operadores unarios de incremento ++ y decremento -- Operadores de puntero: referencia & e indirección * Operador de manejo de bits ("bitwise") complemento a uno ~ Operador de negación lógica! Asignación y desasignación dinámica de memoria: new y delete Consideremos una clase de tipo T y un objeto X de tipo T. Se define un operador unitario sobrecargado ++, entonces:
2 Programación II, Guía 8 ++X se interpreta como: ó como: X.operator ++ ( ) operator ++ (X) Un operador unario se puede definir así: Como una función de un argumento Como una función miembro sin argumento (el caso más frecuente) Nunca las dos a la vez. Sobrecarga de funciones o métodos. La sobrecarga de funciones es el proceso de definir dos o más funciones, con el mismo nombre, que difieren únicamente en los parámetros que requieren y en el tipo de resultado que generan. Este tipo de sobrecarga resulta ser una poderosa herramienta de programación. Sin embargo, debe ser cuidadoso su uso ya que si se utiliza excesivamente el programa podría resultar poco legible. Además, es importante considerar que no es posible definir dos funciones que difieran sólo en el tipo de resultado. Deben hacerlo también en la lista de parámetros. Cómo determina C++ la función sobrecargada correcta? Lo determina en base al número y tipo de parámetros pasados a la función sobrecargada. C++ requiere que al menos uno de los parámetros tenga un tipo diferente del que utilizan otras funciones. Por consiguiente, es válido declarar dos funciones sobrecargadas, tales como: int F (int a, int b, int c); int F (int a, int b, float c); C++ puede llamar a ambas funciones, ya que al menos uno de los valores de los parámetros tiene un tipo diferente. Sin embargo, si se intenta escribir una función sobrecargada que tenga tipos similares, C++ emitirá un error. Por ejemplo, las definiciones siguientes no se compilarán, ya que el compilador no diferenciará una de otra: int F (int a, int b, int c); int F (int a, int b, int c);
Programación II. Guía 8 3 La sobrecarga de funciones es un tipo específico de polimorfismo. El polimorfismo es una de las características fundamentales de la programación orientada a objetos. Las reglas que sigue C++ para seleccionar una función sobrecargada son: Si existe una correspondencia exacta entre los tipos de parámetros de la función llamadora y una función sobrecargada, se utiliza dicha función. Si no existe una correspondencia exacta, pero sí se produce la conversión de un tipo a un tipo superior (tal como un parámetro int a long, o un float a un double) y se produce, entonces, una correspondencia, se utilizará la función seleccionada. Si una función sobrecargada se define con un número variable de parámetros (mediante el uso de puntos suspensivos [ ]), se puede utilizar como una coincidencia potencial. Procedimiento Ejemplo 1: Los operadores de incremento y decremento suelen ser muy útiles en aplicaciones de tiempo o conteo. En el siguiente ejemplo, se muestra una clase Punto con operadores ++ y - - sobrecargados y con notaciones prefija y postfija, que realiza incrementos y decrementos de las coordenadas de cada punto. #include <iostream> using namespace std; class Punto { private: int CoordX; int CoordY; // Definición de la clase Punto // coordenada en eje x del punto // coordenada en eje y del punto public: Punto( ); Punto(int ValX, int ValY); ~Punto( ){ ; void FijarX (int ValX); void FijarY (int ValY); int LeerX( ); int LeerY( );
4 Programación II, Guía 8 /* Funciones para sobrecargar operadores de incremento y decremento en forma prefija y postfija */ Punto & operator ++( ); // Forma prefija Punto operator ++ (int); // Forma postfija Punto & operator --( ); // Forma prefija Punto operator -- (int); // Forma postfija ; // Definición de funciones miembro Punto::Punto( ) { CoordX = 0; CoordY = 0; Punto::Punto(int ValX, int ValY) { FijarX(ValX); FijarY(ValY); int Punto::LeerX( ) { return CoordX; int Punto::LeerY( ) { return CoordY; void Punto::FijarX(int ValX) { CoordX = ValX; void Punto::FijarY(int ValY) { CoordY = ValY; // Sobrecarga de operador de incremento forma prefija (++p) Punto & Punto::operator ++( ) { CoordX += 1; CoordY += 1; return *this; // Sobrecarga de operador de incremento forma postfija (p++) Punto Punto::operator ++(int) { CoordX += 1; CoordY += 1; return Punto(CoordX - 1, CoordY - 1);
// Sobrecarga de operador de decremento forma prefija (--p) Punto & Punto::operator --( ) { CoordX -= 1; CoordY -= 1; return *this; // Sobrecarga de operador de deremento forma postfija (p--) Punto Punto::operator --(int) { CoordX -= 1; CoordY -= 1; return Punto(CoordX + 1, CoordY + 1); int main() { Punto P(5, 7); Punto Q(1, 2); Punto R; Programación II. Guía 8 5 cout << Las coordenadas del punto P son ( " << P.LeerX() << ", " << P.LeerY() << " )" << endl; cout << "Las coordenadas del punto Q son ( " << Q.LeerX() << ", " << Q.LeerY() << " )" << endl; R = ++P; cout << endl << "Las coordenadas del punto ++P son ( " << R.LeerX() << ", " << R.LeerY() << " )" << endl; R = Q++; cout << endl << "Las coordenadas del punto Q++ son ( " << R.LeerX() << ", " << R.LeerY() << " )" << endl; R = --Q; cout << endl << "Las coordenadas del punto --Q son ( " << R.LeerX() << ", " << R.LeerY() << " )" << endl; R = P--; cout << endl << "Las coordenadas del punto P-- son ( " << R.LeerX() << ", " << R.LeerY() << " )" << endl; cout << endl << "Las coordenadas finales del punto P son ( " << P.LeerX() << ", " << P.LeerY() << " )" << endl; cout << endl << "Las coordenadas finales del punto Q son ( " << Q.LeerX() << ", " << Q.LeerY() << " )" << endl; system("pause>nul"); return 0;
6 Programación II, Guía 8 Ejemplo 2: En este ejemplo se sobrecarga una función de nombre Prueba para realizar tres operaciones totalmente diferentes. #include <iostream> using namespace std; // Prototipos de las funciones sobrecargadas int Prueba(int); int Prueba(int, int); float Prueba(float, float); int main() { int indice = 7; int x = 4, y = 5; float a= 6.5, b = 18.3; cout << "El cuadrado de " << indice << " es: " << Prueba(indice) << endl; cout << endl << "El producto de " << x << " por " << y << " es: " << Prueba(x,y) << endl; cout << endl << "La media de " << a << " y " << b << " es: " << Prueba(a, b) << endl; system("pause>nul"); return 0; // Definición de las funciones sobrecargadas int Prueba(int valor) entero { return (valor * valor); // La función Prueba calcula el cuadrado de un número int Prueba(int valor1, int valor2) // La función Prueba multiplica dos números enteros { return (valor1 * valor2); float Prueba(float valor1, float valor2) números reales { return ((valor1 * valor2)/2); // La función Prueba calcula la media de dos
Programación II. Guía 8 7 Análisis de Resultados Ejercicio 1: Con la clase Fecha proporcionada, crear un programa que utilice operadores de preincremento y postdecremento sobrecargados para sumar 1 al día en un objeto de tipo fecha, mientras que produce incrementos apropiados en el mes y el año, en caso de ser necesario. Además deben sobrecargarse el operador + para incrementar un número n de días a una determinada fecha; y el operador de flujos de salida para poder mostrar los objetos de tipo Fecha. Debe validarse los años bisiestos. La solución se debe manejar a través de un menú que contenga las siguientes opciones: a) Crear los objetos de tipo Fecha, solicitando los datos al usuario. b) Incrementar una fecha en un valor de n días. c) Prueba del operador preincremento. d) Prueba del operador postincremento. e) Salir de la aplicación. El menú deberá estar siempre activo, en la misma posición en pantalla, hasta que el usuario seleccione la opción salir. El programa debe estar debidamente comentado. class Fecha { private: int dia, mes, year; public: Fecha(int d = 1, int m = 1, int y = 1900); // constructor predeterminado ~Fecha( ) { ; void SetFecha(int, int, int); // Para establecer día, mes y año bool yearbisiesto(int); // Para verificar si la fecha es un año bisiesto bool findemes(int); // Para verificar si la fecha está en el fin de mes // Sobrecarga de operadores Fecha & operador ++( ); Fecha operador ++( ); Fecha & operador +(int); //Sobrecarga operador preincremento //Sobrecarga operador postincremento //Sobrecarga operador + para sumar n días al objeto
8 Programación II, Guía 8 ; friend ostream & operador << (ostream &, const Fecha &); // Sobrecarga operador de // flujo de salida Ejercicio 2: Crear un programa que incluya dos funciones sobrecargadas: Max: que permitirá encontrar el máximo entre dos números que pueden ser del tipo entero o real de precisión doble. Raiz: que permitirá calcular la raíz cuadrada de un número que puede ser del tipo entero o real de precisión doble. La funcionalidad debe implementarse con un menú con las siguientes opciones: Opción de menú 1: Encontrar el máximo de dos números introducidos por el usuario. Opción de menú 2: Calcular la raíz cuadrada de un número introducido por el usuario. Opción de menú 3: Salir del programa. El menú deberá estar siempre activo, en la misma posición en pantalla, hasta que el usuario seleccione la opción salir. El programa debe estar debidamente comentado.
Programación II. Guía 8 9 Guía 8: Sobrecarga de Operadores Unarios. Sobrecarga de Funciones. Hoja de cotejo: 8 Alumno: Máquina No: Docente: GL: Fecha: EVALUACIÓN % 1-4 5-7 8-10 Nota CONOCIMIENTO Del 20 al 30% Conocimiento deficiente de los fundamentos teóricos Conocimiento y explicación incompleta de los fundamentos teóricos Conocimiento completo y explicación clara de los fundamentos teóricos APLICACIÓN DEL CONOCIMIENTO Del 40% al 60% ACTITUD Del 15% al 30% No tiene actitud proactiva. Actitud propositiva y con propuestas no aplicables al contenido de la guía. Tiene actitud proactiva y sus propuestas son concretas. TOTAL 100%