Clases Objetos

26
UNIVERSIDAD NACIONAL DE INGENIERIA FACULTAD DE INGENIERIA MECANICA Tema: PROGRAMACION ORIENTADA A OBJETOS - CLASS Ing. Daniel Osorio Maldonado 1

Transcript of Clases Objetos

Page 1: Clases Objetos

UNIVERSIDAD NACIONAL DE INGENIERIA

FACULTAD DE INGENIERIA MECANICA

Tema: PROGRAMACION ORIENTADA A OBJETOS - CLASS

Ing. Daniel Osorio Maldonado 1

Page 2: Clases Objetos

PROGRAMACION ORIENTADA A OBJETOS

En C++ Los Objetos son definidos usando la t ió l l i il construcción class, la que es muy similar a

la estructura. Una Clase es el camino para la descripción de un Objeto.descripción de un Objeto.

Una clase esta compuesta por dos componentes una que describe las características pasivas del objeto, los datos miembros que únicamentealmacenan información y la segunda almacenan información, y la segunda componente que representa las accionesque pueden realizar los objetos y son las que pueden realizar los objetos y son las funciones miembros, llamado también métodos.

Ing. Daniel Osorio Maldonado 2

Page 3: Clases Objetos

CLASES Suponga que se desea calcular la Longitud y el área de un CirculoLongitud y el área de un Circulo./*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);};//ImplementacionPara 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

Page 4: Clases Objetos

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

Page 5: Clases Objetos

Los miembros de una Clase pueden adquirir atributos, en uno de los caminos,* por defecto a través del uso de un especificador de acceso: public ,private,

d i i protected.La sintaxis es:public :<declaraciones>private:<declaraciones>private:<declaraciones>protected :<declaraciones>Un miembro es publico, si puede ser usado p p

por cualquier función y también por el main(). En C++ son públicos los miembros de una t t ióestructura y una unión.Un miembro es privado, si únicamente puede ser usado por Funciones y Funciones amigas deser usado por Funciones y Funciones amigas dela clase, en la que es declarada. En una clase todos son por defecto, privados.

Ing. Daniel Osorio Maldonado 5

Page 6: Clases Objetos

Un miembro es protegido teniendo lasUn miembro es protegido, teniendo las mismas características de un miembro

áprivado; y además pueden ser usados por las clases derivadas.Una declaración amiga no es afectada por un especificador de accesoespecificador de acceso.

Ing. Daniel Osorio Maldonado 6

Page 7: Clases Objetos

/*programa que permite sumar los n primeros términos impares haciendo uso de class se usaratérminos 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

Page 8: Clases Objetos

void suma::leer(){Nnumero=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

Page 9: Clases Objetos

void suma::visualizar(){ cout<<“\nLa suma de los primeros "<<numero{ cout<< \nLa suma de los primeros <<numero

<<" Terminos es :"<<simpar;}

main(){SIsuma 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

}

Page 10: Clases Objetos

//Halla el semiperimetro y el área de un lTriangulo

#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

Page 11: Clases Objetos

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));lelse

cout<<"Los Lados No Forman un Triangulo ";}

Ing. Daniel Osorio Maldonado 11

}

Page 12: Clases Objetos

main(){fl t t i l t ifloat 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)<<endlp ( ,y, )<<"El Area del TRiangulo es "<<tri.Cal_Area(x,y,z)<<endl;return 0;}

Ing. Daniel Osorio Maldonado 12

Page 13: Clases Objetos

Constructores .-Una forma de asegurar que los objetossiempre contengan valores válidos para sus datos miembro essiempre contengan valores válidos para sus datos miembro esdeclarando un constructor de su clase. Un constructor es unafunción miembro especial de una clase que se llama así mismap qautomáticamente cuando se declara un objeto de esa clase.Su función principal es inicializar un objeto de su clase , porl l i l d l ió d á llo cual permite la declaración de parámetros valor.

Cuando en una clase no declara un constructor el compiladorCuando en una clase no declara un constructor ,el compiladorconsidera uno por defecto sin parámetros . Por tanto , si elobjeto es declarado en forma local, los datos miembro noj ,tiene valor definidos (nada) y si el objeto es declarado enforma global, inicializa los datos miembros numéricos con

l lf é i í lceros y los alfanuméricos como vacíos o nulos

Ing. Daniel Osorio Maldonado 13

Page 14: Clases Objetos

En la declaración, un constructor lleva el mismo nombre quela clase a la que pertenecela 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);

Page 15: Clases Objetos

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

}

Page 16: Clases Objetos

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;

Page 17: Clases Objetos

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;}}Observaciones1) Una clase puede tener varios constructores . Aplicando funciones sobrecargadas.2) Una forma de reducir el número de constructores es 2) Una forma de reducir el número de constructores es aplicando parámetro 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.

Page 18: Clases Objetos

4) Cuando un constructor tiene parámetros que sirven parainicializar los datos miembro de la clase se recomiendainicializar los datos miembro de la clase, se recomiendahacerlo a través del constructor si la inicialización se realizauna sola vez o a través de una función miembro. Si lainicialización puede realizarse más de una vez, de la siguientemanera:

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

Page 19: Clases Objetos

DestructoresUn destructor es una función miembro especial de una claseUn destructor es una función miembro especial de una clase

que se utiliza para eliminar un objeto de esa clase, liberandola memoria que ocupa un destructor se identifica fácilmente,la memoria que ocupa un destructor se identifica fácilmente,porque tiene el mismo nombre de la clase a la que perteneceprocedido por el símbolo ceja ~.

áUn destructor no puede tener parámetros, no puede retornarningún valor. Cuando en un destructor no se especificaexplícitamente un destructor el compilador crea uno porexplícitamente un destructor, el compilador crea uno pordefecto.Un destructor es invocado automáticamente cuando se saledel bloque al que es visible un objeto, excepto cuando elobjeto ha sido creado con el operador new ; para lo cual eld d lí é d ldestructor tiene que ser invocado explícitamente a través deloperador delete cuando se desea destruir el objeto.

Ing. Daniel Osorio Maldonado 19

Page 20: Clases Objetos

La función principal de un destructor es liberar la memoriadinámica que ha sido utilizado el objeto de una clase Si no sedinámica que ha sido utilizado el objeto de una clase. Si no seha asignado memoria dinámica; basta con el constructor pordefecto.

Características-Una clase derivada puede a su vez, ser una clase base ,dando lugar a una jerarquía 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 añadir sus propios datos yfunciones.

h l l l-La herencia cumple la ley transitiva.

Ing. Daniel Osorio Maldonado 20

Page 21: Clases Objetos

#include<iostream.h>#include<conio h>#include<conio.h>class cCuadro{

int ancho,largo;public:cCuadro(); //constructorC d (i t i t l) // t tcCuadro(int w,int l);//constructor

void cVisualizar();~cCuadro(){cout<<"\nDestruyendo el 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;}

Page 22: Clases Objetos

void cCuadro::cVisualizar(){cout<<"Ancho= "<<ancho<<' 'cout<< Ancho <<ancho<<

<<"Largo= "<<largo;}

main(){int p,q;C d 1 //P d f tcCuadro c1;//Por defecto

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);2 Vi li ()c2.cVisualizar();

getch();}

Ing. Daniel Osorio Maldonado 22

}

Page 23: Clases Objetos

PolimorfismoEs la característica mas importante de POO y consisteEs la característica mas importante de POO y consiste

fundamentalmente; en la capacidad de realizar una mismatarea pero de muchas formas distintas. El misterio de éstatarea pero de muchas formas distintas. El misterio de éstacaracterísticas radica en el momento de la compilación .Nose conoce la tarea que se realizará ; recién se les conoce en

ó éel momento de ejecución. A éstas tareas “misteriosas” se lesconoce con el nombre de virtuales ya que “aparentementeexisten ; pero realmente no hacen nada “existen ; pero realmente no hacen nada .

Características-Tiende ala creación de clases genéricas-Aplica obligatoriamente la característica de herencia para la

d f ó d l f lredefinición de las funciones virtuales.-Si la clase derivada no redefine una función virtual; seejecutará la función de la clase base

Ing. Daniel Osorio Maldonado 23

ejecutará la función de la clase base.

Page 24: Clases Objetos

Clases Abstractas / PlantillasUna clase es abstracta cuando establece la lógica de ejecuciónUna clase es abstracta cuando establece la lógica de ejecución

sin conocer aun los tipos de datos que se manejarán y enalgunos casos no se conoce el medio de almacenamiento. Paraello estas clases deben, estar preparadas para la aplicación delpolimorfismo con un ingrediente adicional: las funcionesvirtuales puras ¿qué es una función virtual pura? No es otravirtuales puras. ¿qué es una función virtual pura? No es otraque una función que solamente existe de nombre y que sudesarrollo recién se conoce en la clase derivadadesarrollo recién se conoce en la clase derivadacorrespondiente. Ctt inicializa a estas funciones virtuales puroscon O.Debemos tener presente que no se pueden declarar objetosde clase s abstractas ; éstas existen para derivarlas y construirnuestras propias clases particularesnuestras propias clases particulares.

Ing. Daniel Osorio Maldonado 24

Page 25: Clases Objetos

-Una función virtual en una clase base continúa siendo virtualUna función virtual en una clase base continúa siendo virtualcuando es heredada y su redefinición debe tener el mismonombre, número y tipo de parámetros y tipo de valor, y p p y pretornado que en la clase base.-En la clase base debe haber por lo menor una función que

t bl l i ló i d j ió d l l Lestablezca la secuencia lógica de ejecución de la clase .Lasfunciones que en la clase base aún no se pueden desarrollarse denominan virtuales y serán desarrolladas en las clasesse denominan virtuales y serán desarrolladas en las clasesderivadas correspondientes.-No se permite constructores virtuales.-Se recomienda un destructor virtual cuando una clase tienefunciones virtuales; aunque dicho destructor no haga nada.

Ing. Daniel Osorio Maldonado 25

Page 26: Clases Objetos

Sobrecarga de FuncionesSobrecarga de Funciones

Consiste en declarar una misma función varias vecesConsiste en declarar una misma función varias vecespero con distinto número y/o tipo de parámetro : Cuandoes invocada , el compilador a

á áCuál de las funciones llamar identificándolo por susparámetros además ; las funciones también podrían tenerdiferente tipo de resultado ; aunque no es obligatorio quediferente tipo de resultado ; aunque no es obligatorio quesea así.

Ing. Daniel Osorio Maldonado 26