GUÍA DE LABORATORIO N.2:CLASES, CONSTRUCTORES Y DESTRUCTORES 30 de marzo de 2014 Fundamentos La programación orientada a objetos surge en la historia como un intento para dominar la complejidad que, de forma innata, posee el software. Tradicionalmente, la forma de enfrentarse a esta complejidad ha sido empleando lo que llamamos programación estructurada, que consiste en descomponer el problema objeto de resolución en subproblemas y más subproblemas hasta llegar a acciones muy simples y fáciles de codificar. Se trata de descomponer el problema en acciones, en verbos. El modelo Orientado a Objetos Para entender este modelo es necesario revisemos inicialmente 2 conceptos básicos: Objetos Clases 1. Objetos Un objeto del mundo real es cualquier cosa que vemos a nuestro alrededor. Digamos que para leer este artículo lo hacemos a través del monitor y una computadora, ambos son objetos, al igual que nuestro teléfono celular, un árbol o un automóvil. Analicemos un poco más a un objeto del mundo real, como la computadora. No necesitamos ser expertos en hardware para saber que una computadora está compuesta internamente por varios componentes: la tarjeta madre, el chip del procesador, un disco duro, una tarjeta de video, y otras partes más. El trabajo en conjunto de todos estos componentes hace operar a una computadora. Internamente, cada uno de estos componentes puede ser sumamente complicado y puede ser fabricado por diversas compañías con diversos métodos de diseño. Pero nosotros no necesitamos saber cómo trabajan cada uno de estos componentes, como saber que hace cada uno de los chips de la tarjeta madre, o cómo funciona internamente el procesador. Cada componente es una unidad autónoma, y todo lo que necesitamos saber de adentro es cómo interactúan entre sí los componentes, saber por ejemplo si el procesador y las memorias son compatibles con la tarjeta madre, o conocer donde se coloca la tarjeta de video. Cuando conocemos como interaccionan los componentes entre sí, podremos armar fácilmente una computadora. ¿Que tiene que ver esto con la programación? La programación orientada a objetos trabaja de esta manera. Todo el programa está construido en base a diferentes componentes (Objetos), cada uno tiene un rol específico en el programa y todos los componentes pueden comunicarse entre ellos de formas predefinidas. Todo objeto del mundo real tiene 2 componentes: características y comportamiento.Por ejemplo, los automóviles tienen características (marca, modelo, color, velocidad máxima, etc.) y comportamiento (frenar, acelerar, retroceder, llenar combustible, cambiar llantas, etc.). Los Objetos de Software, al igual que los objetos del mundo real, también tienen características y comportamientos. Un objeto de software mantiene sus características en una o más "variables", e implementa su comportamiento con "métodos". Un método es una función o subrutina asociada a un objeto. 1 GUÍA DE LABORATORIO N.2:CLASES, CONSTRUCTORES Y DESTRUCTORES 30 de marzo de 2014 Para redondear estas ideas, imaginemos que tenemos estacionado en nuestra cochera un Ford Focus color azul que corre hasta 260 km/h. Si pasamos ese objeto del mundo real al mundo del software, tendremos un objeto Automóvil con sus características predeterminadas: Marca = Ford Modelo = Focus Color = Azul Velocidad Máxima = 260 km/h Cuando a las características del objeto le ponemos valores decimos que el objeto tiene estados. Las variables almacenan los estados de un objeto en un determinado momento. Definición teórica: Un objeto es una unidad de código compuesto de variables y métodos relacionados. 2. Las Clases En el mundo real, normalmente tenemos muchos objetos del mismo tipo. Por ejemplo, nuestro teléfono celular es sólo uno de los miles que hay en el mundo. Si hablamos en términos de la programación orientada a objetos, podemos decir que nuestro objeto celular es una instancia de una clase conocida como "celular". Los celulares tienen características (marca, modelo, sistema operativo, pantalla, teclado, etc.) y comportamientos (hacer y recibir llamadas, enviar mensajes multimedia, transmisión de datos, etc.). Cuando se fabrican los celulares, los fabricantes aprovechan el hecho de que los celulares comparten esas características comunes y construyen modelos o plantillas comunes, para que a partir de esas se puedan crear muchos equipos celulares del mismo modelo. A ese modelo o plantilla le llamamos CLASE, y a los equipos que sacamos a partir de ella la llamamos OBJETOS. 2 GUÍA DE LABORATORIO N.2:CLASES, CONSTRUCTORES Y DESTRUCTORES 30 de marzo de 2014 Esto mismo se aplica a los objetos de software, se puede tener muchos objetos del mismo tipo y mismas características. Definición teórica: La clase es un modelo o prototipo que define las variables y métodos comunes a todos los objetos de cierta clase. También se puede decir que una clase es una plantilla genérica para un conjunto de objetos de similares características. Por otro lado, una instancia de una clase es otra forma de llamar a un objeto. En realidad no existe diferencia entre un objeto y una instancia. Sólo que el objeto es un término más general, pero los objetos y las instancias son ambas representación de una clase. Ejemplo 1: Empleando programación orientada a objetos realice un programa que calcule el área y el perímetro de un rectángulo class Rectangulo { public: void capturarDatos(); void calcularArea(); void calcularPerimetro(); private: int base; int altura; }; La definición de la clase Rectangulo inicia con la palabra clave class. El cuerpo de la definición de la clase se delimita mediante llaves { }. La definición de la clase termina con un punto y coma. La definición de la clase Rectangulo contiene los miembros enteros base y altura y las funciones miembro capturarDatos, calcularArea y calcularPerimetro. Las etiquetas public: protected: y private: son especificadores de acceso de miembros. Cualquier dato miembro o función miembro declarado después del especificador de acceso de miembros public es accesible cuando el programa tiene acceso a un objeto de la clase Rectangulo. Cualquier dato miembro o función miembro declarado tras el especificador de acceso de miembros private es accesible sólo para las funciones miembro de la clase. Los especificadores de acceso de miembros siempre van seguidos por dos puntos y pueden aparecer varias veces y en cualquier orden en una definición de clase. 3 GUÍA DE LABORATORIO N.2:CLASES, CONSTRUCTORES Y DESTRUCTORES 30 de marzo de 2014 Los dos miembros enteros aparecen tras el especificador de acceso de miembros private. Esto indica que estos datos miembro de la clase sólo pueden ser accedidos por las funciones miembro de la clase. Por lo tanto, los datos miembro sólo pueden ser accedidos por las tres funciones miembro en la parte public. El nombre de la clase se vuelve un nuevo especificador de tipo. Puede haber muchos objetos de una clase, así como puede haber muchas variables de un tipo como int. En el siguiente ejemplo, el programa instancia (crea) un solo objeto de la clase Rectangulo llamado rec. Utilizando este objeto se pueden mandar llamar a las funciones miembro. El operador de ámbito (::) es el medio que tiene el compilador para identificar en donde están definidos los componentes de una clase; por tanto, su uso es necesario cuando alguno de estos componentes se utiliza fuera del ámbito de la clase. #include<conio.h> #include<iostream.h> class Rectangulo { public: void capturarDatos(); void calcularArea(); void calcularPerimetro(); private: int base; int altura; }; void Rectangulo::capturarDatos() { cout<<"Cual es la base del rectangulo"; cin>>base; cout<<"Cual es la altura del rectangulo"; cin>>altura; } void Rectangulo::calcularArea() { cout<<"El area del rectángulo es:"<<base*altura; cout<<"\n"; } void Rectangulo::calcularPerimetro() { cout<<"El perímetro del rectángulo es:" <<2*base+2*altura; cout<<"\n"; } main() { 4 GUÍA DE LABORATORIO N.2:CLASES, CONSTRUCTORES Y DESTRUCTORES 30 de marzo de 2014 Rectangulo rec; //declaración del objeto system("cls"); // clrscr(); rec.capturarDatos(); //el objeto manda llamar la función miembro capturarDatos rec.calcularArea(); rec.calcularPerimetro(); getch(); } Inicialización de objetos mediante constructores C++ requiere una llamada a un constructor para cada objeto que se crea, lo cual ayuda a asegurar que cada objeto se inicialice antes de utilizarlo en un programa. La llamada al constructor ocurre de manera implícita cuando se crea el objeto. Si una clase no incluye un constructor de forma explicita, el compilador proporciona un constructor predeterminado, es decir un constructor sin parámetros. Definición de un constructor: El constructor tiene el mismo nombre que su clase, en su lista de parámetros específica los datos que requiere para realizar su tarea. Prototipo de la Función: nombre_clase(); Desarrollo de la Función: nombre_clase::nombre_clase(){ cuerpo; } En la clase Rectangulo, se define un constructor que no tiene parámetros de entrada. Posteriormente este constructor Rectangulo::Rectangulo asigna un valor e cero para las variables de clase base y altura. Destrucción de objetos mediante funciones Destructoras El complemento de un constructor es la función destructora. A esta función se le llama automáticamente cuando se destruye el objeto. El nombre de las funciones destructoras debe ser el mismo que el de la clase a la que pertenece precedido del carácter ~ .Los objetos se destruyen cuando se salen de ámbito cuando son locales, y al salir del programa si son globales. Las funciones destructoras no devuelven valor y tampoco pueden recibir parámetros. El uso mas apropiado de las funciones destructoras es para liberar memoria, esto es cuando se esta trabajando con estructuras de memoria dinámica. Prototipo de la Función: ~nombre_clase(); Desarrollo de la Función: nombre_clase:: ~nombre_clase(){ cuerpo; } En la clase Rectangulo, se define un destructor que se ejectura en el momento que el objeto se termina de emplear. 5 GUÍA DE LABORATORIO N.2:CLASES, CONSTRUCTORES Y DESTRUCTORES 30 de marzo de 2014 #include<conio.h> #include<iostream.h> class Rectangulo { public: Rectangulo(); //definición del constructor ~Rectangulo(); void capturarDatos(); void calcularArea(); void calcularPerimetro(); private: int base; int altura; }; Rectangulo::Rectangulo() // función constructor { base=0; altura=0; } Rectangulo:: ~Rectangulo() // función constructor { cout << "Destruyendo...\n"; getch(); } void Rectangulo::capturarDatos() { cout<<"Cual es la base del rectangulo"; cin>>base; cout<<"Cual es la altura del rectangulo"; cin>>altura; } void Rectangulo::calcularArea() { cout<<"El area del rectángulo es:"<<base*altura; cout<<"\n"; } void Rectangulo::calcularPerimetro() { cout<<"El perímetro del rectángulo es:" <<2*base+2*altura; cout<<"\n"; } main() { Rectangulo rec; //declaración del objeto system("cls"); // clrscr(); 6 GUÍA DE LABORATORIO N.2:CLASES, CONSTRUCTORES Y DESTRUCTORES rec.capturarDatos(); //el capturarDatos rec.calcularArea(); rec.calcularPerimetro(); getch(); } objeto manda llamar la 30 de marzo de 2014 función miembro Ejercicios propuestos Considerando las temáticas tratadas previamente realice los siguientes programas: 1.- Crear una clase Círculo que contenga funciones miembro que permitan calcular el área y la circunferencia del círculo. 2.- Crear la clase Pesos que contenga funciones miembro para convertir pesos a dólares y dólares a pesos. 3.- Crear la clase Fecha que contenga una función miembro para capturar el día, mes y año y otra función miembro que indique si el año es bisiesto, tomando en cuenta que el año es bisiesto si cumple con las siguientes condiciones: si el año es divisible entre 4 pero no entre 100, o si el año es divisible entre 400. 4.- Crear la clase Triangulo que contenga funciones miembro que permitan capturar los valores de los 3 lados de un triángulo, y que muestre un mensaje donde indique si es un triángulo equilátero, escaleno o isósceles. El triángulo equilátero es el que tiene sus 3 lados iguales, el isósceles tiene dos lados iguales y el escaleno tiene todos sus lados distintos. 5. Complemente la clase Rectángulo considerando que el método que recibe valores, debe comprobar que tanto largo como ancho sean mayores que 0 y menores que 20, de lo contrario mostrara mensaje “calculo imposible”. 6. Crear una aplicación que contenga una clase llamada Calculadora, con las siguientes características: • variable primero, variable segundo – son los números con los que operará. • fijarNumeros(n1, n2) – guardará en el objeto los números para operar luego con ellos. • sumar() – sumará los números. No necesita parámetros porque accede directamente a las propiedades (variables) que tenga guardadas el objeto de clase calc que creemos. • dividir() – lo mismo que antes, dividirá primero entre segundo, pero para asegurarnos de que pueda hacerse, recurrirá a otro método. • comprobar() – este método comprobará que segundo sea distinto de cero para poder dividir. • Los números deben ser introducidos por el usuario. 7. Crear una aplicación en C++, permita el cálculo del área de al menos 3 figuras planas trigonométricas (triangulo, cuadrado, rombo, circulo, etc.). Y otra estructura donde calcule el volumen de al menos 3 cuerpos con volumen (cubo, cono, cilindro, esfera, etc.). Las variables necesarias para calcular el área y el volumen deben ser introducidas por el usuario. 7