Upload
pandora
View
219
Download
0
Embed Size (px)
DESCRIPTION
Â
Citation preview
1Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Programación Avanzada en C++L. Hernández
2Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
ProgramaciónOrientada a Objetos
3Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Nuevas incorporaciones desde C
Espacio de utilización de una variable: se puede declarar variables en
cualquier parte del programa. variables globales
Acceso a variables ocultas.
4Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Nuevas incorporaciones desde C
Referencias Nombre alternativo para una variable u objeto
int i=1;int &x=i;
Las variables x e i se refieren al mismo espacio de memoria.
Se tienen que inicializar siempre. Se utilizan en pase de parámetros a funciones donde se
quiera modificar su contenido. Memoria dinámica:
new tipo[tamaño]; delete [] puntero;
5Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Nuevas incorporaciones desde C
Declaraciones de funciones Parámetros con valor por defecto. En funciones con varios parámetros:
• si el parámetro k-1 está definido por defecto, el parámetro k también tiene que estarlo.
Pase de parámetros por referencia.
6Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Nuevas incorporaciones desde C
Operadores E/S: operador extracción: >> operador inserción: << Stream de entrada estándar: cin Stream de salida estándar: cout
7Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Evolución hacia la POO
Objetivos de la evolución: Menor interconexión entre las partes de un programa. Ocultación de la información. Abstracción:
• que los componentes del S.W. sean lo más cercano posible a las ideas que componen el problema.
Re-utilización del código. Todos estos objetivos están relacionados, pero la
piedra angular es la ocultación de la información.
8Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Programación con procedimientos
El programa se divide en dos partes: Algoritmos Datos
La parte algorítmica se estructura en procedimientos. Beneficios:
Abstracción de operaciones. Extensión del lenguaje. Re-utilización del código.
Inconvenientes: No existe una clara estructuración de los datos que los
relacione con los procedimientos que los manejan. Indefensión ante varios problemas:
• No se garantiza el correcto estado de las estructuras de información.
• No hay independencia de representación.
9Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
FIFO: Programación con procedimientos No hay nada que impida que un programador haga un mal
uso de los datos. Ejemplo: confundir el uso de cola y cabeza.
No es posible garantizar que la cola se encuentra en un estado correcto.
¿Que sucede si un día queremos cambiar la estructura de los datos? Ejemplo: cambiar el vector de la cola por una lista enlazada.
• Tendría que re-escribir el programa. Realmente,¿qué parte del código es re-utilizable?.
10Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
FIFO: Ocultación de la información Cierta parte de los datos y funciones sólo será accesible desde
ciertas funciones. Si el interfaz está bien definido, el estado de la cola siempre es
correcto. Si se cambia la estructura interna de los datos sólo hay que
cambiar las funciones del interfaz. Re-utilización del código. Se aprovecha:
la estructura de datos las funciones que la manejan
Ocultación de la información = Encapsulamiento de los datos
11Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Formas de ocultación de la información
Módulos (Programación modular) Las funciones (procedimientos) y datos se agrupan en
diferentes ficheros (módulos). Para cada módulo se definen los procedimientos y datos
que se exportan. Sólo se puede acceder desde fuera del módulo a aquella
parte que ha sido exportada. Objetos (Programación orientada a objetos)
Un módulo se compone de dos partes: definición → Interfaz implementación → Código
de la interfaz y de la parte oculta.
12Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Programación modular
Aportaciones de la modularidad Descomposición de un problema complejo en módulos
más simples. Re-utilización de los módulos existentes para desarrollar
nuevo software. Independencia de la implementación. Ocultación de la información.
Limitaciones de la modularidad Ejemplo: Sólo puedo tener una cola en mi programa.
13Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Programación orientada a objetos
Los objetos son entidades que agrupan datos y procedimientos que operan sobre esos datos. modulo ≈ fichero objeto ≈ variable
Los objetos se caracterizan por tres propiedades: Estado Operaciones Identidad dentro del programa (=instanciación)
Una clase es la descripción de un conjunto de objetos similares. Los objetos son instancias de una clase.
Ejemplo: podemos definir la clase matriz y a partir de ella los objetos matriz1 y matriz2.
14Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Clases y objetos
Clase: Abstracción de un conjunto de objetos
caracterizados por las mismas propiedades y los mismos comportamientos.
Objeto: Abstracción capaz de responder a una petición
del servicio de mensaje.
Un objeto es una instancia de una clase. La clase contiene su comportamiento y sus
propiedades. El objeto puede crearse dinámicamente en el
transcurso de la ejecución de un programa.
15Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Objetos
El mensaje es el único medio de comunicación entre los objetos. Consiste en una petición explícita de una operación que
debe realizar el objeto Puede ser asociado a una llamada de procedimiento
16Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
El concepto de objeto
Objeto: Entidad de programación con componentes de dos tipos: Estado: Datos Comportamiento: Procedimientos que manipulan los
datos con exclusividad. Cada objeto posee un interfaz que contiene los
servicios que oferta al exterior.
17Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Programación orientada a objetos
Acceso convencional vs OO Comunicación entre objetos:
Un objeto pide un servicio a otro por medio de un mensaje: destinatario + operación + argumentos
18Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Globalidad vs Localidad Programación modular
Aquí los datos son globales, son accesibles desde todos los procedimientos.
Programación por objetos: Aquí los datos son locales a cada objeto. Sólo son accesibles para los procedimientos
(operaciones) definidos en el objeto.
19Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Clases y objetos
Clase vehiculo
Campos velocidad nombre precio cantidad
Métodos precioConIVA:
devolver (1,16*precio) darVelocidad:
devolver (velocidad) retirar(c):
cantidad cantidad c← añadir(c):
cantidad cantidad + c←
20Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Declaración de clases
Declaración de la clase Definición de las
funciones de la clase Instanciación de la clase
21Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Programa ejemplo: Pila
22Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Programa ejemplo: Pila
23Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Constructores y destructores Constructor
Función miembro de la clase que se ejecuta cuando se crea un objeto.
Podemos tener varios constructores en una clase, pero han de diferir en los parámetros.
Destructor Función miembro de la
clase que se ejecuta al final de la vida de cada objeto.
24Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Utilización de constructores
Utilización de constructores: Sin parámetros: A a; Con un parámetro: A a(5); ó A a=5; Con varios parámetros: A a(5,3);
Constructores por defecto: Constructor copia:
• Crea un objeto b2 donde los datos de b2 serán iguales a los de b1.
• Aunque no se defina el constructor copia, éste existe para que se puedan pasar objetos como parámetros por valor.
Constructor sin parámetros:• Aunque no se defina, éste existe para que se puedan
definir objetos de la clase (no ejecuta nada).
25Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Utilización de constructores Desaparición de constructores por defecto:
Constructor sin parámetros:• Desaparece cuando definimos cualquier otro constructor.
Constructor copia:• Desaparece cuando definimos un nuevo constructor copia.• Siempre hay un constructor copia, y solo uno, en cada
clase.
26Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Constructor copia
Definición Utilización
27Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Clases compuestas
Una clase donde algún dato miembro es un objeto de otra clase. ¿Cuál es el orden de construcción?
28Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Expansión inline
Evitar llamadas a funciones. El compilador simula el
pase de parámetros.
29Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Clases y funciones friend Funciones friend:
Una función ajena a la clase pueda acceder a la parte privada de la clase.
Clases friend: Todos los métodos de una clase puedan acceder a la
parte privada de otra clase.
30Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Distinguir entre: variables miembro de una clase otro tipo de variables.
Operador resolución de ámbito “::”
Calificación de variables miembro
31Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Palabra reservada this
Representa un puntero al objeto que recibe la llamada. Todos los objetos de todas las clases tienen this
como dato miembro.
32Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Variables de clase e instancia Variables de clase:
común a todos los objetos (instancias) de una clase. Variables de instancia:
propio de cada objeto (instancia) de la clase.
33Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Variables de clase e instancia
34Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Funciones de clase Funciones de clase:
Actúan sobre variables de clase. Sólo pueden actuar sobre las variables de instancia de la
propia clase cuando pertenecen a un objeto: • pasado como parámetro.• declarado dentro de la propia función.
35Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Punteros a objetos
Declaración de punteros a objetos de una clase. Utilización del operador new y delete:
Al ejecutarse el operador new, se llama al constructor de la clase automáticamente (malloc no lo hace).
delete llama al destructor (free no).
36Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Ejemplo de vectoresy punteros a objetos
37Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Herencia
38Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Herencia
Definir una nueva clase: como extensión de otra previamente definida. sin modificar la ya existente.
La nueva clase hereda de la clase anterior: las variables. las operaciones .
Principal objetivo/ventaja: Reutilización del código.
• Ahorro de esfuerzo.• Mayor confianza en el código.
39Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Organización jerárquica
40Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Herencia en POO
Una función recibe un objeto de la clase base.void Despedir (empleado);
Una función puede recibir objetos de la clase base y también de sus derivadas.empleado e;empleado_producción ep;empleado_comerciales ec;Despedir (e);Despedir (ep);Despedir (ec);
41Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Herencia de métodos y variables
Las clases derivadas reciben (=heredan) las variables y métodos de la clase base.Empleado_comercial ec;Empleado_produccion ep;ec.Cambiar_Sueldo();ep.Cambiar_Sueldo();
42Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Composición y herencia
Composición: Relación tener-un
Un coche tiene un motor Contener un objeto.
Herencia: Relación ser-un
Un coche es un vehículo Contener una clase.
43Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Ejemplos de composición y herencia
Clase persona y clase empleado. Herencia: un empleado es una persona.
Clase persona y clase domicilio. Composición: una persona tiene un domicilio.
Clase lista y clase nodo de la lista: Composición: una lista tiene un puntero de tipo nodo al
nodo que está en cabeza de la lista (tener-un). Clase empresa, clase empleado y clase jefe de grupo
de empleados. Herencia entre empleado y jefe.
• Un jefe es un empleado. Composición entre empresa y empleado o jefe.
• Una empresa puede tener una lista de empleados y otra de jefes.
• Por el principio de los subtipos, una empresa puede tener una única lista donde aparezcan tanto jefes como empleados.
44Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Ejemplo de herencia
45Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Ejemplo de herencia
Los miembros de la clase empleado se pueden utilizar en las clases derivadas tal y como si hubiesen sido definidos en éstas
46Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Modos de acceso
private Lo que es “private” en la clase base no es accesible en
la clase derivada. public
Lo que definimos como “public” es accesible desde cualquier parte.
protected Lo que definimos como “protected” en la clase base:
• es accesible en la clases derivadas• no es accesible fuera de las clases derivadas o base.
47Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Tipos de herencia public
los modos de acceso a los miembros de la clase base se quedan igual en la clase derivada.
protected los miembros “public” de la clase base pasan a ser
“protected”, el resto se queda igual. private
todos los miembros de la clase base pasan a ser “private” en la derivada.
48Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Redefinición de miembros
A veces, interesa cambiar en la subclase la definición de algo que está en la clase base. Lo redefinido no desaparece.
49Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Ejemplo de redefinición de miembros
50Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Herencia múltiple Una clase derivada hereda
las características de más de una clase base.
51Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Constructores y destructores
Construcción objeto clase derivada: Primero se construye la parte heredada de la clase(s)
base.• Se ejecutan los constructores de las clases base.
Por último se ejecuta el código del constructor de la clase derivada.
Destrucción objeto clase derivada: El proceso es a la inversa que en la construcción.
• Se ejecuta primero el destructor de la clase derivada y a continuación los de las clases base.
52Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Ejemplo de constructores y destructores
Constructores y destructores en la herencia
53Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Ejemplo de constructores y destructores
Constructores y destructores en clases compuestas y derivadas.
54Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Ejemplo de constructores y destructores
Llamadas a los constructores de las clases base.
55Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Ejemplo de constructores y destructores
56Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Ejemplo de constructores y destructores
57Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Clase base virtual
58Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Herencia virtual
Si una clase base virtual define constructores, debe proporcionar uno de estos dos constructores: un constructor sin parámetros un constructor que admita valores por defecto para todos
los parámetros. Las clases derivadas de una clase base virtual tienen
que ser definidas como herencia virtual.
59Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Ejemplo deHerencia virtual
60Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Punteros a clases derivadas
61Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Polimorfismo
62Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Polimorfismo
El polimorfismo se refiere al hecho de que una misma función adopte múltiples formas. Esto se consigue por medio de la sobrecarga:
Sobrecarga de funciones:• un mismo nombre de función para distintas funciones.
a = Sumar(c,d);a = Sumar(c);
Sobrecarga de operadores:• un mismo operador con distintas funcionalidades.• Ejemplo: Sobrecargar el operador + sobre la clase cadena
para que permita concatenar dos de estos objetos:entero1 = entero2 + 5;cadena1 = cadena2 + cadena3;
63Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Sobrecarga de constructores
Solo en caso de que no definamos ningún constructor, tenemos el constructor por defecto.
64Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Sobrecarga de funciones
Tenemos 2 funciones costructor string().
Tenemos 4 posibles llamadas a 4 funciones diferentes strcmp(): 3 en la clase. 1 en la librería “string.h” de C.
Tenemos 2 funciones strcpy() en la clase.
65Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Sobrecarga de funciones
En la sobrecarga de funciones se desarrollan distintas funciones con un mismo nombre pero distinto código. Las funciones que comparten un mismo nombre deben
tener una relación en cuanto a su funcionalidad. Aunque comparten el mismo nombre, deben tener
distintos parámetros de manera que el compilador pueda distinguir entre las distintas funciones cuando encuentra una llamada. Éstos pueden diferir en : número tipo orden
El tipo del valor de retorno de una función no es válido como distinción. Esto es debido a que ese valor en C++ no es necesario
que sea recogido por otro objeto.
66Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Ejemplo de sobrecarga de funciones
67Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Sobrecarga de operadores
Consiste en definir nuevas funcionalidades para los operadores definidos en el lenguaje. Se pueden sobrecargar prácticamente todos los
operadores del lenguaje: No podemos inventar nuevos operadores. No podemos re-definir funcionalidades de los
operadores que ya están definidas
68Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Sobrecarga de operadores
Al menos uno de los operandos del operador sobrecargado debe ser una clase definida por nosotros La sobrecarga de operadores es un caso particular de
la sobrecarga de funciones: el operando de la izquierda puede pasar a ser el
propietario de la función, o bien el primer argumento de la función.
69Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Sobrecarga de operadores
70Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Sobrecarga de operadores
Para cualquier clase que se defina, el compilador define el operador asignación “=“.
Cuando no me sirve, debo re-definirlo.
71Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Operador incremento y decremento
Tiene dos posibles notaciones: prefija: ++a postfija: a++
72Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Operador subíndice
Devolución de una referencia: Se debe devolver una referencia cuando queremos que
se pueda modificar el propio objeto que se devuelve.
73Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Operador subíndice
Ejemplo de utilización de índices dobles.
74Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Conversión de clases
Un constructor de Y que reciba X permite al compilador convertir objetos de la clase X en objetos de la clase Y.
75Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Operadores de conversión
Los constructores de una clase X: permiten definir qué otras clases pueden ser convertidas
en la clase X. Los operadores de conversión que se definen en una
clase X: permiten definir en qué otras clases se pueden convertir
la clase x.
76Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Operadores de conversión
77Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Ligadura dinámica Funciones virtuales:
Son una clase de sobrecarga de funciones, pero con la diferencia de:
• Sobrecarga de funciones: se decide que función se va a ejecutar en tiempo de compilación.
• Funciones virtuales: se decide en tiempo de ejecución (poliformismo en tiempo de ejecución).
78Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Ligadura dinámica
Se ejecutará la función muestra() de alumno o de profesor dependiendo de la clase de objeto a la que apunte p (ligadura dinámica, en tiempo de ejecución).
La función persona::muestra() no se ejecuta porque es virtual y ha sido substituida en cada clase derivada.
Si no se hubiera definido como virtual la función muestra() en la clase persona se ejecutaría siempre persona::muestra()
79Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Funciones virtuales
Cuando se define una función virtual: El prototipo debe ser el mismo en las clases base y derivadas.
Una función definida como virtual en una clase base: es virtual en todas sus clases derivadas, sea cual sea el nivel de
derivación. Puede ser re-definida o no en las clases derivada.
80Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Clases abstractas
No tiene mucho sentido: definir código a la función figura:area() existan objetos de la clase figura
Solución: Podemos definir la clase figura como una clase abstracta.
81Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Clases abstractas
Funciones virtuales puras: Las clases derivadas están obligadas a re-definirla.
82Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández
Destructor virtual