Programación Avanzada en C++ - · PDF file2008 © Luis Hernández...

Post on 07-Feb-2018

238 views 3 download

Transcript of Programación Avanzada en C++ - · PDF file2008 © Luis Hernández...

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