programaciÓn orientada a objetos usando c++. 2 puntero this variable predefinida para todos los...

Post on 23-Jan-2016

220 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

PROGRAMACIÓN ORIENTADA A OBJETOS USANDO C++

2

Puntero this

Variable predefinida para todos los métodos de la clase (parámetro oculto)

Es un puntero al objeto sobre el cual está actuando el método (No es el objeto)

En la invocación de un método, el objeto es un parámetro implícito

El puntero this contiene la dirección del objeto que activó al método y No es posible modificarlo

3

Puntero this

La existencia del parámetro implícito permite referenciar directamente los atributos del objeto sin los operadores punto o flecha

Un método No puede referirse al objeto mismo como un todo, sino a cada una de sus partes

El puntero this permite referirse al objeto como tal *this

4

Puntero this

Las siguientes sentencias son equivalentes en el bloque del constructor por defecto de la clase Par

1. x = 0;2. this->x = 0;3. (*this).x = 0;

5

COMPOSICIÓNDE CLASES

6

Composición de clases

Se manifiesta como una relación de pertenencia (tiene-un)

Consiste en declarar objetos de una clase A como atributos de otra clase B

El constructor de la clase que contiene objetos de otras clases llamará a los correspondientes constructores

Un constructor por defecto de la clase llamará implícitamente a los constructores por defecto de los objetos declarados como atributos

7

Composición de clases

class Mixto {public:

Mixto();Fraccion Equivalente();float Equivalente();void Listar();

private:int ent;Fraccion f;

};

8

Composición de clases

class Curso {public:

Curso(int t=30);void Inscribir(Alumno&);void Listar();double Promedio();int Aprobados();int Reprobados();

private:int N;char nomCur[25];char codCur[7];Alumno v[50];

};

9

Composición de clases

Alumno::Alumno() {k = 0;t = 0;

}Alumno::Alumno(char *n, char *r, int m, int c) {

nom = new char[strlen(n)+1];rut = new char[strlen(r)+1];strcpy(nom, n);

strcpy(rut, r); mat = m; carrera = c; k = 0; t = 0;}

10

Composición de clases

Curso::Curso(int t) {N=t;

cin.getline(nomCur, 25); cin.getline(codCur, 7); char *x, *y; int z, c; for (int i=0; i<N; i++) {

cout << "NOMBRE: ";cin.getline(x, 20);

cout << "RUT : "; cin >> y; cout << "MAT : "; cin >> z; cout << "Carr : "; cin >> c; Alumno a(x, y, z, c); v[i] = a;}

}

11

Composición de clases

void Curso::Listar() {for (int i=0; i<N; i++)

v[i].Listar(); }

int main() {Curso C;

C.Listar(); return 0;}

12

PLANTILLASDE FUNCIONES

13

Plantillas de funciones

Constituyen un mecanismo para implementar funciones genéricas

template <class T><tipo> <nombre>(<parámetros>) {

//sentencias }

14

Plantillas de funciones

template <class T>void Swap(T &a , T &b) {

T aux; aux = a; a = b; b = aux;}

15

Plantillas de funciones

int main() {int r=5, s=7;

Swap(r, s) cout << r << s << endl; double x=1.1, y=3.3; Swap(x, y); cout << r << s << endl;

return 0;}

16

Plantillas de funciones

template <class T>void Crear(T v[], int n) {

for (int i=0; i<n; i++) cin >> v[i];}template <class T> {void Listar(T v[], int n)

for (int i=0; i<n; i++) cout << v[i];}

17

Plantillas de funciones

int main() {int V[5];

Crear(V, 5); Listar(V, 5); float X[4]; Crear(X, 4); Listar(X, 4); char C[6]; Crear(C, 6); Listar(C, 6);

return 0;}

18

PLANTILLASDE CLASES

19

Plantillas de clases

Constituyen un mecanismo para implementar clases genéricas

template<class T>class <nombre> {

private: // Métodos

// Atributos

public: // Métodos

// Atributos }

20

template <class T>class Vector { public: Vector(int n); ~Vector(); void setElem(T); void verVector(); private: T *v; int actual; int maximo;};

Plantillas de clases

21

Plantillas de clases

template <class T>Vector<T>::Vector(int n) { maximo = n; actual = 0; v = new T[maximo];}template <class T>Vector<T>::~Vector() { delete[] v;}

22

Plantillas de clases

template <class T>void Vector<T>::setElem(T e) { v[actual] = e; actual++; }template <class T>void Vector<T>::verVector() { int i; for(i=0; i<actual; i++) cout << " V[" << i << "] = " << v[i]; cout << endl;}

23

Plantillas de clases

int main(int argc, char *argv[]) { Vector<char> vB(8); // Vector de 8 caracteres

Vector<int> vI(6); // Vector de 6 enteros

Vector<float> vF(4); // Vector de 4 reales

int i; for(i=0; i<6; i++) vI.setElem(2*i+1);

cout << "Vector de enteros" << endl; vI.verVector();}

24

Plantillas de clases

template <class T, int maximo>class Vector { public: Vector(); ~Vector(); void setElem(T); void verVector(); private: T *v; int actual;};

25

Plantillas de clases

template <class T, int maximo>Vector<T, maximo>::Vector() { actual = 0; v = new T[maximo];}template <class T, int maximo>Vector<T, maximo>::~Vector() { delete[] v;}

26

Plantillas de clases

int main(int argc, char *argv[]) { Vector<char, 8> vB; // Vector de 8 caracteres

Vector<int, 6> vI; // Vector de 6 enteros

Vector<float, 4> vF; // Vector de 4 reales

int i;for(i=0; i<4; i++)

vF.setElem(i+2.5);cout << "Vector de reales" << endl;

vF.verVector();}

27

HERENCIA

28

Herencia

Se expresa como una relación de descendencia (es-un)

Consiste en definir una nueva clase a partir de una existente

La nueva clase se denomina subclase o clase derivada

La clase existente se denomina superclase o clase base

Es la propiedad que permite a los ejemplares de una subclase acceder a los miembros de la superclase

29

Herencia

Las subclases heredan tanto los atributos como los métodos de la superclase

La herencia es transitiva Una subclase tiene todas las propiedades

de la superclase y otras más (extensión) Una subclase constituye una especialización

de la superclase (reducción) Un método de superclase es anulado por un

método con el mismo nombre definido en la subclase

30

Herencia

Un constructor de subclase siempre invoca primero al constructor de su superclase

Un destructor de subclase se ejecuta antes que el destructor de su superclase

No se necesita reescribir el código del comportamiento heredado

La reutilización de software sólo exige conocer la funcionalidad del componente y su interfaz

Los métodos heredados se ejecutan más lentamente que el código especializado

31

Herencia

class Trio : public Par {private:

int z;public:

Trio();Trio(int, int, int);int sum();int prod();void verM();void verP();

};

32

Herencia

Trio::Trio() : Par() {z = 0;

}Trio::Trio(int a, int b, int c) : Par(a, b) {

z = c;}int Trio::sum() {

return Par::mas() + z;}int Trio::prod() {

return Par::por()*z;}

33

Herencia

void Trio::verM() {Par::verM();cout << " + " << z << " = " << sum();

}void Trio::verP() {

Par::verP();cout << " * " << z << " = " << prod();

}

34

Herencia

int main() {Par *p = new Par(4, 8) ;Trio *t = new Trio(2, 5, 8); (*p).verM();(*p).verP();(*t).verM();(*t).verP();return 0;

}

top related