M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
M.Abderrahim,A.Castro,J.C.Cas3lloDepartamentodeIngenieríadeSistemasyAutomá3ca
ProgramaciónOrientadaaObjetosyellenguajeC++
INFORMÁTICAINDUSTRIAL
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Repasodeconceptos
• POO:objetosquesecomunicanentresi• Objeto=datos+métodos• Clase:descripcióndeunconjuntodeobjetos• Caracterís3casdelaPOO• Abstracción:generalización• Encapsulamiento:“cajasnegras”• Herencia:“…esun3pode…”• Polimorfismo
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• POO:objetosquesecomunicanentresi• Objeto=datos+métodos• Clase:descripcióndeunconjuntodeobjetos• Caracterís3casdelaPOO• Abstracción:generalización• Encapsulamiento:“cajasnegras”• Herencia:“…esun3pode…”• Polimorfismo
Repasodeconceptos
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• ClaseRectangulo• Atributos:altura(real),anchura(real)• Métodos:
• voiddibujar()• voidrotar(real)• Constructores:
• Rectangulo(real,real)• Rectangulo(real)
• Instanciación:• rect1=Rectangulo(3.3,5.6)
ConceptosdePOO:Ejemplo2
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• C++fuediseñadoapar3rdeC,yconpocasexcepciones,losprogramasCsonprogramasC++.
• EldiseñodeCsebasóenexpresividadyeficiencia.• El diseño de C++ hace énfasis en la estructuración (sin
perdereficiencia):• Orientaciónaobjetos.• Programacióngenérica.• Abstraccióndedatos.• Estructuración y modularización medianteespaciosdenombres.
• Manejodeexcepciones(errores).
LenguajeC++
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• B.Stroustrup(AT&TBellLaboratories),principiosdelos80.
• Herederode“C”,queesherederode“B”(Richards1980)ydeSimula67.• C,especificaciónformal1997(RitchieyKernighan).
• EstandarizaciónANSI.Terceraediciónde“TheC++ProgrammingLanguage”(1997).
Historia
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• HolaMundo
#include<iostream>usingnamespacestd;//miprimerprogramaC++intmain(){ cout<<"HolaMundo!"<<2014<<"\n";}
PrimerProgramaenC++
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• Direc3vainclude:2variantes#include<cabecera>#include“ficherofuente”
• LasegundaformanovaríaconellenguajeC.• LaprimeraformaesdiferenteaC.Unacabecerano3enequecorresponder
necesariamenteconunfichero,aunqueeslohabitual.#include<stdio.h>//C#include<iostream>//C++
• C++incluyelalibreríaestándardeC#include<cstdio>
• Sesiguepudiendousar#include<iostream.h>,peronoserecomienda.
Cabeceras
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• iostream:Bibliotecaestándardeentrada/salida.• cout:Canaldesalidaestándar.• cin:Canaldeentradaestándar.• std:Espaciodenombresdondesedeclarantodoslosiden3ficadoresdelabibliotecaestándar.• Parausaruniden3ficadorcomocoutsedebeescribirstd::coutencadaocurrenciaobienescribirunasolavezusingnamespacestd;alprincipiodelprograma.
• Uso:cout<<expresión;cin>>variable;//¡¡Ojo!!Sin&.
Entrada/Salida
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
TiposdeDatosenC++
• Tipospordefecto(int,char,etc)• Apar3rdelosanteriores,sepuedenconstruir:• 3pospunteros(ej.int*)• 3posarray(ej.char[])• 3posreferencia(ej.double&)• EstructurasyClases.
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Ámbito
• Unadeclaraciónintroduceunnombredentrodeunámbito,ysólosepuedeusarenesteámbito.
• Operadordeaccesooresolucióndeámbito::
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• Unespaciodenombresesunámbitoconnombre.• Ayudaaevitarlascolisionesdenombres.• Seusaladirec3vausingparaañadirunespaciodenombresala
listadeámbitosqueseestáusando.usingnamespacestd;
• Relaciónentreespaciosdenombresycabeceras:#include<iostream.h>
equivalea(recomendable):#include<iostream>usingnamespacestd;
• Ejemplo:hxp://www.cplusplus.com/doc/oldtutorial/namespaces/
Espaciosdenombres
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Referencias
• Unareferenciaesunnombrealterna3voparaunobjeto.
• Suusoprincipalestáenelpasodeparámetrosyvaloresderetornoafunciones.
• Notación:X&esunareferenciaal3poX.
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Referencias
• Debeninicializarseensudeclaración:
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• Losoperadoresqueseaplicanaunareferenciaafectanenrealidadalobjetoreferenciado.
• Similaraunpuntero(constante)quesederreferenciaautomá3camentecadavezqueseusa.
Referencias
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• Unaparámetropasadoporreferenciapermitecambiarlo.
• Lasemán3caeslamismaqueenlainicialización.Enelejemplo,aesotronombreparax.
• Hacemáseficienteelpasodeparámetrosyaquenosecopiaelvalordelparámetro.
Referencias
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• Unareferenciadevueltaporunafunciónsepuedemodificar.
• Muyú3lparadefinirysobrecargaroperadores(ej.:cout<<“a”<<3;)yparaencadenarllamadas:fecha1.add_day(1).add_year(2);
Referencias
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
EstructurasyClases
• Supongamosquesequieredefinirun3podedatoFechadelasiguienteforma:
structFecha{intd,m,a;
};voidinic(Fecha*f,intd1,intm1,inta1){
f->d=d1;f->m=m1;f->a=a1;
}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
EstructurasyClases
• SupongamosquesequieredefinirunTADFecha,ahoraconreferencias:
structFecha{intd,m,a;
};Fecha&inic(Fecha&f,int,int,int);Fecha&sumarDia(Fecha&f,int);Fecha&sumarMes(Fecha&f,int);Fecha&sumarAno(Fecha&f,int);
Fecha&sumarAno(Fecha&f,inta){
f.a+=a;//esf.a=f.a+areturnf;
}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
EstructurasyClases
• EnC++,sepuede(yesmásintui3vo)declararlasfuncionesdemanipulacióndentrodelaestructura:
structFecha{intd,m,a;Fecha&inic(intd1,intm1,inta1);Fecha&sumarDia(intd1);Fecha&sumarMes(intm1);Fecha&sumarAño(inta1);
};Fecha&Fecha::inic(intd1,intm1,inta1){
d=d1;m=m1;a=a1;return*this;//Operadordeámbito
}Fecha&Fecha::sumarDia(intd1){
d+=d1;return*this;
}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• Lasfuncionesdeclaradasdentrodeclases(lasestructurassonun3podeclase)sellamanfuncionesmiembro,ysellamandelasiguienteforma:
Fechami_cumple,hoy;Fecha*pfecha;hoy.inic(4,10,2010);mi_cumple.inic(5,1,1984);mi_cumple.sumarDia(1);//Equivalentemi_cumple.inic(5,1,1984).sumarDia(1);Fechamanana=hoy;manana.sumarDia(1);pfecha->sumarMes(3);
EstructurasyClases
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• Lasclasessonmuyparecidasalasestructuras
• Unaestructuraesunaclaseenlaquelosmiembrossonpúblicospordefecto.Enunaclaselosmiembrossonprivadospordefecto.
• Lasestructurasnopermitenencapsulamientoniherencia
classcomplex{
doublereal;doubleimag;
voidestableceValor(floatre,floatim);floatobtenModulo(void);voidimprime();
};
EstructurasyClases
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
EstructurasyClases
● ¿Cómo se declaran miembros públicos y privados de unaestructura/clase?
classcomplex{
doublereal;doubleimag;
voidestableceValor(floatre,floatim);floatobtenModulo(void);voidimprime();
};
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Encapsulamiento
classlistaNumeros{private:intnum;intlista[100];public:intagregarNumero(intval);intextraerNumero(intind);intnumeroNumeros(void);listaNumeros(void);};
voidmain(){listaNumerosmilista;inti,val=1;while(val!=0){cout<<"Introduzcaunnumero(finalizarcon0):";cin>>val;if(val!=0)val=milista.agregarNumero(val);}cout<<"\nLalistadenúmeroseslasiguiente:\n";for(i=0;i<milista.numeroNumeros();i++)cout<<milista.extraerNumero(i)<<"";cout<<"\n*********FINDELPROGRAMA**********\n";}
● Lograrquecadaobjetosecomportedeformaautónomayloquepaseensuinteriorseainvisibleparaelrestodeobjetos
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• Miembrospúblicos,privadosyprotegidos.• Pordefecto:privados
• Interfazpúblicadeunaclase:miembrospúblicos(datosymétodos).• Sepuedeninvocardesdefueradelaclase.
• Ejemplo(claseRectangulo)• Datos:
• privadoaltura(real)• privadoancho(real)
• Métodos:• públicovoiddibujar()• públicovoidgirar(real)
• Constructores:• públicoRectangulo(real,real)• públicoRectangulo(real)
Encapsulamiento
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
CreaciónyDestruccióndeObjetos
• Equivalenciadeconceptosconprogramaciónclásica:• Tipo⇔Clase• Dato⇔Objeto• Variable:existeenambos3posdeprogramación.
• Creación(usodelconstructor):• Ejemplo:
• rect1=Rectangulo(1,2),rect2=Rectangulo(3.5)• Destrucción(usodeldestructor)• Explícita(heap)oautomá3ca(stack)(C++).• Automá3ca(JavaoPython,Garbagecollec5on).
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• Constructores• Funcióninicializadora• Esunafunciónquenodevuelvenadayquesellamaigualquelaclase.
• Nosehereda.• Existentres3posfundamentales(sobrecarga):
• Constructorvacio• Constructorparametrizado
• Sirveparaasignarunvaloralosatributosenlacreación.• Constructordecopia
• Sirveparacrearunobjetoqueseacopiadeotro.• Destructores• Funcióndeeliminación
CreaciónyDestruccióndeObjetos
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Constructores
• El uso de métodos como inic() es pocoeleganteypropensoaerrores.
• Constructor: un método con el propósito deinicializar un objeto. Tiene el nombre de laclase
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Constructores
classFecha{intd,m,a;
public:Fecha(intdd,intmm,intaa);
};Fecha::Fecha(intdd,intmm,intaa){
d=dd;m=mm;a=aa;
}intmain(){
Fechan=Fecha(10,2,1986);Fecham(10,2,1986);Fecha*k=newFecha(10,9,2003);…………..deletek;
}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
CopiadeObjetos
• Pordefecto,losobjetossepuedencopiar.• Se puede inicializar un objeto con la copiadeotro.
• Pordefectosecopiacadaatributo: Fechahoy=m;
• Sinoesloquesequiere,sehadedefinirunconstructorcopia.
• También se llama en argumentos demétodosyvaloresderetorno
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
classFecha{intd,m,a;
public:Fecha(intdd,intmm,intaa);Fecha(constFecha&fe);
};Fecha::Fecha(constFecha&fe){
d=fe.d+1;// se puede introducir modificaciones al // copiar elementos
m=fe.m;a=fe.a;
}intmain(){
Fecham(10,2,1986);Fechahoy=m;// También: Fecha m(hoy);
}
CopiadeObjetos
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• ¿Cómopodemosevitarqueunobjetosepuedacopiar?Esdecir,evitarexpresionesdel3po:
Fechahoy=m;
¿Solución?
CopiadeObjetos
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Solución
classFecha{intd,m,a;
public:Fecha(intdd,intmm,intaa);
private:Fecha(constFecha&fe);
};Fecha::Fecha(constFecha&fe){
d=fe.d+1;// se puede introducir modificaciones al copiar // elementos
m=fe.m;a=fe.a;
}intmain(){
Fecham(10,2,1986);Fechahoy=m;//error no se puede acceder
//al miembro privado}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Múl3plesconstructores
classFecha{intd,m,a;
public:Fecha(intdd,intmm=1,intaa=2014):d(dd),m(mm),a(aa){}Fecha():d(0),m(0),a(0){}Fecha(floatdd);
};
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
ConstructoresParámetrospordefecto,inicialización,conversionesimplícitas
#include<iostream>usingnamespacestd;
classFecha{intd,m,a;
public:Fecha(intdd,intmm=1,intaa=2014):d(dd),m(mm),a(aa){}Fecha(intdd,intmm=1,intaa=a);//¿válido?
};intmain(){
Fechan=2;//EquivalenteaFechan(2);Fechap(5,6);Fecham(3);Fechaq=Fecha(2);
}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Destructores
• Sellamancuandounobjetosedestruye,ysirvenporejemploparaliberarmemoriaquesehayareservadodurantelavidadelobjeto.
• Normalmenteelcompiladorlosllamaimplícitamente.
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
#include<iostream>usingnamespacestd;classBloque{inttamano_b;char*b;public:Bloque(inttam):tamano_b(tam){b=newchar[tam];cout<<"constructor1"<<endl;}Bloque(constBloque&bl){b=newchar[tamano_b=bl.tamano_b];cout<<"constructor2"<<endl;}~Bloque(){//destructordelete[]b;cout<<"Dstructor"<<endl;}};
voidmain(){Bloque*b=newBloque(10);Bloquec=*b;deleteb;cout<<"Adios!"<<endl;}
Destructores
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Ejecucióndemétodosmiembro
• Un método es una definición de unafunciónpertenecienteaunaclase.• Sedicequeunmétodoseejecutacuandoelobjeto recibe un mensaje de ejecución delmétodo.
• Puedeaccederaotrosmiembros (públicosoprivados)delaclase.
• Ejemplo.Objetorect1(Rectangulo):
Rectangulorect1=Rectangulo(3.5,2.9);rect1.girar(30.5);
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
ClasesInvocacióndeMétodos
• objeto.metodo(args),siobjetonoesunpuntero:Fechaf(1,10,1492);
f.sumarAño(515);
• p_objeto->metodo(args),sip_objetoesunpuntero:Fecha*d=newFecha(1,10,1492);d->sumarAño(515);
• objetooperadorargumentoFechad(1,10,1492);cout<<“unafecha“<<d+1<<endl;
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
OrganizacióndeFicheros
• DeclaracióndeunaclaseXen“X.h”.• Definicióndesusfuncionesmiembroen“X.cpp”.
• Regladedefiniciónunasolavez:inclusióncondicionaldecódigoparaevitarerrores.
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Ejemplo:ClaseDado
/*Dado.h*Createdon:17/05/2010*Author:wladimir*/#ifndefDADO_H_#defineDADO_H_classDado{public:
voidlanzar();intgetValorCara();
private:intvalorCara;
};#endif/*DADO_H_*/
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Ejemplo:DefiniciónmétodosmiembrosdelaClaseDado
/*Dados.cpp*Createdon:17/05/2010*Author:wladimir*/#include“Dado.h“#include<stdlib.h>voidDado::lanzar(){
valorCara=((rand()%6)+1);}intDado::getValorCara(){
returnvalorCara;}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Ejemplo:ClaseJuegoDados
/*JuegoDados.h*Createdon:17/05/2010*Author:wladimir*/#include“Dado.h"
#ifndefJUEGODADOS_H_#defineJUEGODADOS_H_
classJuegoDados{public:
booljugar();private:
Dadodado1;Dadodado2;
};
#endif/*JUEGODADOS_H_*/
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Ejemplo:DefiniciónmétodosmiembrosdelaClaseJuegoDados
/*JuegoDados.cpp*Createdon:17/05/2010*Author:wladimir*/#include“JuegoDados.h"#include“Dado.h"
boolJuegoDados::jugar(){dado1.lanzar();dado2.lanzar();return((dado1.getValorCara()+dado2.getValorCara())==7?true:false);}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Ejemplo:ProgramadePrueba
/*JugarDado.cpp*/#include<iostream>#include<stdio.h>#include"JuegoDados.h”usingnamespacestd;intmain(){boolganarPartida,continuarJuego=true;chartecla;JuegoDadoselJuego;cout<<"\nJuegodedados,lanzardosdadosysumar7paraganar\n";while(continuarJuego){cout<<"\nPulsarcualquierteclaparalanzardados\n";cin>>tecla;ganarPartida=elJuego.jugar();if(ganarPartida)cout<<"Haganado.\n";elsecout<<"Haperdido.\n";cout<<"\nDeseajugarotravez,pulseC\n";cin>>tecla;continuarJuego=(tecla=='c')||(tecla=='C')?true:false;}cout<<"Seterminoeljuegodedados.Unsaludo\n”}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Funcionesinline
• Op3mizacióndelaeficienciaacostadeltamañodelprogramaejecutable.
• Si se puede se sus3tuyen directamente en elcódigo;noserealizalallamadaalafunción.
• Los métodos definidos dentro de la definicióndeclasesetomancomoinline.
• Estosedebereservaramétodospequeñosqueseusanfrecuentemente.
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Ejemplo
inline int f(int x) { return x * (x+1); }
int main () { int x = 2;int y = f(x);int z = f(y);
}
int main () { int x = 2;int y = x*(x+1); // Pero no es una simple sustitución de texto int z = y*(y+1);
}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• Seaconsejasuusoenlugarde#define• Ventajas:– nodanlugaraerroressintác3cos
ej:#definedoble(a)a+a
– Hacencomprobaciónde3pos
Funcionesinline