1 POO en C++: Sintaxis En el.h debe aparecer la declaración de la clase: class NombreClase {...
-
Upload
gertrudis-corpus -
Category
Documents
-
view
5 -
download
0
Transcript of 1 POO en C++: Sintaxis En el.h debe aparecer la declaración de la clase: class NombreClase {...
1
POO en C++: Sintaxis En el .h debe aparecer la declaración de la clase:
class NombreClase { private: // atributos y métodos privados public: // atributos y métodos públicos };
Podemos declarar métodos inline. El código aparece junto a la declaración. No hace falta especificar la palabra inline en presencia de métodos.
2
POO en C++: Sintaxis En el .cpp la implementación de los métodos que no sean
inline.
tipo NombreClase::nombreMetodo(lista parámetros){
//implementación del método
}
private: no accesible desde fuera de la implementación de la clase.
public: accesible desde fuera de la implementación de la clase.
3
POO en C++: Ejemplo
UTablaGlobos.hclass tTablaGlobos {private: int max; // dimensión del array dinámico tGlobo* tabla; // array dinámico int numGlobos; // número de globos del array .............. bool buscaPos(const tGlobo& g, int &pos) ;public: //constructora y destructora
......... // métodos
bool ponElem(const tGlobo& g) ; ........ };
4
POO en C++: Ejemplo
UTablaGlobos.cpp
bool tTablaGlobos::ponElem(const tGlobo& g){
......
}
.......
5
POO en C++: Constructoras Las constructoras sirven para inicializar los atributos de un
objeto. Su sintaxis es:NombreClase(lista parámetros);
La implementación puede ser inline o ir al .cpp:
NombreClase::NombreClase(lista parámetros){
// implementación de la constructora
}
6
POO en C++: Constructoras
La constructora por defecto (sin argumentos) cumple lo siguiente:
Si no existe ninguna otra constructora para la clase, existe una por defecto (aunque no esté definida) que inicializa los atributos de la clase.
Si existe alguna otra constructora definida, estamos obligados a definir la constructora por defecto si la queremos utilizar.
NOTA: Como norma a seguir definiremos siempre la constructora por defecto.
7
POO en C++: Ejemplo.h
tTablaGlobos(){ max=0; nGlobos=0; tabla=NULL;}tTablaGlobos(int nGlobos);
.cppvoid tTablaGlobos::tTablaGlobos(int nGlobos){max=nGlobos;numGlobos=0;if(max>0) tabla = new tGlobo[max];else tabla=NULL;}
8
POO en C++: constructoras
La constructora por copia realiza una copia de un objeto en el objeto actual (this).
NombreClase(const NombreClase& objeto);
Cada clase tiene una constructora de copia por defecto. Pero conviene que, siempre que queramos utilizarla, nos la definamos nosotros mismos.
9
POO en C++: Un ejemplo
tTablaGlobos(const tTablaGlobos& t){
numGlobos=t.numGlobos;
max=t.max;
if(max>0) tabla = new tGlobo[max];
else tabla=NULL;
for (int i=0; i<t.numGlobos; i++){
ponElem(t.tabla[i]);
}
}
10
POO en C++: constructoras La constructora por copia se ejecuta cuando se la invoca
directamente para crear un objeto o cuando se hace paso de parámetros por valor.
// t2 es un objeto de la clase tTablaGlobostTablaGlobos t1(t2);
void funcion(tTablaGlobos t2){....}
f(t1);
11
POO en C++: destructora Todas las clases deben llevar asociada una destructora que
destruya todo lo que la clase haya creado (con new).
~NombreClase();
Pueden ser inline o definirse el .cpp:
NombreClase::~NombreClase(){
// implementación
}
12
POO en C++: Un ejemplo.h~tTablaGlobos();
.cppvoid tTablaGlobos::~tTablaGlobos(){if (tabla!=NULL){ delete [] tabla; tabla=NULL; max=0; numGlobos=0;}}
13
POO en C++: Un ejemplo
class Racional{
private:
int num;
int den;
int mcd(int a, int b);
public:
// constructoras
Racional(int n=0, int d=1){num=n; den=d;};
Racional(const Racional& r){num=r.num; den=r.den;}
// destructora
~Racional(){num=0; den=1;}
14
POO en C++: Un ejemplo
// operaciones de consulta
int dameNumerador(){return num;};
int dameDenominador(){return den;};
// operaciones modificadoras
void simplifica();
void suma(const Racional& r); //this=this+r
void resta(const Racional& r); //this=this-r
void divide(const Racional& r); //this=this/r
void multiplica(const Racional& r); //this=this*r
};
15
POO en C++: Un ejemplo Podríamos tener la clase Racional como:
class RacionalP{ private: int* num; int* den; int mcd(int a, int b); public: // constructoras RacionalP(int n=0, int d=1){ num=new int; den=new int; *num=n; *den=d;}; RacionalP(const Racional& r){ num=new int;den=new int;*num=*(r.num);*den=*(r.den);}
16
POO en C++: Un ejemplo En este caso, la destructora tendría que ser:
// destructora
~RacionalP(){
delete num;
num=NULL;
delete den;
den=NULL;
}
17
Declaración y creación de objetos
Para declarar objetos: NombreClase obj;
Declara obj como objeto de la clase NombreClase y lo crea invocando a la constructora por defecto, i.e., se inicializan los argumentos de obj de acuerdo según indique la constructora por defecto.
NombreClase obj(argumentos);
Declara obj como objeto de la clase NombreClase y lo crea invocando a la constructora que encaje con los argumentos.
NombreClase* obj;
Declara un puntero obj a un objeto de la clase NombreClase. Para crearlo:
obj=new NombreClase(argumentos);
18
Declaración y creación de objetos
{Racional r1(3,5); // automática o estáticaRacional r2(4,3); // automática o estáticar1.suma(r2); // r1=r1+r2Racional* r3=new Racional(5,7); // dinámicaRacionalP r4(5,7); // automática o estáticar3->suma(r3); // MALr3->suma(r1);r3->suma(*r3);delete r3; // en otro caso BASURA!!r3=NULL;}
19
Declaración y creación de objetos
Al ejecutar delete sobre un puntero a un objeto, se invoca a la destructora del objeto, además de liberar la memoria ocupada por éste.
RacionalP* r = new RacionalP(2,3);
2
3
r
delete r;Invocamos a la destructora r
r
20
Constructora por copia
RacionalP* r1=new RacionalP(5,7);
RacionalP* r2=new RacionalP(*r1);
Racional* r3=new Racional(2,4);
Racional r4(*r3);
RacionalP r5(3,4);
RacionalP* r6=new RacionalP(r5);
delete r1;
r1=NULL;
delete r2;
r2=NULL; delete r3; r3=NULL; delete r6; r6=NULL;
21
Constructora por copia La constructora por copia se ejecuta siempre que sea
necesario hacer una copia del objeto, en particular cuando tenemos métodos cuyo parámetro es un objeto de la clase y es de entrada (no puntero).
void Racional::suma(const Racional& r);
Racional r(3,4);
Racional s(5,7);
r.suma(s); // no se hace copia
void Racional::suma(Racional r);
r.suma(s); // se hace copia
22
Constructora por copia
void RacionalP::suma(RacionalP* r);
racionalP* r=new RacionalP(2,3);
racionalP* s=new RacionalP(4,5);
r->suma(s); // no se hace copia