Clases Objetos
Clases Objetos
Clases Objetos
CLASES Suponga que el tratamiento de una cadena se dispone de la siguiente cadena, informacin : char s[80] void get_string(char *s); void put_string(char *s); UD puede agruparlas haciendo uso de una estructura struct string { char s[80]; void get(); void put(); };
Para definir las funciones get() y put() de la estructura string, string se hace Uso del Operador de mbito o scoping(::) tal como siguen g void string::get() { i t i=0; int i 0 char c; while((c=getchar( ))!= ))!='\n') \n ) s[i++]=c; s[i]='\0'; void string::put(){ f (i t i=0;s[i];i++) for(int i 0 [i] i ) putchar(s[i]); }
Ing. Daniel Osorio Maldonado 4
El nico inconveniente en esta "Ocultacin de la Informacin" Informacin es que el dato y las funciones son publicas; y Ud., puede Utilizarlos en cualquier momento. #include<iostream.h> #include<string.h> g #include<ctype.h> #include<stdio.h> struct string i { char s[80]; void get(); void put(); };
void string::get(){ int t i=0; 0; char c c; while((c=getchar())!='\n') s[i++]=c; s[i]='\0';} void string::put(){ for(int i=0;s[i];i++) putchar(s[i]); } main(){ string x; cout<<"Ingrese " Una Frase : "; " x.get(); cout<<"La cout<< La Frase Saliente es : "; ; x.put(); ( ); } return(0);
Ing. Daniel Osorio Maldonado 6
Los miembros de una Clase pueden adquirir atributos, , en uno de los caminos * por defecto a travs del uso de un especificador de acceso: public ,private, protected.La d sintaxis i i es: public :<declaraciones> private:<declaraciones> protected :<declaraciones> Un miembro es p publico, si puede p ser usado por cualquier funcin y tambin por el main(). En C++ son pblicos los miembros de una estructura t t y una unin. i Un miembro es privado, si nicamente puede ser usado por Funciones y Funciones amigas de la clase, en la que es declarada. En una clase todos son por defecto, privados.
Ing. Daniel Osorio Maldonado 7
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 acceso.
/*programa que permite sumar los n primeros trminos impares haciendo uso de class, class se usara operador scope */
#include<iostream.h> #include<iostream h> #include<conio.h> #include<ctype.h> yp #include<process.h> class suma{ private: int i,impar,par,simpar; long M,N,numero; M N numero; public:void leer(); p (); void suimpar(); void visualizar(); } };
Ing. Daniel Osorio Maldonado 9
void suma::leer(){ numero=N; cout<<"Ingrese el Numero de Terminos :"; cin>>numero;} ;} void suma::suimpar(){ simpar=0; impar=1;par=2;i=1; cout<<"\nLa cout<< \nLa serie Impar : :"; ; while(i<=numero) { cout<<' '<<impar; p ; simpar +=impar; impar +=par; i++;} }
Ing. Daniel Osorio Maldonado 10
void suma::visualizar() { cout<<\nLa cout<< \nLa suma de los primeros "<<numero <<numero <<" Terminos es :"<<simpar; } main(){ suma SI; SI char rp; do{ system("cls"); SI.leer(); SI.suimpar(); SI.visualizar(); cout<<\nOtra t<<\ Ot S Suma [S][N] :"; " cin>>rp; }while(rp=='S' }while(rp S ||rp ||rp==s); s ); } Ing. Daniel Osorio Maldonado
11
//Halla el semiperimetro y el rea de un Triangulo l #include<iostream.h> #i l d < #include<math.h> th h> class triangulo{ protected: float a,b,c; public: void leer(float p,float q,float r); double semiper(float p ( a,float , b,float , c); ); 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 12
double triangulo::semiper(float a, float b, float c){ 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 sp=triangulo::semiper(a,b,c); p ( p ) ( p ) ( p ); d=sp*(sp-a)*(sp-b)*(sp-c); if(d) return(sqrt(d)); else l cout<<"Los Lados No Forman un Triangulo "; }
Ing. Daniel Osorio Maldonado 13
main(){ fl t x,y,z;triangulo float t i l tri; t i cout<<"Ingrese el Valor del Lado A =";cin>>x; cout<<"Ingrese cout<< Ingrese el Valor del Lado B = =";cin>>y; ;cin>>y; cout<<"Ingrese el Valor del Lado C =";cin>>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; }
14
15
En la declaracin, un constructor lleva el mismo nombre que la clase a la que pertenece. pertenece Ejemplo Clase nombre_clase public: nombre_clase( ), // constructor por defecto nombre clase (parmetros); // constructor con parmetros nombre_clase }; Considerando la clase Ccola del ejemplo anterior, utilizando constructor explicito seria: class Ccola{ int Num Elem; int Cola[Max];
Ing. Daniel Osorio Maldonado 16
public: Ccola ( (int Pv_NumElem=0) ) //constructor // con p parmetros por defecto. Void ejecuta (void); V id finalizar Void fi li ( id) (void); .... }; //desarrollo del constructor de la clase cCola cCola ::Ccola ( (int Pv_NumElem) _ ) { Num Elem = Pv_Num Elem; if (Num Elem =0) f (i t i=0; for(int i 0 i< i max ; i++) i ) cola (i)= 0; else for (int i= 0; i< Num Elem ; i++) cola [ [i]=0 ]
Ing. Daniel Osorio Maldonado 17
Dada la declaracin de clase anterior podemos declarar los siguientes objetos. objetos Ccola objcolas; //asume el valor por defecto Ccola objcola 2(10) ; // se le da un nuevo valor mximo de elementos. elementos Observaciones 1) Una clase puede tener varios constructores . Aplicando funciones sobrecargadas. 2) Una forma de reducir el nmero de constructores es aplicando parmetro por defecto. defecto 3) Una clase con nico constructor (por defecto) es muy limitado.
Ing. Daniel Osorio Maldonado 18
4) Cuando un constructor tiene parmetros que sirven para inicializar los datos miembro de la clase, 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 nombre clase } Private: int dat1: float dat2 public: nombre _clase (int pv dat1, float pv dat2) Dat1 (pv dato1), dato1) dato 2 (pv dato 2){} };
Ing. Daniel Osorio Maldonado 19
Destructores 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, 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, 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 destructor tiene que ser invocado d explcitamente l a travs del d l operador delete cuando se desea destruir el objeto.
Ing. Daniel Osorio Maldonado 20
La funcin principal de un destructor es liberar la memoria dinmica que ha sido utilizado el objeto de una clase. 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 Una clase derivada puede acceder a los miembros public y protected de la clase base , como si fueran miembros de ella, no p pueden tener acceso a los miembros p private. -Una clase derivada pudo aadir sus propios datos y funciones. -La herencia h cumple l la l ley l transitiva.
21
#include<iostream.h> #include<conio h> #include<conio.h> class cCuadro{ int ancho,largo; public: cCuadro(); //constructor cCuadro(int C d (i t w,int i t l);//constructor l) // t t void cVisualizar(); ~cCuadro(){cout<<"\nDestruyendo cCuadro(){cout<< \nDestruyendo el Objeto ";} ;} }; cCuadro::cCuadro() {ancho=30;largo=50;} cCuadro::cCuadro(int w,int l) {ancho=w;largo=l;} {ancho w;largo l;}
Ing. Daniel Osorio Maldonado 22
void cCuadro::cVisualizar(){ cout<<"Ancho= cout<< Ancho "<<ancho<<' <<ancho<< ' <<"Largo= "<<largo;} main(){ int p,q; cCuadro C d c1;//Por 1 //P defecto d f t cout<<"Por defecto :"; c1 cVisualizar(); 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); c2.cVisualizar(); 2 Vi li () getch(); }
Ing. Daniel Osorio Maldonado 23
Polimorfismo 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 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 . Caractersticas -Tiende ala creacin de clases genricas -Aplica obligatoriamente la caracterstica de herencia para la redefinicin d f de d las l funciones f virtuales. l -Si la clase derivada no redefine una funcin virtual; se ejecutar la funcin de la clase base. base
Ing. Daniel Osorio Maldonado 24
Clases Abstractas / Plantillas 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. 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 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. particulares
25
-Una Una funcin virtual en una clase base contina siendo virtual cuando es heredada y su redefinicin debe tener el mismo nombre, , nmero y tipo p de p parmetros y tipo p de valor retornado que en la clase base. -En la clase base debe haber por lo menor una funcin que establezca t bl l secuencia la i lgica l i d ejecucin de j i de d la l clase l .Las L funciones que en la clase base an no se pueden desarrollar 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.
26
Sobrecarga de Funciones 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 sea as.
27