View
9
Download
0
Category
Preview:
Citation preview
6/20/11
1
Programación orientada a objetos I
Curso INEM. Programación en C++ Santiago Muelas Pascual
smuelas@fi.upm.es
Introducción
! ¿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
! 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
Elementos de la POO
! 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
6/20/11
2
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?
Cocina
No hay café
Tienda
Comprar café
Café
Buscar el café
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
6/20/11
3
Otros conceptos importantes
! Encapsulamiento
! Polimorfismo
! Herencia
! … Se verán más adelante
UML
! 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
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
6/20/11
4
Atributos
! Describen el estado interno de cada objeto concreto
! Pueden ser: ! Tipos básicos (int, bool, char, etc.)
! Arrays de elementos
! Punteros
! Otros objetos
Métodos
! Definen el comportamiento de los objetos de una clase
! Devuelven (o no) un resultado
! Pueden necesitar parámetros
Métodos y atributos
• Atributos • raza: Bulldog • edad: 1 año • nombre: “Pancho” • …
• Métodos • ladra() • come() • duerme() • …
Especificación e Implementación
! 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
6/20/11
5
Especificación (archivo *.h)
class Perro !
{!
int anyos;!
!
int edad();!
};!
Perro.h
Atributos
Métodos
Implementación (archivo *.cpp)
#include “Perro.h”!
int Perro::edad() !
{!
return anyos;!
}!
!
Perro.cpp
Ejercicio ! Añada el método ladra a la clase Perro para que imprima
el mensaje “GUAU” cuando sea llamado
class Perro !
{!
int anyos;!
int edad();!
};!
Perro.h !
#include “Perro.h”!
int Perro::edad() !
{!
return anyos;!
}!
!
Perro.cpp
Compilar!
g++ -c Perro.cpp!
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
6/20/11
6
Visibilidad/Control de acceso
class Perro !
{!
int anyos;!
public:!
void ladra();!
private:!
int edad();!
};!
! 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
Métodos habituales: Constructor
! 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
class Perro !
{!
int anyos;!
public:!
Perro(int an);!
…!
};!
#include “Perro.h”!
!
!
Perro::Perro(int an) !
{!
anyos = an;!
}!
…!
!
Perro.cpp Perro.h
Métodos habituales: Constructor
! Existe sobrecarga (distintos parámetros)
class Perro !
{!
enum Color {MARRON, NEGRO};!
int anyos;!
Color color;!
public:!
Perro(int an);!
Perro(int an, Color col); !
…!
};!
#include “Perro.h”!
Perro::Perro(int an) !
{!
anyos = an;!
color = MARRON;!
}!
Perro::Perro(int an, Color col) {!
anyos = an;!
color = col;!
}!
!
6/20/11
7
Métodos habituales: Constructor
! Existe sobrecarga (distintos parámetros)
class Perro !
{!
enum Color {MARRON, NEGRO};!
int anyos;!
Color color;!
public:!
Perro(int an);!
Perro(int an, Color col); !
…!
};!
#include “Perro.h”!
Perro::Perro(int an) !
{!
Perro(an,MARRON);!
}!
Perro::Perro(int an, Color col) {!
anyos = an;!
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
! ¿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)
Métodos habituales: Destructor
! 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
6/20/11
8
Métodos habituales: Destructor
class Perro !
{!
…!
~Perro();!
…!
};!
#include “Perro.h”!
!
Perro::~Perro() !
{!
…!
}!
…!
!
Perro.cpp Perro.h
Métodos habituales: Get/Set
! 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
class Perro !
{!
int anyos;!
int getAnyos();!
void setAnyos(int valor);!
…!
};!
#include “Perro.h”!
int Perro::getAnyos()!
{!
return anyos;!
}!
void setAnyos(int valor)!
{!
anyos = valor;!
}!
!
Perro.cpp Perro.h
Asignació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;? ¿Perro c = b;?
6/20/11
9
Asignació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)
Comparación de objetos
! ¿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
! 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)
Creación de objetos
! 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!
6/20/11
10
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
Recommended