Tema: PROGRAMACION ORIENTADA A OBJETOS - CLASS Ing. Daniel Osorio Maldonado 1 PROGRAMACION ORIENTADA A OBJ ETOS En C++ Los Obj et os son def i ni dos usando l a t i l l i i l const r ucci n cl ass, l a que es muy si mi l ar a l a est r uct ur a. Una Cl ase es el cami no par a l a descr i pci n de un Obj et o. descr i pci n de un Obj et o. Una cl ase est a compuest a por dos component es una que descr i be l as car act er st i cas pasi vas del obj et o, l os dat os mi embr os que ni cament e al macenan i nf or maci n y l a segunda al macenan i nf or maci n, y l a segunda component e que r epr esent a l as acci ones que pueden r eal i zar l os obj et os y son l as que pueden r eal i zar l os obj et os y son l as f unci ones mi embr os, l l amado t ambi n mt odos. Ing. Daniel Osorio Maldonado 2 CLASES Suponga que se desea cal cul ar l a Longi t ud y el r ea de un Ci r cul o Longi t ud y el r ea de un Ci r cul o. /*Programa que calcula el rea de un circulo */ #include<iostream.h> #include<process.h> class cAcirculo { protected: protected: float R; public: void asignaRadio (float x); double obtieneArea (float R); double obtieneLongitud (float R); double obtieneLongitud (float R); }; //Implementacion Para definir los metodos asignarRadio(), obtieneArea() y obtieneLongitud(), se hace Uso del Operador de mbito o scope(::) tal como siguen Ing. Daniel Osorio Maldonado 3 scope(::) tal como siguen void cAcirculo::asignaRadio (float x) {R=x;} {R x;} double cAcirculo::obtieneArea (float R) {return (2*asin(1)*R*R);} d bl A i l bti L it d(fl t R) double cAcirculo::obtieneLongitud(float R) {return (2*asin (1)*2*R);} main () { () { float q; char Rp; for(;;){ system("cls"); cAcirculo rc1; cAcirculo rc1; cout<<" Ingrese Radio= "; cin>>q; rc1.asignaRadio (q); g (q) cout<< " El Area del Circulo es = "<<rc1.obtieneArea(q) <<endl << "La longitud del Circulo es ="<< rc1 obtieneLongitud (q)<<"\nPruebe con Otros Valores rc1.obtieneLongitud (q)<< \nPruebe con Otros Valores [S][N]"; cin>>Rp; if(Rp=='N'||Rp=='n') break; } } Ing. Daniel Osorio Maldonado 4 Los mi embr os de una Cl ase pueden adqui r i r at r i but os, en uno de l os cami nos , * por def ect o a t r avs del uso de un especi f i cador de acceso: publ i c , pr i vat e, d i i pr ot ect ed. La si nt axi s es: publ i c : <decl ar aci ones> pr i vat e: <decl ar aci ones> pr i vat e: <decl ar aci ones> pr ot ect ed : <decl ar aci ones> Un mi embr o es publ i co, si puede ser usado p p por cual qui er f unci n y t ambi n por el mai n( ) . En C++ son pbl i cos l os mi embr os de una t t i est r uct ur a y una uni n. Un mi embr o es pr i vado, si ni cament e puede ser usado por Funci ones y Funci ones ami gas de ser usado por Funci ones y Funci ones ami gas de l a cl ase, en l a que es decl ar ada. En una cl ase t odos son por def ect o, pr i vados. Ing. Daniel Osorio Maldonado 5 Un miembro es protegido teniendo las Un miembro es protegido, teniendo las mismas caractersticas de un miembro privado; y adems pueden ser usados por las clases derivadas. Una declaracin amiga no es afectada por un especificador de acceso especificador de acceso. Ing. Daniel Osorio Maldonado 6 /*programa que permite sumar los n primeros trminos impares haciendo uso de class se usara trminos impares haciendo uso de class, se usara operador scope */ #include<iostream h> #include<iostream.h> #include<process.h> class suma{ class suma{ protected: int i impar par simpar; int i,impar,par,simpar; long M,N,numero; public:void leer(); public:void leer(); void suimpar(); void visualizar(); void visualizar(); }; Ing. Daniel Osorio Maldonado 7 void suma::leer(){ N numero=N; cout<<"Ingrese el Numero de Terminos :"; cin>>numero;} cin>>numero;} void suma::suimpar(){ void suma::suimpar(){ simpar=0; impar=1;par=2;i=1; p ;p ; ; cout<<"\nLa serie Impar :"; while(i<=numero) { cout<<' '<<impar; simpar +=impar; impar +=par; i++;} } Ing. Daniel Osorio Maldonado 8 void suma::visualizar() {cout<<\nLasumadelosprimeros"<<numero { cout<<\nLa suma de los primeros <<numero <<" Terminos es :"<<simpar; } main(){ SI suma SI; char rp; do{system("cls"); do{system( cls ); SI.leer(); SI.suimpar(); SI.visualizar(); cout<<\nOtra Suma [S][N] :"; i >> cin>>rp; }while(rp=='S'||rp==s); } Ing. Daniel Osorio Maldonado 9 } //Halla el semiperimetro y el rea de un l Triangulo #include<iostream.h> #i l d < th h> #include<math.h> class triangulo{ protected: protected: float a,b,c; public: public: void leer(float p,float q,float r); double semiper(float a,float b,float c); p ( , , ); double Cal_Area(float a, float b, float c); }; void triangulo::leer(float p,float q, float r) {a=p;b=q;c=r;} Ing. Daniel Osorio Maldonado 10 double triangulo::semiper(float a, float b, float c){ double S; double S; if(a<(b+c)&&b<(a+c)&&c<(b+c)) S=(a+b+c)/2.0; ( )/ ; return (S); } double triangulo::Cal_Area(float a, float b, float c){ double d; double d; double sp=triangulo::semiper(a,b,c); d=sp*(sp-a)*(sp-b)*(sp-c); p ( p ) ( p ) ( p ); if(d) return(sqrt(d)); l else cout<<"Los Lados No Forman un Triangulo "; } Ing. Daniel Osorio Maldonado 11 } main(){ fl t t i l t i float x,y,z;triangulo tri; cout<<"Ingrese el Valor del Lado A =";cin>>x; cout<<"Ingrese el Valor del Lado B =";cin>>y; cout<< Ingrese el Valor del Lado B = ;cin>>y; cout<<"Ingrese el Valor del Lado C =";cin>>z; tri.leer(x,y,z); tri.leer(x,y,z); cout<<"El semiperimetro es "<<tri.semiper(x,y,z)<<endl p ( ,y, ) <<"El Area del TRiangulo es "<<tri.Cal_Area(x,y,z)<<endl; return 0; } Ing. Daniel Osorio Maldonado 12 Constructores .-Una forma de asegurar que los objetos siempre contengan valores vlidos para sus datos miembro es siempre contengan valores vlidos para sus datos miembro es declarando un constructor de su clase. Un constructor es una funcin miembro especial de una clase que se llama as misma p q automticamente cuando se declara un objeto de esa clase. Su funcin principal es inicializar un objeto de su clase , por l l i l d l i d l lo cual permite la declaracin de parmetros valor. Cuando en una clase no declara un constructor el compilador Cuando en una clase no declara un constructor ,el compilador considera uno por defecto sin parmetros . Por tanto , si el objeto es declarado en forma local, los datos miembro no j , tiene valor definidos (nada) y si el objeto es declarado en forma global, inicializa los datos miembros numricos con l lf i l ceros y los alfanumricos como vacos o nulos Ing. Daniel Osorio Maldonado 13 En la declaracin, un constructor lleva el mismo nombre que la clase a la que pertenece la clase a la que pertenece. Ejemplo //Complejos con constructores y destructures //COMPLETE CON:DIVISION Y PRODUCTO DE COMPLEJOS #i l d <i t h> #include<iostream.h> #include<stdlib.h> #include<math.h> #include math.h #define mensaje "\nOTra Prueba [S][N] " class complejo{ protected: int real; int imaginario; int imaginario; public: complejo( ){ }; Ing. Daniel Osorio Maldonado 14 complejo( ){ }; complejo(int re, int im); complejo conjugada_Complejo(complejo c); complejo Suma_Complejo(complejo c1, complejo c2); p j _ p j ( p j , p j ); void visualizar_complejo(void){ cout<<" \nEl numero complejo es = "<<real<<" + " i i i " i" dl "<<imaginario<<" i"<<endl; }; ~complejo(){cout<<"\nLiberando Memoria ";} ~complejo(){cout<< \nLiberando Memoria ;} }; complejo::complejo(int re, int im) p j p j ( , ) { real=re; imaginario=im;} complejo complejo::conjugada_Complejo(complejo c) { l j k { complejo k; k.real=c.real; k imaginario=-c imaginario; k.imaginario c.imaginario; return k; } Ing. Daniel Osorio Maldonado 15 } complejo complejo::Suma_Complejo(complejo c1, complejo c2) complejo c2) { complejo x; x.real=c1.real+c2.real; x.imaginario=c1.imaginario+c2.imaginario; return x;} i (){ main(){ int m,n,r,s;char rp; for(;;){system("cls"); cout<<" Ingrese la parte real del 1er complejo = cout Ingrese la parte real del 1er complejo ";cin>>m; cout<<" Ingrese la parte imaginaria del 1er complejo = ";cin>>n; cout<<" Ingrese la parte real del 2do complejo = ";cin>>r; cout<<" Ingrese la parte imaginaria del 2do complejo cout<<" Ingrese la parte imaginaria del 2do complejo = ";cin>>s; complejo a(m,n),b(r,s),c,d,e,f; Ing. Daniel Osorio Maldonado 16 complejo a(m,n),b(r,s),c,d,e,f; a.visualizar_complejo(); b.visualizar complejo(); b.visualizar_complejo(); d=c.Suma_Complejo(a,b); d.visualizar_complejo(); f=e.conjugada_Complejo(d); cout<<" \nLa conjugada es = "; f i li l j () f.visualizar_complejo(); cout<<mensaje; cin>>rp; if(rp=='N'||rp=='n')break;} cin rp; if(rp N||rp n )break;} } Observaciones 1) Una clase puede tener varios constructores . Aplicando funciones sobrecargadas. 2) Una forma de reducir el nmero de constructores es 2) Una forma de reducir el nmero de constructores es aplicando parmetro por defecto. 3) Una clase con nico constructor (por defecto) es muy Ing. Daniel Osorio Maldonado 17 3) Una clase con nico constructor (por defecto) es muy limitado. 4) Cuando un constructor tiene parmetros que sirven para inicializar los datos miembro de la clase se recomienda inicializar los datos miembro de la clase, se recomienda hacerlo a travs del constructor si la inicializacin se realiza una sola vez o a travs de una funcin miembro. Si la inicializacin puede realizarse ms de una vez, de la siguiente manera: Class nombre clase { Class nombre_clase { Private: int dat1: int dat1: float dat2 public: nombre _clase (int pv dat1, float pv dat2) dat1 (pv dat1) dat2 (pv dat2){} dat1 (pv dat1), dat2 (pv dat2){} }; Ing. Daniel Osorio Maldonado 18 Destructores Un destructor es una funcin miembro especial de una clase Un destructor es una funcin miembro especial de una clase que se utiliza para eliminar un objeto de esa clase, liberando la memoria que ocupa un destructor se identifica fcilmente, la memoria que ocupa un destructor se identifica fcilmente, porque tiene el mismo nombre de la clase a la que pertenece procedido por el smbolo ceja ~. Un destructor no puede tener parmetros, no puede retornar ningn valor. Cuando en un destructor no se especifica explcitamente un destructor el compilador crea uno por explcitamente un destructor, el compilador crea uno por defecto. Un destructor es invocado automticamente cuando se sale del bloque al que es visible un objeto, excepto cuando el objeto ha sido creado con el operador new ; para lo cual el d d l d l destructor tiene que ser invocado explcitamente a travs del operador delete cuando se desea destruir el objeto. Ing. Daniel Osorio Maldonado 19 La funcin principal de un destructor es liberar la memoria dinmica que ha sido utilizado el objeto de una clase Si no se dinmica que ha sido utilizado el objeto de una clase. Si no se ha asignado memoria dinmica; basta con el constructor por defecto. Caractersticas -Una clase derivada puede a su vez, ser una clase base , dando lugar a una jerarqua de clases. Una clase derivada puede acceder a los miembros public y -Una clase derivada puede acceder a los miembros public y protected de la clase base , como si fueran miembros de ella, no pueden tener acceso a los miembros private. p p -Una clase derivada pudo aadir sus propios datos y funciones. h l l l -La herencia cumple la ley transitiva. Ing. Daniel Osorio Maldonado 20 #include<iostream.h> #include<conioh> #include<conio.h> class cCuadro{ int ancho,largo; public: cCuadro(); //constructor C d (i t i t l) // t t cCuadro(int w,int l);//constructor void cVisualizar(); ~cCuadro(){cout<<"\nDestruyendoel Objeto";} cCuadro(){cout<<\nDestruyendo el Objeto ;} }; cCuadro::cCuadro() {ancho=30;largo=50;} cCuadro::cCuadro(int w,int l) {ancho=w;largo=l;} Ing. Daniel Osorio Maldonado 21 {ancho w;largo l;} void cCuadro::cVisualizar(){ cout<<"Ancho="<<ancho<<' ' cout<<Ancho <<ancho<< <<"Largo= "<<largo;} main(){ int p,q; C d 1//P d f t cCuadro c1;//Por defecto cout<<"Por defecto :"; c1cVisualizar(); c1.cVisualizar(); cout<<"\nCon argumentos ="; cout<<"\nIngrese el valor del primer parametro :";cin>>p; cout<<"\nIngrese el valor del segunedo parametro :";cin>>q; cCuadro c2(p,q); 2 Vi li () c2.cVisualizar(); getch(); } Ing. Daniel Osorio Maldonado 22 } Polimorfismo Es la caracterstica mas importante de POO y consiste Es la caracterstica mas importante de POO y consiste fundamentalmente; en la capacidad de realizar una misma tarea pero de muchas formas distintas. El misterio de sta tarea pero de muchas formas distintas. El misterio de sta caractersticas radica en el momento de la compilacin .No se conoce la tarea que se realizar ; recin se les conoce en el momento de ejecucin. A stas tareas misteriosas se les conoce con el nombre de virtuales ya que aparentemente existen ; pero realmente no hacen nada existen ; pero realmente no hacen nada . Caractersticas -Tiende ala creacin de clases genricas -Aplica obligatoriamente la caracterstica de herencia para la d f d l f l redefinicin de las funciones virtuales. -Si la clase derivada no redefine una funcin virtual; se ejecutar la funcin de la clase base Ing. Daniel Osorio Maldonado 23 ejecutar la funcin de la clase base. Clases Abstractas / Plantillas Una clase es abstracta cuando establece la lgica de ejecucin Una clase es abstracta cuando establece la lgica de ejecucin sin conocer aun los tipos de datos que se manejarn y en algunos casos no se conoce el medio de almacenamiento. Para ello estas clases deben, estar preparadas para la aplicacin del polimorfismo con un ingrediente adicional: las funciones virtuales puras qu es una funcin virtual pura? No es otra virtuales puras. qu es una funcin virtual pura? No es otra que una funcin que solamente existe de nombre y que su desarrollo recin se conoce en la clase derivada desarrollo recin se conoce en la clase derivada correspondiente. Ctt inicializa a estas funciones virtuales puros con O. Debemos tener presente que no se pueden declarar objetos de clase s abstractas ; stas existen para derivarlas y construir nuestras propias clases particulares nuestras propias clases particulares. Ing. Daniel Osorio Maldonado 24 -Una funcin virtual en una clase base contina siendo virtual Una funcin virtual en una clase base contina siendo virtual cuando es heredada y su redefinicin debe tener el mismo nombre, nmero y tipo de parmetros y tipo de valor , y p p y p retornado que en la clase base. -En la clase base debe haber por lo menor una funcin que t bl l i l i d j i d l l L establezca la secuencia lgica de ejecucin de la clase .Las funciones que en la clase base an no se pueden desarrollar se denominan virtuales y sern desarrolladas en las clases se denominan virtuales y sern desarrolladas en las clases derivadas correspondientes. -No se permite constructores virtuales. -Se recomienda un destructor virtual cuando una clase tiene funciones virtuales; aunque dicho destructor no haga nada. Ing. Daniel Osorio Maldonado 25 Sobrecarga de Funciones Sobrecarga de Funciones Consiste en declarar una misma funcin varias veces Consiste en declarar una misma funcin varias veces pero con distinto nmero y/o tipo de parmetro : Cuando es invocada , el compilador a Cul de las funciones llamar identificndolo por sus parmetros adems ; las funciones tambin podran tener diferente tipo de resultado ; aunque no es obligatorio que diferente tipo de resultado ; aunque no es obligatorio que sea as. Ing. Daniel Osorio Maldonado 26