Introducción Programación orientada a objetos I Curso INEM. Programación en C++ Santiago Muelas Pascual smuelas@fi.upm.es Qué es la POO? Un paradigma de programación Un paradigma es una forma de afrontar la construcción código software No hay paradigmas mejores ni peores Todos tienen sus ventajas e inconvenientes Hay distintos paradigmas: POO, Estructurado, Funcional, Lógico, etc. Características de la POO Elementos de la POO Facilidad de diseño y relación con el mundo real Reusabilidad y facilidad de mantenimiento Del lenguaje máquina hacia el mundo real Sistemas más complejos Abstracción Trabajo en equipo Objetos: Elementos que interactúan entre sí para conseguir un fin Autónomos Con una funcionalidad concreta definida Instancias de una clase Clases: Especificación de un conjunto de elementos Todo objeto pertenece a una clase 1
Objetos y clases Objetos Los objetos tienen propiedades que los distinguen Comunes a todos los de su clase Propias de cada uno Los objetos representan los conceptos fundamentales del programa y de su interacción surge la funcionalidad Los objetos interactúan entre sí por medio de mensajes Como funciona un programa orientado a objetos? Buscar No hay el café Comprar café Cocina Tienda Resumen de objetos y clases Clases Representan conceptos o entidades significativas de un problema Se pueden ver como plantillas para definir elementos (objetos) Objetos Elementos con comportamiento definido en la clase y estado concreto Instancias de clase Interactúan por medio de mensajes Café 2
Otros conceptos importantes UML Encapsulamiento Polimorfismo Herencia UML (Unified modeling language): Lenguaje unificado de modelos Mapa del código. No sirve para desarrollar sino para describir Se utilizan diagramas diferentes. 13 en UML 2.0 Se verán más adelante Declaración de clases Una clase en C++ debe ser declarada antes de poder ser utilizada class nombre cuerpo de la clase }; Cuerpo de la clase: atributos y métodos Estado: Describe la situación interna del objeto. Existen varias formas de definir distintos estados El estado distingue a los objetos de la misma clase Cada uno tiene su estado Son los atributos Comportamiento: Describe los servicios que proporciona una clase lo que se puede hacer con ella). Son los métodos 3
Atributos Métodos Describen el estado interno de cada objeto concreto Pueden ser: Tipos básicos (int, bool, char, etc.) Arrays de elementos Punteros Otros objetos Definen el comportamiento de los objetos de una clase Devuelven (o no) un resultado Pueden necesitar parámetros Métodos y atributos Especificación e Implementación Atributos raza: Bulldog edad: 1 año nombre: Pancho Métodos ladra() come() duerme() Dos vistas diferentes de una clase: Especificación de la clase Declaración de atributos y métodos Implementación de la clase Definición de los métodos Ocultación de los detalles de implementación 4
Especificación (archivo *.h) Perro.h Implementación (archivo *.cpp) Perro.cpp class Perro int anyos; int edad(); }; Atributos Métodos #include Perro.h int Perro::edad() return anyos; } Ejercicio Añada el método ladra a la clase Perro para que imprima el mensaje GUAU cuando sea llamado Perro.h Perro.cpp class Perro }; int anyos; int edad(); Compilar #include Perro.h int Perro::edad() } return anyos; Visibilidad/Control de acceso Puede (y suele) haber distintos niveles de visibilidad para los miembros (atributos y métodos) de una clase. Existen tres tipos de modificadores: public: se puede acceder desde cualquier lugar private: sólo se puede acceder desde la propia clase protected: sólo se puede acceder desde la propia clase o desde una clase que herede de ella Se verá más en detalle en el tema de herencia Se aplican a todas las definiciones que vengan a continuación Hasta que se encuentre un nuevo modificador Solamente hay que utilizarlo en la especificación de la clase g++ -c Perro.cpp 5
Visibilidad/Control de acceso Métodos habituales: Constructor Sólo se puede acceder/invocar a anyos y edad desde métodos de la clase Perro ladra puede ser llamado desde cualquier otra clase Si no se especifica nada en class la visibilidad es private class Perro int anyos; public: void ladra(); private: int edad(); }; Sirve para inicializar un objeto al crearlo Se utiliza el nombre de la clase No devuelve nada por definición NombreClase( parámetros ) { } Métodos habituales: Constructor Métodos habituales: Constructor Perro.h class Perro Perro.cpp #include Perro.h Existe sobrecarga (distintos parámetros) class Perro #include Perro.h int anyos; public: Perro(int an); }; Perro::Perro(int an) anyos = an; } enum Color {MARRON, NEGRO}; int anyos; Color color; public: Perro(int an); Perro(int an, Color col); }; Perro::Perro(int an) anyos = an; color = MARRON; } Perro::Perro(int an, Color col) anyos = an; color = col; } 6
Métodos habituales: Constructor Existe sobrecarga (distintos parámetros) class Perro #include Perro.h Perro::Perro(int an) enum Color {MARRON, NEGRO}; int anyos; Perro(an,MARRON); Color color; } public: Perro::Perro(int an, Color col) Perro(int an); anyos = an; Perro(int an, Color col); color = col; } }; Algunas preguntas Qué ocurre si no hay constructor en una clase? El compilador implícitamente crea el constructor por defecto Siempre tienen algún valor los atributos de una clase? Sí, siempre tendrán algún valor (aunque en ocasiones pueda ser indeterminado) Qué ocurre si en el constructor de un objeto no se inicializan todos sus atributos? Que tendrán un valor indeterminado Algunas preguntas Métodos habituales: Destructor Qué ocurre si se define un constructor con visibilidad private? Sólo se podrán crear objetos desde métodos internos de la clase Métodos de clase Se puede utilizar una clase como atributo de otra? Sin ningún problema Puedo ejecutar un método sin haber creado un objeto de esa clase? No, para ejecutar un método de un objeto es necesario haber creado antes el objeto. Los métodos de clase o estáticos sí que se pueden ejecutar sin necesidad de un objeto (se verán más adelante) Para liberar recursos del objeto Muy utilizado cuando se hace uso de la memoria dinámica Se verá más adelante Cerrar ficheros, conexiones, etc. ~ + NombreClase No devuelve ni recibe nada por definición Puede tener visibilidad privada pero no es lo recomendable 7
Métodos habituales: Destructor Métodos habituales: Get/Set Perro.h class Perro ~Perro(); }; Perro.cpp #include Perro.h Perro::~Perro() } Sirven para modificar los atributos de una clase No son un nuevo tipo de métodos Convenio de factor Get Devuelve un atributo sin modificarlo Set Modifica un atributo con el valor pasado como parámetro Métodos habituales: Get/Set Asignación de objetos Perro.h class Perro int anyos; int getanyos(); void setanyos(int valor); }; Perro.cpp #include Perro.h int Perro::getAnyos() return anyos; } void setanyos(int valor) anyos = valor; } Por medio del operador = Se hace una copia de todos los atributos Se puede redefinir Ya se verá OJO El operador = tiene dos funciones Perro a; Perro b; b=a;? Perro c = b;? 8
Asignación de objetos Comparación de objetos Por medio del operador = Se hace una copia de todos los atributos Se puede redefinir Ya se verá OJO El operador = tiene dos funciones Perro a; Perro b; b=a; // asignación Perro c = b;// Constructor copia // Misma llamada que Perro c(b) Qué devuelve este código? class Prueba{ public: }; int main() { Prueba p,p1; p=p1; if (p==p1) cout << "son iguales" << endl; else cout << "no lo son" << endl; } Comparación de objetos Creación de objetos Por defecto no se genera el código para el operador de comparación == Ni para el operador = Hay que definirlo para comparar objetos O crearnos otro método (ej. equals) Después de que se haya declarado e implementado los métodos de una clase se puede crear un objeto de esa clase Similar al de cualquier otra variable Pasando los argumentos al constructor Perro mipancho(2,negro); Perro mipancho; // Si no hay parámetros 9
Operador. Para acceder a los miembros de un objeto Perro mipancho(2,negro); mipancho.ladra(); Color elcolordepancho = mipancho.color; mipancho.setanyos(3); Dentro de un método no hace falta utilizar el operador. para acceder a un miembro de la misma clase Ejercicios 10