Publicado el 14 de Enero del 2017
1.828 visualizaciones desde el 14 de Enero del 2017
360,6 KB
118 paginas
Creado hace 15a (22/11/2009)
Tema 5: Programación Orientada
a Objetos en C++
Programación Orientada a Objetos
Curso 2009/2010
Begoña Moros Valle
Contenido
Introducción
Clases y Objetos en C++:
Módulos: Clases, estructuras y espacios de nombres
Semántica referencia (punteros) y operadores
Métodos y mensajes
Creación y destrucción de objetos
Genericidad (template)
Herencia en C++:
Tipos de herencia
Herencia y niveles de visibilidad
Herencia y creación
Redefinición de métodos
Conversión de tipos y consulta del tipo dinámico
Clases abstractas
Punteros a función
Herencia múltiple
Corrección y Robustez en C++: asertos y excepciones
POO en C++
Tema 5
2
Introducción
Creado por Bjarne Stroustrup en los 80.
Diseñado como una extensión de C que incluye
características orientadas a objetos.
Es un lenguaje híbrido.
Ha sido inspiración de lenguajes de programación
posteriores como Java y C#.
A finales de los 90 fue estandarizado: ISO C++
Las librerías del lenguaje son escasas. La librería más
notable es STL (Standard TemplateLibrary).
Actualmente, sigue siendo un lenguaje de programación
importante en algunos dominios.
Tema 5
POO en C++
3
Clases y Objetos en C++
Módulos en C++:
Clases
Estructuras (struct)
Espacios de nombres (namespace)
Semántica referencia
Semántica de los operadores “==“ e “=“
Métodos y mensajes
Creación y destrucción de objetos
Genericidad template
Tema 5
POO en C++
4
Especificación de la clase Cuenta
A diferencia de Java una clase se implementa en
ficheros separados para:
Definición de la interfaz de la clase (fichero cabecera)
La implementación Cuenta.cpp
Cuenta.h
Hay que incluir el fichero de cabecera en el fichero de
implementación y en los ficheros de las clases cliente
#include “Cuenta.h”
No tiene por qué existir correspondencia entre la
estructura física de un programa (organización de
ficheros fuente) y la estructura lógica (organización de
las clases).
Tema 5
POO en C++
5
Especificación de la clase Cuenta
Cuenta.h
Interfaz de la clase
cuenta
Banco.cpp
Cuenta.cpp
#include “Cuenta.h”
utiliza Cuenta
#include “Cuenta.h”
implementa Cuenta
Tema 5
POO en C++
6
Cuenta.h (1/2)
#include "Persona.h“
class Cuenta {
public:
void reintegro(double cantidad);
void ingreso(double cantidad);
double getSaldo() const;
Persona* getTitular() const;
double* getUltimasOperaciones(int n) const;
static int getNumeroCtas();
…
Tema 5
POO en C++
7
Cuenta.h (2/2)
private:
const static int MAX_OPERACIONES = 20;
const static double SALDO_MINIMO = 100;
Persona* titular;
double saldo;
int codigo;
static int ultimoCodigo;
double* ultimasOperaciones;
bool puedoSacar(double cantidad);
};
Tema 5
POO en C++
8
Cuenta.cpp
int Cuenta::ultimoCodigo = 0;
void Cuenta::reintegro(double cantidad){
if (puedoSacar(cantidad))
saldo = saldo - cantidad;
}
}
void Cuenta::ingreso(double cantidad){
saldo = saldo + cantidad;
}
bool Cuenta::puedoSacar(double cantidad){
return (saldo >= cantidad);
}
…
Tema 5
POO en C++
9
Clases en C++
(static) como de instancia (= Java).
Se pueden definir tanto atributos y métodos de clase
Palabra reservada const
Indica que un atributo es inmutable
Equivalente a atributos final en Java
const Persona* titular; puntero inmutable
Persona* const titular; objeto persona inmutable
Indica que la ejecución de una función no va a cambiar el
estado del objeto receptor de la llamada
En el fichero de implementación el nombre de los
métodos está calificado con la clase.
NombreClase::nombreMetodo
Tema 5
POO en C++
10
Niveles de visibilidad en C++
Especificación de acceso para un grupo de
miembros:
public: un cliente puede consultarlo y modificarlo
private: sólo accesible dentro de la clase
Opción por defecto
Se puede acceder a los campos privados de los objetos de
la misma clase como en Java
Clases amigas: Se le concede acceso TOTAL
a la clase amiga
La amistad no es hereditaria ni transitiva
Tema 5
POO en C++
11
Ejemplo: friend class
class NodoArbol {
friend class Arbol;
private:
class Arbol{
private:
int valor;
NodoArbol decha;
NodoArbol izda;
…
};
};
NodoArbol *raiz;
...
… raiz->valor = 50; ...
Tema 5
POO en C++
12
Concepto de estructura
Unidad modular heredada de C
en C++ se amplía con la definición de funciones
Totalmente equivalente al concepto de clase salvo:
Cambia la palabra class por struct
Por defecto todos los elementos son públicos salvo que se diga
lo contrario.
struct Cuenta{
void ingreso (double cantidad);
void reintrego (double cantidad);
private:
int codigo;
Persona* titular;
double saldo;
};
Tema 5
POO en C++
13
Espacio de nombres
El espacio de nombres (namespace) es un
mecanismo para agrupar un conjunto de
elementos (clases, enumerados, funciones,
etc.) relacionados
Es importante el orden de definición de los
elementos en el espacio de nombres
Puede estar definido en ficheros diferentes
Es un concepto diferente a los paquetes de
Java:
No hay relación entre la estructura lógica y física.
No proporcionan privilegio de visibilidad.
Tema 5
POO en C++
14
Espacio de nombres
Para utilizar un elemento definido en un espacio
de nombres:
Se utiliza el nombre calificado del elemento:
gestionCuentas::Cuenta
Se declara el uso del espacio de nombres:
using namespace gestionCuentas;
Tema 5
POO en C++
15
Espacio de nombres
En Cuenta.h
namespace gestionCuentas{
class Cuenta {
…
};
}
En Banco.h
namespace gestionCuentas{
class Banco {
…
};
}
Tema 5
POO en C++
16
Tipos del lenguaje
Tipos de datos primitivos:
byte, short, int, long,float, double,char,
bool, etc.
Enumerados:
Objetos embebidos:
enum {OPERATIVA, INMOVILIZADA, NUM_ROJOS};
Subobjetos
Punteros:
T* es el tipo “puntero a T”
Una variable de tipo T* puede contener la dirección
de un objeto de tipo T
Tema 5
POO en C++
17
Arrays en C++
Cuenta cuentas[10];
cuentas es un array de tamaño 10
No se asigna un valor inicial para cada posición
Cuenta* cuentas = new Cuenta[10];
Cuenta** cuentas = new Cuenta*[10];
cuentas es un ptro a un array de cuentas
cuentas es ptro a un array de punteros a Cuenta (= Java)
Las dos primeras declaraciones sólo funcionarían si la
clase Cuenta tuviera definido un constructor por defecto
No existe una función equivalente a length de Java
No se controla el acceso a posiciones fuera de los
límites del array.
Tema 5
POO en C++
18
Enumerados
Es un tipo que puede almacenar un conjunto de
valores
El enumerado define un conjunto de constantes
de tipo entero
Por defecto los valores se asignan de forma
creciente desde 0.
El tipo de cada uno de los elementos es el del
enumerado.
Un enumerado es un tipo, por lo que el usuario
puede definir sus propias operaciones.
Tema 5
POO en C++
19
Enumerados. Definición
namespace banco{
enum EstadoCuenta{
OPERATIVA, INMOVILIZADA, NUM_ROJOS
//OPERATIVA == 0, INMOVILIZADA == 1, NUM_ROJOS == 2
};
};
}
class Cuenta {
…
private:
…
EstadoCuenta estado;
Tema 5
POO en C++
20
Enumerados. Uso
En Cuenta.cpp
#include "Cuenta.h"
using namespace banco;
…
void Cuenta::reintegro(double cantidad){
if (estado!=INMOVILIZADA && puedoSacar(cantidad)){
saldo = saldo - cantidad;
}
}
Para referenciar un valor del enumerado no tiene que ir
precedido por el nombre del enumerado
Tema 5
POO en C++
21
Inicialización de los atributos
No se puede asignar un valor inicial a los
atributos en el momento de la declaración a
menos que sea una constante (const static)
Se considera definición y no declaración
A diferencia de Java, no podemos asegurar
que los atributos tengan un valor inicial
Solución Definición de constructores
Tema 5
POO en C++
22
Constructores
Método especial con el mismo nombre que la clase y
sin valor de retorno (= Java)
Se permite sobrecarga
Si no existe ningún constructor en
la clase el
compilador proporciona el constructor por defecto
class Cuenta {
public:
Cuenta (Persona *titular);
Cuenta (Persona *titular, double saldoInicial);
…
};
Tema 5
POO en C++
23
Constructores de la clase Cuenta
Cuenta::Cuenta (Persona *persona){
codigo = ++ultimoCodigo;
titular = persona;
saldo = SALDO_MINIMO;
ultimasOperaciones = new double[Cuenta::MAX_OPERACIONES];
numOperaciones = 0;
estado = OPERATIVA;
}
Cuenta::Cuenta (Persona *persona, double saldoInicial){
codigo = ++ultimoCodigo;
titular = persona;
saldo = saldoInicial;
ultimasOperaciones = new double[Cuenta::MAX_OPERACIONES];
numOperaciones = 0;
estado = OPERATIVA;
}
Tema 5
POO en C++
24
Sobrecarga de constructores
A diferencia de Java, this no se puede
utilizar como una función para reutilizar el
código de los constructores
Soluciones:
Utilizar un método privado al que se invoca desde
los constructores
Utilizar argumentos por defecto para los
construc
Comentarios de: Tema 5: Programación Orientada a Objetos en C++ (0)
No hay comentarios