1
Objetos
Tres elementos esenciales de la programación orientada a objetos
AbstracciónHerenciaPolimorfismo
Objetos
Modelado en objetos
importancia del diagrama de clases:– es el diagrama esencial para UML– es el depositorio central de la información acerca
del sistema– refleja el mundo real y la visión que se tiene acerca
de él– es menos dependiente de detalles que el MDF y que
los diagramas dinámicos– posee estabilidad con la evolución– organiza el mundo real en elementos manejables
casos de uso en el modelado en objetos
Dr. Deni Torres Román:Dr. Deni Torres Román:
2
Tareas para el modelado en objetosrecopilación de información: casos de usodefinir diagrama de contexto: actores-sistemaidentificar candidatos a objetos: sustantivos en los casos de usoseleccionar clases:eliminar redundancia, vaguedad,irrelevancia; atributos, operaciones, roles; eventos; lo no perteneciente al mundo realcrear diagrama de clasesidentificar relaciones: agregación, dependencia, herencia, asociación reflexivadeterminar atributos y operacionesrefinar el modelo para herencia: jerarquíaprobar el modelo: casos de uso, diccionario del modelo
Objetos
Empaquetamientosistemas grandes necesitan ser particionados para lograr visibilidad y manejar la complejidadagrupamiento de objetos ayuda a crear diferentes niveles de abstracciónun sistema es una colección de paquetesun paquete es un agrupamiento lógico de elementos del modelo ( clases , casos de uso,procesadores,...) con alta cohesión y bajo acoplamientoun paquete puede ser descompuesto en otrosun paquete puede ser visto como un subsistema o un móduloEjemplos:
3
Objetos
Operador de referencia &una referencia es un aliasnecesita, a diferencia de un puntero, ser siempreinicializadauna referencia contiene una dirección pero se comporta como un valorEjemplo– int valor = 50;– int &refValor = valor; //declaración de la referencia– int &refValor2; //ERROR en “ “ “– refValor +=5; //valor = 55– int otroValor = refValor; // otroValor = 55– int *ptr = &refValor; // incializa al puntero
// con la dirección de valor
Llamadas por valor, puntero y referencia
void Cambio (int a, int b) {int local = a;a = b;b = local;} //Cambio (x, y);
void Cambio (int *pa, int *pb) {int local = *pa;*pa = *pb;*pb = local;} //Cambio (&x, &y);
void Cambio (int &a, int &b) {int local = a;a = b;b = local;} //Cambio (x, y);
4
Objetos
Operador de resolución de ámbito ::
Ejemplo#include <iostream.h>int a;void main() {
float a = 1.5;::a = 5;cout<<“local a”<< a <<endl;cout<<“global a”<< ::a <<endl;
}::variable permite el acceso a un elemento oculto en el
ámbito actual
Objetos
Estructura específica de los datos de una clase
class NombreDeLaClase {private:
int datoInt;char* chPtr;
protected:object* objectPtr;
public:struct nombreStructure;
};características de cada tipo de dato
5
Objetos
Estructura específica de las funciones miembros de una clase
ret NombreDeLaClase::NombreDelMetodo{
cuerpo //código}
las funciones miembros o métodos pueden ser también private, protected y publiclas funciones miembros pueden ser: modificadoras,selectoras e iteradorasmétodos selectores– ret NombreDelMetodo const;
Dr. Deni Torres Román:Dr. Deni Torres Román:
Objetos
La biblioteca iostream
iostream vs stdiocout y cin objetos que permiten mediante el operador <<(>>) la salida o entrada de datosobjetos flujos de datosEjemplos– cout<<“imprime un entero”<<15<<endl;– cout<<“imprime un flotante”<<15.25<<endl;– cout<<“imprime un letrero”<<endl;– cout<<“imprime un hexadecimal”<<0xA5<<endl;
Diferencias entre cout y printf
6
Objetos
Asignación dinámica de memoria newEn C existen las funciones malloc() y free()En C++ new asigna memoria dinámica– new tipo; // asigna un solo elemento– new tipo [ ]; // asigna un arreglo de elementos
Ejemplosint n;char* s;cin>>n;int *p = new int;s = new char [n];Point *p1= new Point(...);
Objetos
Liberación dinámica de memoria delete
En C existe la función free()En C++ delete libera memoria dinámica– delete dirección; // libera un espacio
// previamente asignado por new– delete[n] dirección; // idem para un arreglo de
// elementosEjemplosdelete p;delete [ ] s;delete p1;
7
Objetos
Ventajas de new y delete
new conoce cuanta memoria se le asigna a cada variable, pero malloc( ) no,new invoca al constructor del objeto, mientras que malloc( ) no puede,delete invoca al destructor y libera memoria.siempre que use un new debe emplear en la parte correspondiente un delete para liberar memoria, p.e. constructor/destructor
Objetos
Funciones inline
el compilador genera el código cada vez que encuentra esta función, es más segura que #define#define cuadrado (x) x*x– errónea si x= a+b
sólo tiene sentido para funciones de código pequeño,aumenta la eficiencia del programa,no deben definirse donde se hace la definición de la clase, porque allí no debe haber código,Sintaxis– inline ret NombreDeFunción ( args ) { }
8
Objetos
Declaraciones y definiciones en un archivo.h
definiciones de tipodefiniciones de funcionesdeclaraciones de datosincludesmacro-definicionescomentariosdeclaraciones de clases
struct point {...}extern int strlength(...)
extern int a;#include <signal.h>#define ..../*...*/ //class clase {...};
Objetos
Herencia y reusabilidad
creación de clases a partir de otras para extender y reusar el código– los objetos pueden construirse de modo
incremental a partir de otros objetos y pueden compartir código y estructuras de datos
– los algoritmos generales se pueden escribir de modo que se puedan reusar para nuevos tipos de objetos
organización jerárquicarepresentación del polimorfismo
Dr. Deni Torres Román:Dr. Deni Torres Román:
9
Clases base y derivadas
clases con similares atributos y operaciones pueden organizarse jerárquicamentela clase situada arriba de otras es base osuperclase de las de abajo la clase situada abajo de otras es derivada o subclase
ANIMAL
Generalización
Definición– proceso de extracción de todos los atributos y
operaciones comunes en un conjunto de clases para crear una clase base o superclase
Ejemplo– atributos: tipo, modelo, capacidad,...– operaciones: arrancar, parar, acelerar,...
VEHICULO
10
Objetos
Especialización
Definición– proceso de refinamiento de clases en subclases
o clases derivadas que heredan atributos y operaciones de la clase base o superclase
Ejemplo
Terrestre Acuático
Atributo extra: Número de ruedas
Operación extra: flotar
Objetos
Concepto de herencia simple
Clase Derivada 1
Clase Base
Clase Derivada 2
Clase BaseClase Base
11
Especificadores de acceso
class B : public class A {};los miembros public y protected de A pasan de igual forma a Bclass B : private class A {};los miembros public y protected de A pasan en forma private a Bclass B : protected class A {};los miembros public y protected de A pasan en forma protected a B
Objetos
Elementos en la herencia (I)
private
protected
public
private A
protected A
public A
private B
protected B
public B
A
B
12
Objetos
Elementos en la herencia (II)
B hereda las funciones de AB hereda los datos de Alas funciones propias de B no tienen acceso a los miembros private de A
Objetos
Concepto de herencia múltiple
Clase A Clase B
Clase Derivada AB
13
Objetos
Relaciones multiniveles de herencia entre clases
Clase A
Clase B Clase C
Clase D Clase E
Objetos
Elementos que no se heredan
constructoresdestructoresfunciones friendfunciones staticdatos staticoperador de asignación =
14
Objetos
Conversiones de herencia
un objeto de una clase derivada se convierte implícitamente en un objeto de una clase base pública,una referencia a una clase derivada se convierte implícitamente en una referencia a una clase base pública,un puntero a una clase derivada se convierte implícitamente en un puntero a una clase base pública.
Dr. Deni Torres Román:Dr. Deni Torres Román:
Objetos
Polimorfismo
Sobrecarga de funcionesSobrecarga de operadoresFunciones virtualesFunciones virtuales puras
15
Objetos
Polimorfismo (I)
una operación que puede tener más de un método es denominada polimórficauna operación se dice polimórfica si se comporta de forma diferente sobre clases diferentes la lista de argumentos, el tipo de retorno asociados con una operación constituyen el formato o signatura de la operaciónlas operaciones polimórficas tienen el mismo nombre, la misma intención lógica y la misma signaturalas operaciones polimórficas tienen o pueden tener código diferente en clases diferentes
Polimorfismo (II)
objetos de clases diferentes responden a un mismo mensaje u operación de forma también diferente– objetos de las clases circulo, triángulo, rectángulo,
derivados de la clase forma, pueden responder a la función área() de forma diferente
característica esencial del polimorfismo es que se puedan invocar funciones sin preocuparnos sobre qué tipo de objeto son invocadasconstrucción de estructuras heterogéneas de objetos debido a que un puntero a una clase base puede apuntar a cual objeto de clases derivadasel polimorfismo se implementa con funciones denominadas virtuales
16
Objetos
Sobrecarga de funciones: polimorfismo
¿Qué es una función sobrecargada?Ejemplos– int suma (int a, int b);– string suma (string a, string b);
Las funciones sobrecargadas tienen:– el mismo nombre,– un número diferente de argumentos,– diferentes tipos de argumentos,– ambas cosas
Las funciones sobrecargadas pueden ser normales o miembros de una clase
Objetos
Ventajas de la sobrecarga de funciones
uso del polimorfismo,menor número de nombres de funciones,sintaxis más clara,el compilador hace mucho de nuestro trabajo,enlace dinámico con funciones virtuales, llamadas en tiempo de ejecución.
Dr. Deni Torres Román:Dr. Deni Torres Román:
17
Objetos
Sobrecarga de operadoresen C++ significados de +:– suma de dos enteros– suma de dos reales
si a y b son dos objetos definidos por el usuario, ¿será o no posible definir las operaciones de:– a = a + b;– a = a*b; ?
la sobrecarga permite la validez de las expresiones anteriores. Con el operador +sobrecargado podríamos formar una cadena a partir de otras, p.e.– “Guadalajara” + “es la capital” + “de Jalisco.”
tipos de operadores:– unarios– binarios
Objetos
Restricciones en los operadores sobrecargados de C++
se pueden sobrecargar sólo los operadores definidos en C++; no se pueden construir nuevos operadoresla sobrecarga tiene validez sólo con objetos de la clase donde el operador está definidono se puede cambiar la preferencia o asociatividadde los operadores en C++no se puede cambiar un operador binario para que funcione como uno unario y viceversano se puede sobrecargar un operador que funcione exclusivamente con punterosla sobrecarga de ++ y -- no diferencia, en principio, pre- o postincremento
18
Sintaxis general de operatorfunción miembro o método de la clase– class unTipo {
private: atributospublic:
unTipo operator <op> (lista de argumentos);....
};implementación del método o función miembro– unTipo unTipo::operator <op> (lista de argumentos)
{cuerpo de la función
}al menos un operando debe ser un tipo definido por el usuario, p.e. unTipoun operando puede ser un tipo básico
Sobrecarga de operadores binarios (I)
X1 + x2 se interpreta como– operator + ( x1, x2 ); // o como– x1.operator + ( x2 );
un operador unario se puede definir como:– una función miembro de un argumento– una función friend con dos argumentos
class Binario {public:
Binario operator <op> (Binario& );};Binario Binario::operator <op> (Binario& b ) {
cuerpo }
<op> puede ser +, *, -, /,...
19
Objetos
Sobrecarga de operadores binarios (II)Ejemplo:– class unaClase {
public:unaClase operator -(unaClase &t); // unaClase- unaClase unaClase operator -(int t); // unaClase- int
};– class unaClase {
private:int undato;
public:friend ostream& operator << ( ostream &, const unaClase & );};
ostream& operator << ( ostream &out, const unaClase &t ) {out << “Salida en pantalla “<<endl<<“ dato privado =“
<< t.undato <<endl; }
Objetos
Sobrecarga de operadores unarios
++ se interpreta como– operator ++ ( x ); // o como– x.operator ++ ( );
un operador unario se puede definir como:– una función miembro sin argumentos– una función friend con un argumento
Ejemplo– class unaClase {
public:unaClase& operator ++ ( void ); // ++unaClase
};– class unaClase {
public:friend unaClase& operator ++ ( unaClase& ); //++ unaClase
};
20
Objetos
Recomendaciones para sobrecargar los operadores
es responsabilidad del programador definir correctamente el significado de las funciones sobrecargadas, pues C++ no interpreta automáticamente el significado de un operador sobrecargadoC++ no deriva automáticamente el significado de un operador complejo, p.e.+=,no se puede cambiar la sintaxis de los operadores, p.e. + binario, ++ unariosólo se pueden sobrecargar los operadores indicados por C++no se puede cambiar la precedencia o prioridad de los operadores
Objetos
Ejemplos de sobrecargas de operadores válidas y no válidas
complejo operator + (complejo a, complejo b); //VALvoid contador::operator++ (contador c) //VAL{ }
char* operator + (char* a, char* b); //NO VALvoid operator@ (menu barra1, menu barra2); //NO VALmenu operator++ (menu barra1, menu barra2); //NO VAL
21
Objetos
Sobrecarga del operador de asignación =
el operador de asignación = puede sobrecargarse declarando una función miembroclass string {
string& operator = (string& str);
};
si el operador = no se define por el usuario en una clase, entonces el compilador lo crea pordefecto y realiza una asignación miembro a miembrox& x::operator = (const x& fuente){
cuerpo}
Objetos
Sobrecarga de los operadores de llamada a funciones ( ) y de subíndice [ ] y de flujo >> y <<
el operador ( ) puede emplearse para un tipo desubconjunto de la clase, p.e., un substring de la clase string– string string::operator( ) (int pos, int cont)
el operador [ ] puede emplearse para extraer elementos específicos de un objeto de la clase, p.e., un caracter de un objeto de la clase string– char& string::operator[] (int elem)
la sobrecarga de los operadores >> y << permite manipular además de los tipos de datospredefinidos, los tipos definidos por el usuario
22
El apuntador this
el llamado a funciones se realiza siempre mediante un objeto– objeto.funciónDeLaClase ( ); // o mediante un puntero– punteroObjeto-> funciónDeLaClase ( );– ¿cómo se realiza esto?– funciónDeLaClase ( this, argumentos );
en todo objeto existe un puntero al objeto llamado thisthis accesa a la dirección del propio objetothis permite accesar a los miembros del propio objeto– this ->nombreDeMiembro;
*this es el objeto total real, no modificable
Uso del thisalmacenar un puntero al objeto asociado con la invocación de una función miembrodevolver una referencia al objeto asociado con la invocación de una función miembroT& T::f (int a ) {códigoreturn *this;
}
hacer copias de un objetoreferenciar explícitamente a un miembro ocultocomo resultado de otra declaración – class X {– int longitud;– public:– X (int longitud){this -> longitud = longitud;}
como argumento de una función
23
Constructor de copiaDescripción– un constructor que crea un nuevo objeto a partir de uno
existente
Sintaxisclass Point {
int x, y;public:Point (int, int);Point (const Point&);...
};ImplementaciónPoint::Point (const Point& p) {
x=p.x;y =p.y; }
Constructor de copia por defecto
si no se incluye un constructor de copia el compilador crea uno automáticamenteconstructor de copia por defecto realiza las siguientes operaciones– void main() {– Point p1(1,2), p2(3,4), p3,;– Point p4(p2);
p4.x = p2.x; //FUNCIONA MUY BIENp4.y = p2.y; //SIN DEFINIRLO, ENTONCES?
si un dato fuera un puntero, p.e., entonces se copia la dirección del puntero de la derecha en el miembro de la izquierda– p4.ptr = p2.ptr;– LOS DOS APUNTAN AL MISMO LUGAR!!!
24
Objetos
Llamadas a los constructores de copia
inicialización de un objeto con otro de la misma clasecuando se tiene una función con un argumento siendo un objetocuando una función retorna un objetoRegla sobre el uso del constructor de copia– las clases con estructuras dinámicas de datos
deben tener bien definido un constructor de copia, pues los constructores de copia por defecto sólo generan una copia superficial y no una copia profunda
Dr. Deni Torres Román:Dr. Deni Torres Román:
Objetos
Inicialización de objetos en C++
Los datos o miembros de un objeto se inicializancon valoresla incialización se realiza en los constructoresformas de inicializar– incialización mediante
sentencias
lista de incialización
Ejemplo:class ObjetoIni {
string s:char* dato;ObjetoIni (const string&,const char* iniCh);
};ObjetoIni::ObjetoIni (const string& iniStr, const char* iniCh){
s = iniStr;dato = iniCh;}
ObjetoIni::ObjetoIni (const string& iniStr, const char*iniCh):s(iniStr, dato (iniCh){ }
25
Objetos
Uso del operador =Ejemplostring a(“Hola”);sttring b(“Nada”);a =b; // Ahora a contiene la expresión “Nada”– el compilador creó el =, pero es una copia superficial !!!
forma correcta de definirlostring& string::operator = (const string& s) {
if (this ==&s) return *this; // a==a CASO IDENTIDADdelete [ ]str; //BORRAR VIEJO CONTENIDOlong = s.long;if (s.str!=NULL){
str = new char [long+1]; //COPIAstrcpy (str, s.str);} //NUEVA
return *this;}
Enlace estático y dinámicoel enlace estático se realiza siempre que el compilador conoce con antelación el tipo de objeto– es rápida– es restrictiva
Ejemplo: switch (codigo) {– case ´A´: exit ();– case ´B´: mostrar ();
break; }
el enlace dinámico se realiza siempre que el compilador desconoce la posición a invocar hasta el tiempo de ejecución– alto grado de flexibilidad– más lento que el estático– uso de funciones virtuales mediante la palabra virtual
26
Sobre las funciones virtuales (I)las funciones miembros de una clase pueden ser virtualeslas funciones globales no pueden ser virtualeslos destructores de las clases que van a ser heredadas deben declararse virtual para que sean llamados por los destructores de las clases derivadas ¿para qué?el uso de funciones virtuales puras posee gran utilidad, ¿por qué?en el interior de un constructor/destructor las funciones virtuales se llaman en tiempo de compilación una clase con una función virtual pura es una clase abstracta
Sobre las funciones virtuales (II)la palabra clave virtual permite a una función ser definida en la clase base y en las clases derivadas bajo el mismo nombreuna función sólo necesita ser declarada virtual en la clase baselas funciones virtuales admiten los mismos argumentos, pero código diferente en clases también diferentesfunción virtual vacía– virtual void FuncionVacia ( ) { }
función virtual pura– virtual void FuncionPura ( ) = 0;
una función virtual pura no puede ser llamada en la clase baseuna función virtual pura sirve para declarar aquellas funciones cuya definición se pospone para las clases derivadas
27
Objetos
Sobre las funciones virtuales (III)los constructores no pueden ser virtualeslos destructores pueden y deben ser virtuales, lo cual permite que en una relación de herencia sean invocados todos los destructoresuna clase abstracta es aquella que tiene al menos una función virtual purauna clase abstracta sólo puede ser utilizada comoclase baseuna clase abstracta se diseña sólo para ser heredadalas clases abstractas son utilizadas sólo a través de punteros
Objetos
Polimorfismo en C++crear una jerarquía de objetos con operaciones definidas como funciones virtuales en la clase base– virtual float Area ( );
si la clase base es tal que no se puede realizar implementaciones de estas funciones, entonces son funciones virtuales puras– virtual float Area ( ) = 0;– virtual float Area ( ) const = 0;
hacer las implementaciones concretas en las clases derivadas; cada clase tiene una versión específica de la función virtualmanipular las instancias de las clases a través de una referencia o un puntero para provocar el enlace dinámico
28
Objetos
Problema
Diseñar y elaborar un programa que represente un reloj con hrs, min y segs y unoperator ++ que incremente el tiempo en segundos. Debe existir una clase base y clases derivadas para diferentes tipos de relojes. Manejarse además funciones virtuales.
Objetos
Casos de usocaracterísticas– es una interacción entre un usuario y el
sistema– captura alguna función visible al usuario– puede ser de distintos tamaños– satisface algún objetivo del usuario– organiza el sistema mediante actores y
sus objetivos– utilidad en el análisis, diseño y pruebas
29
Objetos
Casos de uso: partición del sistema
subconjuntos de los requerimientosdescripciones del comportamientogrupos de entidades comunicanteses fuente de las operaciones del sistemaconjuntos de escenarios potenciales
Objetos
Casos donde las funciones virtuales se llaman en tiempo de compilación y no en tiempo de
ejecución o corrida
cuando una función virtual es llamada mediante– objeto.FuncionVirtual ( ); //se le asocia la función actual
//de la clase baseen llamadas dentro de los constructores y destructores, porque los objetos no están completamente inicializadosEjemplo: