Unidad I Programación Orientada a Objetos en C++ Programación Orientada a Objetos en C++ Programación I - 0416202
Contenido Esta lección abarca los siguientes temas: Estructura y declaración de una clase Implementación de Atributos y métodos Modificadores de Acceso a métodos y atributos El constructor y destructor Declaración de objetos Creación de objetos de forma dinámica Uso de objetos Manipulando Atributos Invocando métodos El puntero this Arreglos de Objetos Métodos Setter y Getter
Estructura y declaración de una clase Preprocesador El preprocesador analiza el archivo fuente antes de la fase de compilación real, y realiza las sustituciones de macros y procesa las directivas. Una directiva de preprocesador es una línea cuyo primer carácter es un #. Por ejemplo, la directiva #define identificador, sirve para definir macros, éstas suministran un sistema para la sustitución de palabras. Si se intenta definir un identificador de macro que ya esté definido, se producirá un warning, si la definición no es exactamente la misma. Para ello se usan: #ifndef identificador #define identificador.. #endif
Estructura y declaración de una clase Después de creado el proyecto, hay que añadir un nuevo archivo: File/New/Source File ó CTRL+N En este archivo, el primer paso es colocar la directiva del PreProcesador
Estructura y declaración de una clase Ahora se empieza a transcribir la clase. Palabra reservada para definir una clase. Por lo general un archivo contiene una sola clase, y el nombre de éste debe coincidir con el nombre de la clase. Los modificadores definen el acceso a los atributos y a los métodos. Los elementos entre <> indica que son opcionales. Un atributo puede ser un tipo de dato primitivo o puede ser otro objeto cuya clase ya se ha definido.
Estructura y declaración de una clase Generalmente, la implementación de una clase se realiza en un archivo independiente, de extensión.cpp ó.h lo que ayuda a la reutilización del código. Posteriormente se pueden incluir como archivos de cabecera en un programa usando la directiva de compilador #include.
Modificadores de acceso Cuando se crea una nueva clase en C++, se puede especificar el nivel de acceso que se quiere para los atributos de las instancias y los métodos definidos en la clase por medio de los siguientes modificadores de acceso: public Cualquier clase puede acceder a las propiedades y métodos públicos. protected Sólo las clases derivadas y aquellas situadas o no en el mismo paquete, pueden acceder a las propiedades y métodos protegidos. private Las variables y métodos privados sólo pueden ser accedidos desde dentro de la clase. Si en la definición de la clase se obvia el modificador de acceso, la clase lo asume como privado (private).
Modificadores de acceso La siguiente tabla resume los modificadores de acceso en C++ Visibilidad public protected private Desde la propia clase Si Si Si Desde otra clase Si No No Desde una sub-clase Si Si No
Estructura y declaración de una clase Ejemplo de clase
Implementación de métodos Existen dos formas para implementar (escribir el código) los métodos de una clase en C++: En línea, se refiere cuando la implementación se hace dentro de la clase. Fuera de línea, cuando se codifica la implementación del método fuera de la clase, puede ser en otro archivo. Esta forma se usa cuando el código del método es muy grande, entonces sólo se coloca el prototipo de la función dentro del bloque de declaración de la clase.
Implementación de métodos Se definen de manera similar a cualquier otra función de Lenguaje C pero, requiere incluir el operador de resolución de ámbito :: en la definición del método. TipoRetorno NombreClase::nombreMetodo ( ListaDeParametros ){ //Declaración de variables locales } //Lista de sentencias propias del método El operador :: se conoce como operador de ámbito, y sirve para indicar la pertenencia de un método o atributo a una clase determinada. La lista de parámetros son declaraciones de Objetos separadas por coma. Los parámetros se pasan siguiendo las mismas reglas de Lenguaje C.
Implementación de métodos Método definido En Línea Fuera de Línea
Implementación de métodos Continuando con el ejemplo de la clase Casa, implementemos sus métodos. En la mayoría de los casos en el archivo de cabecera.h se define la estructura de la clase y el código de cada método se escribe en un archivo que tenga el mismo nombre de la clase pero con extensión.cpp
Instanciación de objetos Una vez que la clase ha sido implementada se pueden declarar objetos: como variables locales de métodos o como atributos de otras clases, siguiendo las reglas de sintaxis de C++ para cada caso. Ejemplo: Casa micasa; Estudiante rafael; Vehiculo tucson; Para declarar un objeto se escribe primero el nombre de la clase y luego el nombre (identificador) del objeto. Éstos son objetos estáticos. Cuando se declara un objeto en C++, el sistema reserva memoria de manera automática para el objeto.
Instanciación de objetos Si se desea declarar un objeto de una clase que se encuentra en otro archivo, por ejemplo, en el archivo main.cpp, se desea declarar un objeto de la clase Casa, que se encuentra en el archivo Casa.h Es necesario incluir el archivo de forma explícita, por medio del nombre y usando la directiva #include.
Manipulación de atributos Para que un objeto pueda usar sus características y métodos, debe establecer comunicación con el mismo, de esta manera podrá cambiar el estado del objeto y/o realizar alguna acción. Los objetos proporcionan dos formas de hacer esto: 1. Manipulando los atributos (no recomendable desde otras clases). Para acceder a los atributos que tienen los objetos se utiliza el. acompañado del nombre del objeto: nombreobjeto.nombreatributo Estas operaciones solo son posibles si la clase Casa permite el acceso (depende de los modificadores usados en la clase Casa)
Invocación de métodos 2. Invocando sus métodos, haciendo un pase de mensajes.
Constructores Es un método con un propósito específico que se ejecuta automáticamente cuando se crea un objeto de una clase. Generalmente, un constructor se utiliza para inicializar los atributos de una clase. No retorna ningún valor (ni un void), pero si puede tomar los parámetros que requiera. Debe tener el mismo nombre de la clase.
Constructores Declaración de constructores
Constructores Constructor por defecto Constructores alternativos ó paramétricos
Constructores Uso de los constructores Uso del constructor por defecto En Memoria micasa1 direccion = numhabitaciones= 0 Uso del constructor que recibe char[], int micasa2 direccion = Av Para numhabitaciones= 4 Uso del constructor que recibe un char[] micasa3 direccion = Pirineo numhabitaciones= 0 Uso del constructor que recibe un int micasa4 direccion = null numhabitaciones= 3
Instanciación de objetos dinámicos Para crear una instancia de una Clase de forma dinámica se debe hacer solicitud de memoria usando la palabra reservada new y un puntero de la Clase en cuestión, la sintáxis es la siguiente: NombreClase *punteroobjeto; punteroobjeto = new NombreClase(<parámetros>); Puntero de la clase Operador para solicitar memoria Constructor de la clase a la cual pertenece el objeto Ejemplo: Estudiante *rafael = new Estudiante(); Vehiculo *tucson = new Vehiculo( Fiat, Palio, 2005, Rojo ); Se crea un objeto cuyos valores de sus atributos están bien definidos y dados por el usuario de la Clase Lista argumentos necesita constructor. de que el Se crea un objeto estudiante con el estado dado por los valores por defecto que disponga el Programador de la Clase
Manipulación de objetos dinámicos Para usar las características y métodos de un objeto dinámico, se hace del mismo modo que con objetos estáticos, todo dependerá de la permisología de acceso que ofrezca la clase de dicho objeto. La única distinción, es que se usa el operador -> en lugar del operador. Ejemplo: Casa *micasa = new Casa( Santa Teresa, 2); micasa->cargardatos(); cout<< La direccion es: <<micasa->dirección<<endl;
El puntero this Uno de los usos que se le da, es para resolver ambigüedad entre argumentos y atributos. Error de ambigüedad, se resuelve usando this También sirve para invocar métodos con el mismo objeto que invocó. Para el ejemplo es micasa
Destructores Son los métodos que se ejecutan automáticamente cuando se destruye un objeto. Tienen el mismo nombre del constructor, pero se diferencian en que está precedido del carácter ~ No deben tener ningún tipo de retorno. No pueden aceptar parámetros. Sólo puede existir un destructor. Generalmente se utilizan para liberar memoria que fue asignada por el constructor. C++ crea un destructor vacío por defecto, en caso de no existir uno declarado explícitamente.
Destructores Si el ámbito del objeto es local, el destructor es llamado cuando el control es pasado fuera de su bloque de definición. Si el objeto fue creado dinámicamente (con new) el destructor es llamado cuando se invoca el operador delete.
Arreglos de objetos La declaración de un vector de objetos se realiza de forma similar a como se declaran los vectores de tipos de datos primitivos. Ejemplo: Casa miscasas[15] Rectangulo potreros[12]; Circulo contorno[8]; Cada objeto del vector se accede por medio de un índice, al igual que se hace con los tipo de datos primitivos. Ejemplo: potreros[3].desplazar(9, 5); for (i=0; i<15;i++) contorno[i].desplazar(rand(),rand());
Arreglos de objetos Para crear un vector de objetos dinámico, primero se hace la declaración de tipo y se específica el tamaño, de la siguiente forma: NombreClase ** nombrevector = new NombreClase * [tamaño]; Luego, por cada posición del vector se debe crear la referencia y hacer la inicialización correspondiente, llamando a un constructor. for (i=0; i<nombrevector.length; i++) nombrevector[i]= new NombreClase(); Ejemplo: Casa ** miscasas = new Casa * [20]; for (i=0; i<20; i++) { miscasas[i]= new Casa(); miscasas[i]->mostrardatos(); } delete [] miscasas;
Métodos setter Métodos que sirven para asignar o establecer un valor a un atributo. Ejemplo:
Métodos getter Métodos que sirven para obtener o recuperar un valor que se ha asignado a algún atributo. Ejemplo: