1 poo en c++: sintaxis en el.h debe aparecer la declaración de la clase: class nombreclase {...

22
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.

Upload: gertrudis-corpus

Post on 26-Jan-2015

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 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

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.

Page 2: 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

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.

Page 3: 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

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) ; ........ };

Page 4: 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

4

POO en C++: Ejemplo

UTablaGlobos.cpp

bool tTablaGlobos::ponElem(const tGlobo& g){

......

}

.......

Page 5: 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

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

}

Page 6: 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

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.

Page 7: 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

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;}

Page 8: 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

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.

Page 9: 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

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]);

}

}

Page 10: 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

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);

Page 11: 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

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

}

Page 12: 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

12

POO en C++: Un ejemplo.h~tTablaGlobos();

.cppvoid tTablaGlobos::~tTablaGlobos(){if (tabla!=NULL){ delete [] tabla; tabla=NULL; max=0; numGlobos=0;}}

Page 13: 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

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;}

Page 14: 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

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

};

Page 15: 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

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);}

Page 16: 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

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;

}

Page 17: 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

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);

Page 18: 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

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;}

Page 19: 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

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

Page 20: 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

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;

Page 21: 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

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

Page 22: 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

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