Programación II. Guía 4 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación II Tema: Clases y Objetos en C++. Parte II. Objetivos Específico Implementar clases, objetos, propiedades, métodos y mensajes. Crear, analizar y comprender cuando utilizar las clases. Crear constructores y destructores de clases. Materiales y Equipo • Computadora con el software DevC++ • Guía Número 4 Introducción En esta práctica se tratarán los niveles de acceso, constructores y destructores para la definición de clases y creación de objetos. Los métodos constructor y destructor. El método constructor es un método muy diferente de todos los demás. En primer lugar, su nombre coincide siempre con el de la clase a la que pertenece, se ejecuta automáticamente al declarar un objeto como instancia de una clase; se escribe generalmente en la sección pública de una clase, y su función es crear e iniciar un objeto del tipo de la clase en la cual fue definido. De esta manera, los constructores permiten asegurar que los objetos, al crearse, se inicialicen con valores válidos. Además, un constructor no es ni un procedimiento ni una función, y por lo tanto no tiene asociado ningún tipo de retorno (ni siquiera void). Por último, el usuario nunca invoca un constructor de manera explícita. Esto no tendría sentido, pues de lo que se trata es de que los objetos sean inicializados de manera implícita por C++, sin intervención alguna por parte del usuario. Por ello, el constructor de una clase es invocado automáticamente justo después de cada declaración un objeto de esa clase. 2 Programación II, Guía 4 Sintaxis para la definición del método constructor: <nombre de clase> (<listado de parámetros>) { cuerpo del constructor } ó <nombre de clase> ( ) { } El método destructor es una función que se ejecuta automáticamente al destruirse un objeto. Lleva el mismo nombre de la clase, va precedido por el símbolo “~“ y no lleva argumentos. Un objeto se destruye al terminar el programa en el cual se creó y libera el espacio de memoria. En el caso de objetos locales, éstos se destruyen al dejar la sección en la cual se crearon. Además, el usuario nunca debe ejecutar un destructor de forma explícita. Los destructores son invocados automáticamente por C++ cada vez que un objeto deja de existir. Los destructores se emplean típicamente en clases cuyos objetos tienen asociados recursos que se deben devolver al sistema. Cuando se define un destructor para una clase, éste es llamado automáticamente cuando se abandona el ámbito en el que fue definido. Esto es así salvo cuando el objeto fue creado dinámicamente con el operador new, ya que en ese caso, cuando es necesario eliminarlo, hay que hacerlo explícitamente usando el operador delete. En general, será necesario definir un destructor cuando nuestra clase tenga datos miembro de tipo puntero, aunque esto no es una regla estricta. Sintaxis para la definición del método destructor: ~ <nombre de clase> ( ){ } Uso de constructores múltiples últiples. últiples C++ utiliza las capacidades de sobrecarga de funciones de para que una clase tenga varios constructores. Los constructores múltiples hacen referencia a que en una misma clase se puede incluir más de un constructor. Esto permite dar mayor flexibilidad a la declaración de la clase. Programación II. Guía 4 3 Existen tres tipos de constructores: • Constructor por omisión: es aquel que no tiene parámetros y su cuerpo no contiene instrucciones. Cuando se crea un objeto, si éste es global, el constructor inicializa con cero aquellos atributos que son numéricos y con NULL a los que son alfabéticos. Si el objeto creado es local, entonces los atributos se inicializan en valores determinados. • Constructor con parámetros: es aquel que tiene una lista de parámetros, a los cuales habrá que darles un valor en el momento de declarar un objeto. Dichos valores se usarán para instanciar los atributos del objeto creado. • Constructor con parámetros por omisión: es aquel que tiene una lista de parámetros, a los cuales se les asigna un valor por omisión que se usará para inicializar en caso de que no se den explícitamente otros valores. Se llama constructor de oficio al constructor por defecto que define automáticamente el compilador si el usuario no define ningún constructor. Si bien todo constructor de oficio es constructor por defecto (ya que no tiene argumentos), lo contrario no es cierto: el programador puede definir constructores por defecto que no son de oficio. Importante: el compilador sólo crea un constructor de oficio en el caso de que el programador no haya definido ningún constructor. En caso de que sólo se haya definido un constructor con argumentos y se necesite un constructor por defecto para crear, por ejemplo un vector de objetos, el compilador no crea este constructor por defecto sino que da un mensaje de error. Todos los constructores llevan el nombre de la clase a la cual pertenecen. La existencia o no de parámetros decide a qué tipo de constructor se está llamando. Es importante mencionar que los constructores por omisión y con parámetros por omisión no pueden convivir en una misma clase, ya que resultaría ambiguo a cual se estaría invocando en el caso de no proporcionar parámetros. Procedimiento Ejemplo 1: 4 Programación II, Guía 4 En el siguiente programa se define un triángulo por medio de la longitud de su base y su altura. Además se definen métodos para calcular su área, actualizar e imprimir sus atributos. Para la clase “Triangulo” se definieron dos constructores: uno por omisión y otro con parámetros y además un destructor. #include <iostream> using namespace std; class Triangulo { private: float Base, Altura; public: Triangulo( ); Triangulo(float, float); ~Triangulo( ); float CalculaArea( ); void ImprimeAtributos( ); void ActualizaAtributos(float, float); }; // Declaración del método constructor por omisión Triangulo::Triangulo( ) { } // Declaración del método constructor con parámetros Triangulo::Triangulo(float B, float A) { Altura = A; Base = B; } // Declaración del método destructor por omisión Triangulo:: ~Triangulo( ) { } cout << “ Se esta destruyendo el objeto. \n \n”; Programación II. Guía 4 5 //Método que calcula el área de un triángulo. float Triangulo::CalculaArea( ) { return (Base * Altura / 2); } //Método que despliega los valores de los atributos. void Triangulo::ImprimeAtributos( ) { cout << “ La base del triangulo es: Base = “ << Base << “\n”; cout << “ La altura del triangulo es: Altura = “ << Altura << “\n”; } //Método que modifica los valores de la base y de la altura de un triángulo. void Triangulo::ActualizaAtributos(float B, float A) { Altura = A; Base = B; } int main( ) { float ValorAlt, ValorBase; Triangulo ObjT1; /* Se declara un objeto hacienda uso del constructor por omisión. En este caso, la base y la altura permanecen con valores indefinidos */ ValorBase = 2.6; ValorAlt = 3.7; // Se le asignan valores a la base y a la altura del triángulo ObjT1.ActualizaAtributos(ValorBase, ValorAlt); Triangulo ObjT2 (2.8, 9.0); /* Se declara un objeto hacienda uso del constructor con parámetros. En este caso se le asigna a la base el valor de 2.8 y a la altura el valor de 9.0 */ /* Se imprimen los atributos de ambos triángulos, luego se calcula el área de cada uno de ellos y finalmente se destruye cada objeto */ ObjT1.ImprimeAtributos( ); 6 Programación II, Guía 4 cout << “ y su area es: “ << ObjT1.CalculaArea( ); ObjT1. ~Triangulo( ); ObjT2.ImprimeAtributos( ); cout << “ y su area es: “ << ObjT2.CalculaArea( ); ObjT2. ~Triangulo( ); system(“pause”); return 0; } Análisis de Resultados Ejercicio 1: Tomar el código anterior como referencia y realizar los cambios que sean necesarios para crear un programa que a través de un menú permita realizar las siguientes funciones: a) Crear objetos de tipo triángulo. Deberá solicitarse al usuario que tipo de triángulo se desea crear: Equilátero, Isósceles o Escaleno. (Es decir que debe modificarse la clase de tal manera que los objetos posean además de base y altura, los valores de los tres lados del triángulo) b) En cualquier momento modificar los atributos de los objetos. c) Calcular el área de un objeto en particular, de dos maneras (considerar que según el tipo de triángulo, existe una fórmula para calcular su área). d) Calcular el perímetro de un objeto en particular (considerar que según el tipo de triángulo, existe una fórmula para calcularlo). e) Salir del programa. Programación II. Guía 4 7 Investigación Implementa la siguiente clase para representar un reloj digital: class CReloj { private: int horas, minutos, segundos; int bateria; // cada tic-tac consume una unidad de energía public: CReloj(int h, int m, int s, int b); void tic_tac( ); void avanza(int h, int m, int s); void atrasa(int h, int m, int s); bool esta_parado( ); void recarga_bateria(int b); void hora_en_formato_12h( ); void hora_en_formato_ 24( ); }; Escribir un programa que a través de un menú permita manipular un reloj digital. 8 Programación II, Guía 4 Guía 4: Clases y Objetos en C++. Parte II. Hoja de cotejo: Alumno: Máquina No: Docente: GL: Fecha: 1-4 5-7 8-10 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 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. 4 1 EVALUACIÓN % CONOCIMIENTO Del 20 al 30% APLICACIÓN DEL CONOCIMIENTO Del 40% al 60% ACTITUD Del 15% al 30% TOTAL 100% Nota