Вы находитесь на странице: 1из 25
PROGRAMACIÓN ORIENTADA A OBJETOS Clase 4: Trabajando con clases 1

PROGRAMACIÓN ORIENTADA A OBJETOS

PROGRAMACIÓN ORIENTADA A OBJETOS Clase 4: Trabajando con clases 1

Clase 4: Trabajando con clases

1

Contenido  Objetos miembro de una clase  Acceso a un dato miembro privado 

Contenido

Objetos miembro de una clase

Acceso a un dato miembro privado

miembro de una clase  Acceso a un dato miembro privado  Clases en ficheros de

Clases en ficheros de cabecera

Miembros static de una clase

Punteros a miembros de una clase

Arrays de objetos y punteros a objetos

Funciones amigas de una clase

Función amiga perteneciente a otra clase

Clase amiga de otra clase

Bibliografía ( para este tema ):

Francisco Javier Ceballos. “Programación orientada a objetos con C++”, 3ra Edición, Editorial Rama.

2

Objetos miembro de una clase  Una clase puede contener:  Un objeto de otra

Objetos miembro de una clase

Una clase puede contener:

Un objeto de otra clase

 Una clase puede contener:  Un objeto de otra clase  Un puntero a un

Un puntero a un objeto de su misma u otra clase

Ejemplo: la clase Persona

Una persona tiene: nombre, direccion y fecha de nacimiento

La fecha de nac. puede ser un objeto de otra clase

La clase Persona podría ser class CPersona

{

private:

char *pNombre; char *pDirección; CFecha obFechaNacimiento;

};

3

Objetos miembro de una clase (cont.)  Cuando se crea un objeto de CPersona primero

Objetos miembro de una clase (cont.)

Cuando se crea un objeto de CPersona primero se llama al constructor de CFecha y después el de CPersona

se llama al constructor de CFecha y después el de CPersona  ¿Cómo queda el constructor

¿Cómo queda el constructor de CPersona? CPersona (char *= 0, char *=0, int = 1, int = 1, int = 1997)

¿Cómo queda la definición?

CPersona::CPersona( char *nom,char *dir,int dd,int mm,int aa ):

obFechaNacimiento( dd, mm, aa ) // llama al constructor CFecha

{

pNombre = AsignarCadena(nom); pDireccion = AsignarCadena(dir);

}

¿Cómo se crea un objeto? CPersona persona(“Álvaro”, “León”,24,10,1978);

4

Acceso a un dato miembro privado  Un dato miembro privado sólo puede ser accedido

Acceso a un dato miembro privado

Un dato miembro privado sólo puede ser accedido por:

Funciones miembro de su clase

puede ser accedido por:  Funciones miembro de su clase  Funciones amigas  Las funciones

Funciones amigas

Las funciones miembro se declaran públicas

Por eso se les llama funciones de acceso

5

Clases en ficheros de cabecera  Se debe colocar la declaración de la clase y

Clases en ficheros de cabecera

Se debe colocar la declaración de la clase y la definición de las funciones inline en un archivo .h

y la definición de las funciones inline en un archivo .h  La definición del resto

La definición del resto de las funciones miembro se colocan en un fichero fuente .cpp

En el fichero fuente hay que incluir el fichero .h

El fichero .h debe contener las siguientes directrices:

#if !defined ( _NOMBRE_H ) #define _NOMBRE_H // contenido del fichero de cabecera (nombre.h) #endif

La función main() debe ubicarse en otro fichero .cpp (también se debe incluir en éste el fichero .h)

Se deben compilar ambos archivos .cpp, luego solamente se ejecuta el .cpp que contiene al main()

6

Miembros static de una clase  Dato static es un dato del cual sólo existe

Miembros static de una clase

Dato static

es un dato del cual sólo existe una copia la que es compartida por todos los objetos

existe una copia la que es compartida por todos los objetos  Características:  Puede ser

Características:

Puede ser privado, protegido o público

Debe ser inicializado a nivel global

Una función que intente acceder a él debe ser estática

Existe aunque no haya objetos

Ejemplo: la clase CFacturasClientes

#include <iostream.h> class CNumero { public:

static int n; CNumero () { n++; }; ~CNumero () { n--; };

};

7

Miembros static de una clase (cont.) int CNumero::n=0; int main () { CNumero a; CNumero

Miembros static de una clase (cont.)

int CNumero::n=0;

Miembros static de una clase (cont.) int CNumero::n=0; int main () { CNumero a; CNumero b[5];

int main () { CNumero a; CNumero b[5]; CNumero * c = new CNumero; cout << a.n << endl; delete c; cout << CNumero::n << endl; return 0;

}

Es necesario inicializar los datos miembros estáticos

Las funciones miembro declaradas static no pueden acceder a los miembros no estáticos de los objetos

8

Miembros static de una clase (cont.) #include <iostream.h> #include <string.h> #include <crtdbg.h>

Miembros static de una clase (cont.)

#include <iostream.h> #include <string.h> #include <crtdbg.h> class Libro

{

private:

static char *editorial; char titulo[40]; int num_pag; float precio; public:

char titulo[40]; int num_pag; float precio; public: Libro(); ~Libro(); void Set_Datos(char *, int, float); void

Libro(); ~Libro(); void Set_Datos(char *, int, float); void Imprimir(); static void CambiarEditorial(char *);

};

9

Miembros static de una clase (cont.) Libro::Libro() { cout<<"Constructor invocado"<<endl;

Miembros static de una clase (cont.)

Libro::Libro() { cout<<"Constructor invocado"<<endl; editorial = new char [40]; strcpy(editorial, "Rama"); strcpy(this->titulo, ""); this->num_pag = 0; this->precio = 0;

}

""); this->num_pag = 0; this->precio = 0; } Libro::~Libro() { delete editorial;

Libro::~Libro() { delete editorial; cout<<"Destructor invocado"<<endl;

}

10

Miembros static de una clase (cont.) void Libro::Set_Datos(char *t, int n, float p) { strcpy(this->titulo,

Miembros static de una clase (cont.)

void Libro::Set_Datos(char *t, int n, float p) { strcpy(this->titulo, t); this->num_pag = n; this->precio = p;

}

void Libro::Imprimir() { cout<<"Editorial: " << this->editorial << endl; cout<<"Titulo: " << this->titulo << endl; cout<<"No. de pagina: "<< this->num_pag << endl; cout<<"Precio: " << this->precio << endl;

}

void Libro::CambiarEditorial(char *e) { delete editorial; editorial = new char [strlen(e)+1]; strcpy(editorial, e);

}

} void Libro::CambiarEditorial(char *e) { delete editorial; editorial = new char [strlen(e)+1]; strcpy(editorial, e); } 11

11

Miembros static de una clase (cont.) char *Libro::editorial = NULL; void main() { " <<

Miembros static de una clase (cont.)

char *Libro::editorial = NULL;

void main()

{

" << endl; " << endl;
"
<< endl;
" << endl;

{

Libro l1; l1.Set_Datos("C++", 650, 300);

l1.Imprimir();

Libro::CambiarEditorial("McGrawHill");

l1.Imprimir();

}

if (_CrtDumpMemoryLeaks()) cerr<<"Hay lagunas de memoria else cout<<"No hay lagunas de memoria

}

12

Punteros a miembros de una clase Punteros a funciones miembro  Para acceder a la

Punteros a miembros de una clase

Punteros a funciones miembro

Para acceder a la dirección de una función miembro el puntero tiene que ser del mismo tipo que la función miembro. Ejemplo:

que ser del mismo tipo que la función miembro. Ejemplo: class CNotas { private: float nota;

class CNotas

{

private:

float nota; public:

typedef void (CNotas::*pfnm)(float); pfnm p = &CNotas::AsignarNota;

CNotas Alumno; CNotas *pAlumno = new CNotas; float nota;

CNotas(float n=0):Nota(n){}; void AsignarNota(float n) float ObtenerNota();

(Alumno.*p) (nota); (pAlumno->*p)(nota);

};

13

Punteros a miembros de una clase (cont.) Punteros a datos miembro class CNotas float CNotas::ObtenerNota()

Punteros a miembros de una clase (cont.)

Punteros a datos miembro

class CNotas float CNotas::ObtenerNota() { { private: float CNotas::*pn=&CNotas::nota; float nota; public:
class CNotas
float CNotas::ObtenerNota()
{
{
private:
float CNotas::*pn=&CNotas::nota;
float nota;
public:
cout<<“Nota: ”<<this->*pn;
return this->*pn;
CNotas(float n=0):Nota(n){};
void AsignarNota(float n)
float ObtenerNota();
}
};

14

Punteros a miembros de una clase (cont.) #include<iostream.h> using namespace std; class clase { public:

Punteros a miembros de una clase (cont.)

#include<iostream.h> using namespace std;

(cont.) #include<iostream.h> using namespace std; class clase { public: clase (int a, int b) : x(a),

class clase { public:

clase (int a, int b) : x(a), y(b) { }

public:

int x;

int y;

};

int main() { clase uno (6, 10); clase *dos = new clase (88,99); int clase::*puntero;

15

Punteros a miembros de una clase (cont.) } puntero = &clase::x; cout << uno.*puntero <<

Punteros a miembros de una clase (cont.)

}

puntero = &clase::x; cout << uno.*puntero << endl; cout << dos->*puntero << endl;

endl; cout << dos->*puntero << endl; puntero = &clase::y; cout << uno.*puntero

puntero = &clase::y; cout << uno.*puntero << endl; cout << dos->*puntero << endl;

delete dos;

cin.get();

return 0;

16

Punteros a miembros de una clase (cont.) #include<iostream.h> using namespace std; class clase { public:

Punteros a miembros de una clase (cont.)

#include<iostream.h> using namespace std;

(cont.) #include<iostream.h> using namespace std; class clase { public: clase (int a, int b) : x

class clase { public:

clase (int a, int b) : x (a), y (b) { } int funcion (int a) { if (0 == a) return x; else return y;

}

private:

int x;

int y;

};

17

Punteros a miembros de una clase (cont.) int main() { clase uno (6, 10); clase

Punteros a miembros de una clase (cont.)

int main() { clase uno (6, 10); clase *dos = new clase (88, 99); int (clase::*pfun) (int);

clase *dos = new clase (88, 99); int (clase::*pfun) (int); pfun = &clase::funcion; cout<< (uno.*pfun) (0)

pfun = &clase::funcion;

cout<< (uno.*pfun) (0) << endl; cout<< (uno.*pfun) (1) << endl; cout<< (dos->*pfun) (0) << endl; cout<< (dos->*pfun) (1) << endl;

delete dos;

cin.get();

return 0;

}

18

Arrays de objetos y punteros a objetos  Se puede declarar un array de objetos:

Arrays de objetos y punteros a objetos

Se puede declarar un array de objetos:

CFacturasClientes Clientes[100];

un array de objetos: CFacturasClientes Clientes[100];  El constructor no debe tener argumentos o tenerlos por

El constructor no debe tener argumentos o tenerlos por omisión

Cuando el array es declarado se llama al constructor 100 veces

También se puede construir un array dinámico:

CFacturasClientes *pClientes;

pClientes = new CFacturasClientes[10];

for (i=0; i<10; i++) pClientes[i].AsignarCliente(NombreCliente);

delete [] pClientes;

19

Funciones amigas de una clase  Función Friend Una función amiga de una clase puede

Funciones amigas de una clase

Función Friend

Una función amiga de una clase puede

acceder a los datos miembro privados y protegidos de la clase

a los datos miembro privados y protegidos de la clase // “Ver” es amiga de la

// “Ver” es amiga de la clase A

Una función amiga es una función externa a la clase

Ejemplo:

#include<iostream.h> using namespace std;

class A { public:

A (int i=0) : a (i) { } void Ver() { cout << a << endl; } private:

int a;

friend void Ver(A);

};

20

Funciones amigas de una clase void Ver(A Xa) { // La función Ver puede acceder

Funciones amigas de una clase

void Ver(A Xa) { // La función Ver puede acceder a miembros privados de la // clase A, ya que ha sido declarada amiga de A cout << Xa.a << endl;

}

int main()

{

A Na(10);

Ver (Na);

Na.Ver();

cin.get();

return 0;

}

amiga de A cout << Xa.a << endl; } int main() { A Na(10); Ver (Na);

21

Funcion amiga perteneciente a otra clase #include<iostream.h> using namespace std; class A; class B {

Funcion amiga perteneciente a otra clase

#include<iostream.h> using namespace std; class A;

class B { public:

// Compara b con a
// Compara b con a

// Declaración previa (forward)

B (int i=0) : b (i) { }

void Ver() { cout << b << endl; }

bool EsMayor(A Xa); private:

int b;

};

class A { public:

A(int i=0) : a (i) { } void Ver() { cout << a << endl; }

22

Funcion amiga perteneciente a otra clase private: // Función amiga tiene acceso a miembros //

Funcion amiga perteneciente a otra clase

private:

// Función amiga tiene acceso a miembros

clase private: // Función amiga tiene acceso a miembros // privados de la clase A friend

// privados de la clase A friend bool B::EsMayor(A Xa); int a;

};

bool B::EsMayor(A Xa) {

return b > Xa.a;

}

void main()

{

A Na(10);

B Nb(12);

Na.Ver();

Nb.Ver();

if (Nb.EsMayor(Na)) cout << “Nb es mayor que Na” << endl; else “Nb no es mayor que Na” << endl;

}

23

Clase amiga de otra clase #include <iostream.h> class CCuadrado; class CRectangulo { int ancho, alto;

Clase amiga de otra clase

#include <iostream.h> class CCuadrado; class CRectangulo { int ancho, alto; public:

CCuadrado; class CRectangulo { int ancho, alto; public: int area (void) {return (ancho * alto);} void

int area (void) {return (ancho * alto);} void convertir (CCuadrado a);

}; class CCuadrado { private:

int lado; public:

void set_lado (int a) {lado = a;} friend class CRectangulo;

};

24

Clase amiga de otra clase void CRectangulo::convertir (CCuadrado a) { ancho = a.lado; alto =

Clase amiga de otra clase

void CRectangulo::convertir (CCuadrado a) { ancho = a.lado; alto = a.lado;

}

(CCuadrado a) { ancho = a.lado; alto = a.lado; } int main () { CCuadrado c;

int main () { CCuadrado c; CRectangulo r;

c.set_lado(4);

r.convertir(c); cout << r.area(); return 0;

}

25