Sie sind auf Seite 1von 11

Programacin Orientada a Objetos en C++

1. 2.

Clases
Las clases permiten que el programador cree objetos que tienen atributos (representados como miembros de datos o datos miembros) y defina operaciones para ellos (representadas como funciones miembro). En C++ los objetos contienen datos miembros y funciones miembros que son definidos con la palabra reservada class. Una vez que se haya definido una clase; el nombre de la clase puede ser utilizado para declarar objetos de dicha clase.
1 18/05/2009 Mg. Ing. Edgar Ruiz Lizama 2

3. 4.

Clases Funciones con prefijo set y get Funciones amigas Sobrecarga de operadores
Mg. Ing. Edgar Ruiz Lizama

18/05/2009

procederemos a la declaracin de la clase Eb general los miembros de datos aparecen listados en la seccin private, de una clase y normalmente las funciones miembro aparecen listados en la seccin public. Para un mejor entendimiento analizaremos un ejemplo simple que define la clase crculo. Ejemplo 1: Una clase circulo.
#include <iostream> // Declaracin de la constante PI const float PI = 3.141592; using namespace std;
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 3 18/05/2009 Mg. Ing. Edgar Ruiz Lizama 4

class circulo{ /* Definiremos la parte publica en donde se encuentran las funciones miembro */ public: void inicio(float a){ radio = a; } double area(){ return PI*radio*radio;} double perimetro(){ return 2*PI*radio;} /* Declaramos la parte privada donde se encuentran los datos */ private: float radio; };

Definimos la funcin principal


int main() { //clascir2.cpp float r=1.5; // Declaracin objeto a perteneciente a la clase circulo circulo cir; cir.inicio(r); //llamamos a las funciones miembro cout<<"el area es "<<cir.area()<<endl; cout<<"el perimetro es "<<cir.perimetro()<<endl; system("PAUSE"); return 0; }

Salida para clascir2.cpp

ntese que se esta usando el operador punto para la seleccin de una funcin miembro.
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 5 18/05/2009 Mg. Ing. Edgar Ruiz Lizama 6

Constructores y destructores
Una funcin miembro con el mismo nombre que la clase se le llama funcin constructora de dicha clase. Un constructor es una funcin especial que inicializa los datos de un objeto de la clase. Cuando se crea un objeto de una clase se llama a la funcin constructora de dicha clase. En el ejemplo anterior; la funcin miembro inicio de la clase circulo puede definirse de la siguiente manera:
class circulo{ public: circulo(){}; circulo(float a){ radio = a; } ...
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 7 18/05/2009 Mg. Ing. Edgar Ruiz Lizama 8

Ahora, si existen constructores podemos afirmar que tambin existen destructores los cuales tienen la misin de liberar el espacio utilizado en la memoria. Para el ejemplo un destructor sera de la siguiente manera: ~circulo(){}; Continuando, imaginemos que nuestro clase es demasiada compleja o pesada, entonces la manera de declarar y definir las funciones miembro dentro del bloque public seria muy engorrosa y no llevaramos un adecuado orden y control dentro del programa. Una buena alternativa es declararlas dentro de la clase, pero definirlas fuera de ella.

Y respecto a las funciones miembro se tiene: Para poder definir las funciones miembro fuera de la clase se utiliza el especificador de acceso a miembro, llamado tambin operador de resolucin o mbito :: Para nuestro ejemplo se tendr: Declaracin del constructor dentro de la clase, igual que en la transparencia Nmero 6: class circulo{ public:
circulo(){}; circulo(float a); ... // declaracin dentro de la clase: double area(); double perimetro(); // definicin fuera de la clase; circulo :: circulo(float a) { radio=a; }

double circulo :: area() { return PI*radio*radio; }

double circulo :: perimetro() { return 2*PI*radio; }

De esta forma podemos llevar un mejor orden y control sobre lo que estamos desarrollando
9 18/05/2009 Mg. Ing. Edgar Ruiz Lizama 10

18/05/2009

Mg. Ing. Edgar Ruiz Lizama

De all, que el programa se convertira as:


#include <iostream> const float PI=3.141592; using namespace std; class circulo{ public: circulo(){}; //constructor circulo(float a); //constructor double area(); double perimetro(); ~circulo(); private: float radio; };
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 11

circulo :: circulo(float a) { radio=a; } double circulo :: area() { return PI*radio*radio; } double circulo :: perimetro() { return 2*PI*radio; } circulo :: ~circulo() {
18/05/2009

//destructor

cout<<"Objeto destruyendose...!"<<endl;
Mg. Ing. Edgar Ruiz Lizama

}
12

//programa principal int main() { float r = 1.5; //Declarando el objeto cir y activando el constructor circulo cir(r); cout<<"el area es: "<<cir.area()<<endl; cout<<"el perimetro es: "<<cir.perimetro()<<endl; cir.~circulo(); system("PAUSE"); return 0; } //activando el destructor //clascir3.cpp

Funciones Set y Funciones Get


Las funciones con prefijo set permiten establecer o ingresar datos a un objeto. Las funcionescon prefijo get permiten devolver, recuperar o imprimir un dato o datos de un objeto. Lo explicaremos mejor con un ejemplo. Hallar el rea y el permetro de 3 rectngulos diferentes. Solucin: Aplicaremos los pasos que seguimos anteriormente: definicin de libreras
#include <iostream> using namespace std;

18/05/2009

Mg. Ing. Edgar Ruiz Lizama

13

18/05/2009

Mg. Ing. Edgar Ruiz Lizama

14

class rectangulo{ public: void setLargo(float l); void setAncho(float a); float getLargo(); float getAncho(); float area(); float perimetro(); } ~rectangulo(); private: float largo; float ancho; };
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 15 18/05/2009 Mg. Ing. Edgar Ruiz Lizama 16

void rectangulo :: setLargo(float l) { largo = l; } void rectangulo :: setAncho(float a) { ancho = a;

float rectangulo :: getLargo() { return largo; }

float rectangulo :: getAncho() { return ancho; } rectangulo :: ~rectangulo() { cout<<"Objeto en destruccion!... "<<endl; } int main() //clasrec1.cpp { rectangulo rect1,rect2; rect1.setLargo(5.0); rect1.setAncho(3.2); cout<<"Rectangulo 1 "<<endl; cout<<"Largo: "<<rect1.getLargo()<<endl; cout<<"Ancho: "<<rect1.getAncho()<<endl; cout<<"El area es "<<rect1.area()<<endl; cout<<"El perimetro es "<<rect1.perimetro()<<endl;

float rectangulo :: area() { return largo*ancho; }

float rectangulo :: perimetro() { return 2*(largo + ancho); }


18/05/2009 Mg. Ing. Edgar Ruiz Lizama 17

18/05/2009

Mg. Ing. Edgar Ruiz Lizama

18

float lar, anc; cout<<"\nIngrese largo y ancho del 2do. rectangulo "; cin>>lar>>anc; rect2.setLargo(lar); rect2.setAncho(anc); cout<<"Rectangulo 2 "<<endl; cout<<"Largo: "<<rect2.getLargo()<<endl; cout<<"Ancho: "<<rect2.getAncho()<<endl; cout<<"El area es "<<rect2.area()<<endl; cout<<"El perimetro es "<<rect2.perimetro()<<endl; rect1.~rectangulo(); rect2.~rectangulo(); getch(); return 0; }
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 19 18/05/2009 Mg. Ing. Edgar Ruiz Lizama 20

Salida para clasrec1.cpp

Funciones Amigas
Una funcin amiga es una funcin que sin ser una funcin miembro, tiene acceso a los datos miembros de la clase. Dentro del programa se les puede reconocer por llevar antepuesto la palabra reservada friend. Para nuestro ejemplo del rea del crculo, la utilizacin de las funciones amigas seria de la siguiente forma: Declaracin dentro de la clase: class circulo {
friend double area(); friend double perimetro();

y para definirlo fuera de la clase ya no se usara el operador de acceso a miembro ( :: ) puesto que como se ha dicho, no es una funcin miembro de la clase.

double {

area() return PI*radio*radio;

} double { return 2*PI*radio; } perimetro()

... //
18/05/2009

continua el codigo de la clase

Mg. Ing. Edgar Ruiz Lizama

21

18/05/2009

Mg. Ing. Edgar Ruiz Lizama

22

Sobrecarga De Operadores
La sobrecarga de operadores es similar a la sobrecarga de funciones. Cuando se sobrecarga un operador este no pierde su contenido ni propsito original, sino que gana un contenido nuevo que ser utilizado por los objetos pertenecientes a la clase para la que se defini. Para sobrecargar un operador puede utilizarse: 1)Una funcin operadora 2)Una funcin amiga de la clase El formato para la sobrecarga es el siguiente:
<tipodevuelto><nombreclase>::operator<operador a sobrecargar>< lista de argumentos>

Existen dos restricciones muy importantes cuando se sobrecarga un operador: 1) No puede cambiarse la precedencia de operadores como: ^ , /, *, +, 2) El nmero de operandos que tiene un operador no puede modificarse, por ejemplo la divisin no puede hacerse a/ ,puesto no es lgico. Casi todos los operadores se pueden sobrecargar excepto: . , :: , ? , .*

La palabra reservada operator indica al compilador que se esta sobrecargando un operador.


18/05/2009 Mg. Ing. Edgar Ruiz Lizama 23

Ejemplo de aplicacin: Preparar una clase que permita realizar aritmtica de fracciones
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 24

En matemtica se puede realizar trabajos con fracciones y operaciones

Racional

1 3 2+3 5 + = = 2 4 4 4

5 3 2 1 = = 8 8 8 4

Para el computador se representa por 0,25 como resultado de dividir dos enteros y luego hacer un cast a float. Si se quiere de todos modos que el programa maneje o exprese y no 0,25, debemos escribir un tipo de dato abstracto que permita el trabajo con fracciones. Un tipo de dato abstracto TDA es el conjunto de valores permitidos para el y las operaciones bsicas definidas para el TDA.
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 25 18/05/2009

Racional() getnum() getdenom() +, -, *, / ==, <, <=, >, >=, != =, +=, -=, *=, /= ++, -<<, >> print()

Interface publica

num, denom simplificar()

Interface privada

Figura: El TDA racional


Mg. Ing. Edgar Ruiz Lizama 26

//Archivo racional.h #ifndef RACIONAL_H #define RACIONAL_H #include <assert.h> int mcd(int, int); //para el maximo comun divisor

ahora sobrecargaremos los operadores aritmticos. Ntese que la lista de argumentos debe ser explicita y completa en el caso de las funciones amigas. En el caso de las funciones miembro si se trata de un operador solo se le pasa un argumento puesto que el otro pasa implcito.

class Racional{ public: //constructores Racional(int num=0, int denom=1); Racional(const Racional&); //atributos int getnum()const{return num;} int getdenom()const{return denom;}
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 27

//operadores aritmeticos Racional operator-();// menos unario friend Racional operator+(const Racional&,const Racional&); friend Racional operator-(const Racional&,const Racional&); friend Racional operator*(const Racional&,const Racional&); friend Racional operator/(const Racional&,const Racional&);

18/05/2009

Mg. Ing. Edgar Ruiz Lizama

28

//operadores de asignacion Racional& operator=(const Racional&); //operadores de comparacion friend bool operator==(const Racional&,const Racional&); friend bool operator!=(const Racional&,const Racional&); friend bool operator<(const Racional&,const Racional&); friend bool operator<=(const Racional&,const Racional&); friend bool operator>(const Racional&,const Racional&); friend bool operator>=(const Racional&,const Racional&); Racional& operator+=(const Racional&); Racional& operator-=(const Racional&); Racional& operator*=(const Racional&); Racional& operator/=(const Racional&); //entrada salida void print(); friend ostream& operator<<(ostream&, const Racional&); friend istream& operator>>(istream&, Racional&); //operadores unarios Racional& operator++(); //incremento prefijo Racional& operator--(); //disminucion prefijo };
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 29 18/05/2009 Mg. Ing. Edgar Ruiz Lizama 30

private: int num, denom; void simplificar();

Ahora definimos las funciones miembro


Racional Racional :: operator-() { } Racional operator+(const Racional& r1,const Racional& r2) { int dd=r1.denom*r2.denom; int nn=r1.num*r2.denom + r1.denom*r2.num; return Racional(nn,dd); } Racional operator-(const Racional& r1,const Racional& r2) { int dd=r1.denom*r2.denom; int nn=r1.num*r2.denom - r1.denom*r2.num; return Racional(nn,dd); }
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 31

Racional operator*(const Racional& r1,const Racional& r2) { int dd=r1.denom*r2.denom; int nn=r1.num*r2.num;

return Racional(-num, denom);

return Racional(nn,dd); } Racional operator/(const Racional& r1,const Racional& r2) { int dd=r2.num*r1.denom; int nn=r1.num*r2.denom;

return Racional(nn,dd); }
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 32

bool operator==(const Racional& r1, const Racional& r2) { return (r1.num*r2.denom == r1.denom*r2.num)?true:false; } bool operator!=(const Racional& r1, const Racional& r2) { return (r1.num*r2.denom != r1.denom*r2.num)?true:false; } bool operator<(const Racional& r1, const Racional& r2) { return (r1.num*r2.denom < r1.denom*r2.num)?true:false; }

bool operator<=(const Racional& r1, const Racional& r2) { return (r1.num*r2.denom <= r1.denom*r2.num)?true:false; } bool operator>(const Racional& r1, const Racional& r2) { return (r1.num*r2.denom > r1.denom*r2.num)?true:false; } bool operator>=(const Racional& r1, const Racional& r2) { return (r1.num*r2.denom >= r1.denom*r2.num)?true:false; }

18/05/2009

Mg. Ing. Edgar Ruiz Lizama

33

18/05/2009

Mg. Ing. Edgar Ruiz Lizama

34

Racional& Racional :: operator++() //prefijo { num=num+denom; return *this; } Racional& Racional :: operator--() //prefijo { num=num-denom; return *this; } Racional& Racional :: operator=(const Racional& p) { if (*this!=p) { num=p.num; denom=p.denom; } return *this; }
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 35 18/05/2009 Mg. Ing. Edgar Ruiz Lizama 36

Racional& Racional :: operator+=(const Racional& p) { *this=*this+p; return *this; } Racional& Racional :: operator-=(const Racional& p) { *this=*this-p; return *this; } Racional& Racional :: operator*=(const Racional& p) { *this=*this*p; return *this; }

Racional :: Racional(int nu, int den) { assert(den!=0); ostream& operator<<(ostream& os, const Racional& r) num=nu; { denom=den; os<<r.num<<"/"<<r.denom; simplificar(); return os; } } Racional :: Racional(const Racional& r) { num=r.num; istream& operator>>(istream& is, Racional& r) denom=r.denom; { } is>>r.num>>r.denom; void Racional :: print() return is; { } cout<< *this; }
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 37 18/05/2009 Mg. Ing. Edgar Ruiz Lizama 38

void Racional :: simplificar() { if (!num) return; if (denom<0) { num=-num; denom=-denom; } int d=mcd(num,denom); if (d>1) { num=num/d; denom=denom/d; } }
18/05/2009 Mg. Ing. Edgar Ruiz Lizama 39 18/05/2009 Mg. Ing. Edgar Ruiz Lizama 40

int mcd(int x, int y) { if (x<y) return mcd(y,x); if(x%y==0) return y; else return mcd(y,x%y); }

#endif

// fin de la libreria racional.h

10

//Archivo racional.cpp #include <iostream> #include <stdio.h> #include "racional.h using namespace std; int main() { //racional.cpp

r4+=r1; cout<<"\nr4=r4+r1 -> "<<r4<<endl; r4*=r2; cout<<"\nr4=r4*r2 -> "<<r4<<endl; ++r3; cout<<"\n1+r3 = "<<r3<<endl; r1=r4; cout<<"\nAsignando r4 a r1 -> "<<r1<<endl; cout<<"\nPresione una tecla..."; getchar(); }

Racional r1(2,3),r2(1,2),r3(2,3),r4; cout<<"r1 = "<<r1<<endl; cout<<"r2 = "<<r2<<endl; cout<<"r3 = "<<r3<<endl; r4=r1+r2; cout<<"\nSuma de r1 y r2 = r4 -> "<<r4<<endl; if (r1==r3) cout<<"\nr1 es igual a r3"<<endl; else cout<<"\nr1 no es igual a r3"<<endl;

18/05/2009

Mg. Ing. Edgar Ruiz Lizama

41

18/05/2009

Mg. Ing. Edgar Ruiz Lizama

42

Salida para racional.cpp


REFERENCIAS: 1. Perry Jo, Ellen and Levin Harold., An Introduction to Object-Oriented Design in C++ 1st edition, Addison Wesley Publishing Company, Inc. U.S.A. 1996. 2. Deitel y Deitel, How To Program C++ 2nd. Edition, Prentice Hall, Inc. U.S.A. 1998.
 /ERL 2009

18/05/2009

Mg. Ing. Edgar Ruiz Lizama

43

18/05/2009

Mg. Ing. Edgar Ruiz Lizama

44

11

Das könnte Ihnen auch gefallen