Está en la página 1de 0

Jos Mara Torresano

entornos.jmt@gmail.com
Octubre 2008
Diseo y Realizacin de Servicios de
Presentacin en Entornos Grficos
2008 {jmtorresano}
2008 {jmtorresano}
Empezando
//UnpequeoprogramaenC++
#include <iostream>
int main()
{
std::cout <<"BienvenidoaC++"<<std::endl;
return 0;
}
Funcin main. Obligatoria.
Requiere devolver un tipo int.
Algunos compiladores advierten
si es del tipo void
Biblioteca estndar
Si no aparece, y maindevuelve
un int, el estndar dice que el
compilador devolver 0
Nombre de espacioestndar.
:: operador de mbito o alcance
<<operador de salida.
Manipulador
2008 {jmtorresano}
Archivo1.exe
Compilacin y lincado
ENTORNO USUARIO
Archivo1.cpp
Archivo1.h
Archivo2.cpp
Archivo2.h
Archivo.h
Archivo.lib
MiLib.lib
COMPILADOR
Archivo1.obj
Archivo2.obj
Lincador
MiLib.h
2008 {jmtorresano}
Compilacin y lincado
Siexistenreferenciascruzadasentrelosarchivosdecabecerayen
ellossedefinentiposdedatos(estructuras,clases,definiciones
globales,elcompiladorllamarmsdeunavezalamisma
cabeceraporloqueseproducirunerrordecompilacin.
#ifndef _MI_NOMBRE_DE_ARCHIVO_H
#define_MI_NOMBRE_DE_ARCHIVO_H
Contenidodelarchivodecabecera
#endif
Guarda que evita
que un archivo de
cabecera se compile
ms de una vez
2008 {jmtorresano}
Tipos
bool
Tipointernoquerepresentavaloresbooleanos(t r ue of al se)
unsi gned
Tipoenteroquecontieneslovalorespositivos.
shor t
Tipoenteroquedebeconteneralmenos16bits.
l ong
Tipoenteroquedebeconteneralmenos32bits.
si ze_t
Tipoenterosinsigno(de<cst ddef >)queguardael
tamaodecualquierobjeto.
st r i ng: : si ze_t ype
Tipoenterosinsignoqueguardaeltamaodecualquiercadena.
2008 {jmtorresano}
El tipo string
st d: : st r i ng s;
Sin esunentero,c uncarcter,is esunflujodeentradayos unflujodesalida,entonceslas
operacionesconstring incluyen:
Defines comounavariabledeltipostd::string vacia.
Eltipostring sedefineenlacabeceraestndar<string>.
Unobjetodeltipostring esunasecuenciadeceroomas
caracteres.
st d: : st r i ng t = s;
Definet comounavariabledeltipostd::string quecontiene
unacopiades.s puedeserunliteralounstd::string.
st d: : st r i ng z( n, c) ;
Definez comounavariabledeltipostd::string quecontiene
ncopiasdelcaracter c.
2008 {jmtorresano}
El tipo string
os << s;
Escribeloscaracteresdes,sincambiodeformato,enelflujo
definidoporos.Elresultadodelaexpresinesos.
i s >> s;
Leeydescartacaracteresdelflujois hastaqueencuentraun
carcterquenoesespacioenblanco.Leelossiguientescaracteres
ylosguardaens,sobrescribiendoelvalorquetenga,hastaque
encuentraunespacioenblanco.Elresultadodelaexpresinesis.
s + t ;
Elresultadoesunstd::string quecontieneunacopiadelos
caracteresensseguidosdelascaracteresent.Cualquieradelas
2puedeserunaexpresinliteralouncaracter,peronoambas.
s. si ze( ) ;
Elnmerodecaracteresens.
2008 {jmtorresano}
El tipo vector
vect or <T>: : si ze_t ype
Untipoquegarantizaquepuedeguardarel`nmerode
elementosdelvectormasgrandeposible.
Eltipovector,definidoen<vector>,esuntipodelabiblioteca
queesuncontenedorquecontieneunasecuenciadevalores
deltipoespecificado.Crecedinmicamente.
v. begi n( )
Devuelveelvalorqueidentificaeliniciodev.
v. end( )
Devuelveelvalorqueidentificaelfinaldev.
vect or <T> v;
CreaunvectorvacioquepuedealbergarelementosdeltipoT
2008 {jmtorresano}
El tipo vector
v. push_back( e)
Agregaalfinaldelvectorelelementoe.
v. si ze( )
Devuelveelnmerodeelementosdev.
v. capaci t y( )
Devuelveeltamaoreservadoparaelvectorv.
V[ i ]
Accedealvaloralmacenadoenlaposicini delvector.
v. at ( i )
Accedealvaloralmacenadoenlaposicini delvector.
v. pop_back( )
Eliminaelltimoelementodelvectorv.
2008 {jmtorresano}
Punteros
Puntero
Unavariablequeguardaladireccindeotravariable.
int x,y;
int*p1;
int*p2;

p1=&x;
p2=&y;
p1=p2;
x
y
p1
p2
&
Operadorunariodireccinde
2008 {jmtorresano}
Punteros. Tipos
Declaracindeunavariabletipopunterodonde
T indicaeltipodevariablequeseapunta
T*p;
Punterosatiposestndar int*pi;
Punterosaclases MiClase*pc;
Punterosaarrays int p[10];
Punterosafunciones int (*pf)(void);
Punterosapunteros int**pp;
Punterosacualquiertipo void*p;
2008 {jmtorresano}
Punteros. Operaciones
Tomarladireccindeunobjeto
&objeto;
Desreferenciar:tomarelvalordelobjetoapuntado
porpuntero
*puntero;
puntero+i;
puntero i;
puntero++;
puntero;
ptr1 ptr2;
Aritmtica
2008 {jmtorresano}
Punteros y constancia
PunteroaunobjetodeltipoT.Sinrestriccionesdeaccesoal
objetoapuntado
T*ptr;
PunteroaunobjetoconstantedeltipoT.Nosepuedeutilizar
prt paramodificarlo
const T*ptr;
PunteroconstanteaunobjetodeltipoT.Nosepuede
modificarprt.Sedebeinicializar
T*const ptr =&v;
PunteroconstanteaunobjetoconstantedeltipoT.Nosepuede
modificarprt (sedebeinicializar)nielobjetoalqueapunta.
const T*const ptr =&v;
2008 {jmtorresano}
Referencias
Referencia
Sinnimooaliasdeunobjeto.
T&r=obj;
int x,y;
int&r1=x;
int&r2=y;

r1=7;
x=8;
r1=r2;//NO
x
y
r1,
r2,
7
8
Declaracindeunareferenciaaunobjeto
deltipoT .obj eselobjetoquesereferencia
2008 {jmtorresano}
Referencias. Reglas
LasreferenciasNOson OBJETOS,SIno ALIAS aotrosobjetos
NOhaypunterosareferencias
NOhayarrays dereferencias
NOhayreferenciasareferencias
NOhayreferenciasconstantes
NOhayoperadoresparalasreferencias
2008 {jmtorresano}
Punteros vs Referencias
Punteros Referencias
Sintaxis Sedebendeclararexpresamente
Estatus Sonobjetos ocupanmemoria Nosonobjetossinosinnimos
Valor Sus valoressondirecciones No tienevaloresporsi
Inicializacin Sepuedennoinicializar Se debeninicializar.
Operadores Eloperadordedireccin& Notienen operadoresespecficos
2008 {jmtorresano}
> > > > > > > > > > > >
>>>>>>>>>>>>
Flujos
LasentradasysalidasenC++serealizanmedianteflujos(streams).
Unflujo esunobjetoquehacedeintermediarioentreelprograma
yelorigenodestinodelainformacin.
Programa
Origen
Destino
2008 {jmtorresano}
Flujos
Eltipo bsicoparalasentradasysalidasenC++eselstream.C++
incorporaunajerarquacomplejadetiposstream.Lostiposms
bsicosdestrems son:
variableinternadeentradaunida,pordefecto,alteclado. istream cin
variableinternadesalidaunida,pordefecto,alaconsola.
ostream cout
Ambosseencuentranenlacabecera<iostream> ynamespace std
C++tambinsoportatodoslosmecanismosdeentrada/salida
incluidosenellenguajeC.Sinembargo,losstreams proporcionan
lascapacidadesdeCconmejorassustanciales.
En C++utilizaremossiemprestreams
2008 {jmtorresano}
Flujos
<ios>
ios_base
ios
<istream>
istream
iostream
<ostream>
ostream
<streambuf>
streambuf
<iostream>
cin
cout,cerr,clog
<fstream>
ifstream
fstream
ofstream
filebuf
<sstream>
istringstream
stringstream
ostringstream
stringbuf
2008 {jmtorresano}
Flujos
Losstreams entradaysalida,cin ycout sonrealmenteobjetos
C++mientrasqueistream yostream sonclases.Estoes,por
ejemplo,cin eselnombredeunavariabledeltipoistream.
Unstream proporcionaunaconexinentreelprocesoquelo
inicializayunobjeto,talcomounarchivo,quepuedeversecomo
unasecuenciadedatos.Simplificando,unobjetostream es
sencillamenteunavistaserializadadeeseotroobjeto.Porejemplo
Estoes

Objeto
stream
Estoesuna
lnea.Esta
esotra
Archivo de entrada
Proceso
ejecutndose
Los datos del stream no se pueden perder
desbordndose antes de que el programa
tenga oportunidad de cogerlos
Pensamos en datos fluyendo por el flujo hacia
el proceso el cual puede coger datos del
stream cuando lo desee.
2008 {jmtorresano}
El operador insercin <<
Paramostrarinformacindeunarchivooprograma,necesitamospedirle
explcitamentealordenadorquemuestrelainformacindeseada.Unaformade
hacerestoenC++esconunstream desalidayeloperadorinsercin.
#i ncl ude <i ost r eam>

const st r i ng f r ase = Nmer o de al umnos: ;


i nt numer oPer sonas = 12;
st d: : cout << f r ase << numer oPer sonas << endl ;
Nmerodealumnos:12
Directiva de
precompilado
A la izquierda debe
aparecer el nombre de
un stream de salida
Las inserciones puede estar
encadenadas
endl es un manipulador utilizado
para formatear los valores de
entrada/salida
Noseproporcionaformateoespecialpordefecto:alineados,nuevaslneas,
anchos,etc.losdebeproporcionarelprogramador.
2008 {jmtorresano}
El operador extraccin >>
Paraobtenerinformacindeunarchivooprograma,necesitamospedirle
explcitamentealordenadorqueobtengalainformacindeseada.Unaformade
hacerestoenC++esconunstream deentradayeloperadorextraccin.
#i ncl ude <i ost r eam>

i nt numer oPer sonas;


doubl e ki l os;
st d: : ci n >> numer oPer sonas >> ki l os;
Directiva de
precompilado
A la izquierda
debe aparecer el
nombre de un
stream de entrada
Las extracciones puede
estar encadenadas
El operador de extraccin es lo suficientemente
listo como para tener en cuenta la variable de
destino y determinar como leer del stream de
entrada
Eloperadorextractorsepuedeutilizarparaleercadenasterminadasen
caracteresenblanco enunavariablestring ignorandolosespaciosquela
precedenysinincluirelespacioconquetermina.
2008 {jmtorresano}
El operador extraccin >>
Nombre Cdigo
Nuevalnea \n
Tabulador \t
Blanco (espacio)
Retorno decarro \r
Tabuladorvertical \V
Enprogramacin,loscaracteresquenoproducenunaimagenvisibleenuna
pginaoenunarchivoselesllamacaracteresenblanco
Los caracteres en
blanco ms comunes
Pordefecto,eloperadorextraccinenC++quitarlosespaciosenblancodel
stream queprecedanaloscaracteresnormales.Sinecesitamosleerlos,hayque
utilizarlafuncinget ( )
Ver ms adelante
Eloperadorextraccinnoconsumeelseparadorposterior
2008 {jmtorresano}
Flujo de entrada
Paradescartaryremovercaracteresdelflujodeentradasepuedeutilizar:
ci n. i gnor e( n, ch) ;
Lee y descarta los siguientes 80
caracteres o lee y descarta caracteres
hasta leer uno de nueva lnea, lo que
llegue primero
ci n. i gnor e( 80, \ n ) ;
i gnor e( )
Dadoqueseutilizanentradas/salidasconbufferesposiblequelassalidasnose
reflejaninmediatamenteenelmonitor.Paraasegurarsequelasalidasemandaa
sudestinatariodeinmediato,sepuedeutilizarf l ush
f l ush
cout << I nt r oduce el dat o: << f l ush;
ci n >> dat o;
Elmanipuladorendl incluyeunf l ushimplicito
Consumir un caracter
ci n. i gnor e( ) ;
2008 {jmtorresano}
Flujos en para E/S de archivos
C++proporcionatiposstream paraaccederalosarchivosalmacenadosendisco.
Lamayoria delasveces,funcionanexactamenteigualquelosstream deE/S
extandar (cin ycout )
#i ncl ude <f st r eam>

i f st r eam ar cEnt ;
of st r eam ar cSal ;

ar cEnt . open( l eeme. t xt ) ;


ar cSal . open( escr i beme. t xt ) ;
Directiva de
precompilado
No existen variable
predefinidas para
stream de archivos.
Debemos declararlas
Los objetos stream de archivos no
estn conectados a nada por lo que
para utilizarlos debemos establecer una
conexin entre ellos y los archivos
Los objetos stream de archivos
cuentan con los mismos miembros
que cin y cout
Para el flujo de entrada, si el
archivo no existe el sistema no lo
crear y el objeto tendr activado
el flag de error
Para el flujo de salida, si el
archivo especificado no existe
el sistema lo crear.
2008 {jmtorresano}
Flujos en para E/S de archivos
#i ncl ude <f st r eam>

i f st r eam ar cEnt ( l eeme. t xt ) ;


of st r eam ar cSal ( escr i beme. t xt ) ;

st r i ng nomAr c = QueMeLeas. t xt ;
i f st r eam ar cLec( nomAr c. c_st r ( ) ) ;
Otra forma de conectar los
streamcon los archivos
Si utilizamos variables string para
almacenar los nombres de los archivos,
debemos convertirlas a cadenas del
tipo C para poder utilizarlas para
conectar los streams
Otra mas
2008 {jmtorresano}
Flujos en para E/S de archivos
Cuandounprogramanonecesitaunarchivo,debecerrarloutilizandoelmtodo
close() asociadoconcadaobjetostream dearchivo.
ar cEnt . cl ose( ) ;
ar cSal . cl ose( ) ;
La llamada a close()notifica al
SO que el programa ya no necesita
el archivo. El sistema liberar los
buffers, actualizar el estado del
archivo, etc.
Sin incluir
el nombre
del archivo
SiempreesmejorcerrarexplcitamentelosarchivosaunqueC++loscierre
automticamentecuandolasvariablesstream dearchivossalganfuerandesu
mbito.
2008 {jmtorresano}
Formateo de salidas numricas
set w( n) :
Ponelaanchuradelcampo(nmerodeespacioselquesemuestrael
valor.n debeserentero.Sloseaplicaalasalidadelsiguientedato.
set pr eci si on( n) :
Ponelaprecisin,elnmerodedgitosquesemuestrandespusdela
comadecimal.n debeserentero.Seaplicahastaqueseencuentraotro
set pr eci si on( ) .
Adems,paraactivarelmanipuladorset pr eci si on( )
debesinsertarlos2siguientesmanipuladoresunavez.
Sinoesas,set pr eci si on( ) fallaryharquelos
valoresrealescon0enlapartedecimalnoseimpriman.
f l uj o << f i xed << showpoi nt ;
Otrosmanipuladorestilesyusofcilmentededucible:
bi n,hex,oct al ,dec,sci ent i f i c,.
#i ncl ude <i omani p>
2008 {jmtorresano}
Justificacin
Lajustificacinpordefectoenloscampodesalidaesaladerechaconrellenoa
laizquierda.Paracambiarlo:
Justificacin Alinearlosdatoshorizontalmente
cout << f i xed << showpoi nt ;
st r i ng nombr e = Pi capi edr a, Pedr o;
doubl e sal ar i o = 8. 56;
doubl e hor as = 45. 2;
cout << 012345678901234567890123456789 <<endl;
cout << l ef t ; / / j ust i f i caci n i zqui er da
cout << set w( 20) << nombr e;
cout << r i ght ; / / j ust i f i caci n der echa
cout << set w( 10) <<set pr eci si on( 2) << sal ar i o * hor as << endl ;
012345678901234567890123456789
Picapiedra,Pedro386.91
2008 {jmtorresano}
Relleno
Elrellenopordefectoenloscampodesalidaeselespacioenblanco.Sepuede
cambiarconelmanipuladorset f i l l ( )
Relleno
Caracteresutilizadospararellenarelespacionoutilizadodel
campodesalida
i nt I D = 423562;
cout << 0123456789 <<endl;
cout << set w( 10) << I D << endl;
cout << set f i l l ( 0 ) ; / / r el l enar con cer os
cout << set w( 10) << I D << endl;
cout << set f i l l ( ) ; / / r eset a espaci os
0123456789
423562
0000423562
2008 {jmtorresano}
Fallo en la entrada
Cuandointentamosleerunvalordeunstream deentrada,eloperadorextractor
ootrasfuncionesdeentradatienenencuentaeltipovariablequevaaguardar
eldato.Sihayunaconversinpordefectoentrelosdatosdelstream yla
variablededestino,nohayproblema.
Enelcasodequenoexistaolaentradaseaincompatibleconeltipodela
variablequeladebeguardar,seproduceunfalloenelstream deentrada.El
efectoquetieneelfalloenlavariabledestinodependedelcoimpilador.En
VisualC++,lavariablenormalmentenosemodifica(string eslaexcepcin)
Lavariablestream activaunflag internoindicandoelestadodefallo.Los
consiguientesintentosdeleerdelstream fallarn.Esresponsabilidaddel
programadordisearsucdigoparaquegestioe estetipodeerrore.s
2008 {jmtorresano}
Leyendo de flujos
while (cin >> x)
bloque
Leeunvalordeltipoapropiadoenx y
compruebaelestadodelflujode
entrada.Sielflujoestenunestadode
error,lacomprobacinfalla;encaso
contrario,seejecutaelcuerpodelwhile.
Hayvariasformasdequeintentarleerdeunflujoconlleveunerror:
1. Hemosllegadoalfinaldelarchivodeentrada.
2. Hemosencontradounaentradaqueesincompatibleconel
tipodevariablequeintentamosleer.
3. Elsistemahadetectadounfallodehardwareeneldispositivo
deentrada.
2008 {jmtorresano}
Flujo de entrada
Funcindelabibliotecaestndarparaleercaractereshastaundelimitador
get l i ne( )
istream&getline (istream& is,string& str );
istream&getline (istream& is,string& str,char delim );
Lee desde la posicin actual
hasta el carcter de nueva
lnea \n. Incluye los
posibles caracteres al inicio.
Igual que la des dos argumentos pero ahora le
pasamos el carcter en el que debe parar
Eldelimitadoro\nseeliminandelstream peornoseincluyeenlavariabledestino
Seleccionandoelcarcterapropiado,lafuncinget l i ne( ) puedeleertexto
formateadocondelimitadoresconocidos.
2008 {jmtorresano}
Flujo de entrada
Funcindelstream deentradaparaleercaracteres.
get ( )
int get ();
istream&get (char& ch);
istream&get (char* s,streamsize n);
istream&get (char* s,streamsize n,char delim);
istream&get (streambuf& sb);
istream&get (streambuf& sb,char delim);
Funcindelstream queproporcionaun
mtododeexaminarelsiguientecarcterdel
stream deentradasinremoverlodel.
peek( )
Funcindelstream queproporcionaun
mtododedevolveruncarcteralstream
deentrada.
put back( )
char si gui ent eCar ;
si gui ent eCar = ci n. peek( ) ;
char si gui ent eCar = ? ;
ci n. put back( si gui ent eChar ) ;
2008 {jmtorresano}
Flujos
Manipuladores
Sonobjetosespecialescuyassalidasmanipulanlosflujos.
std::flush std::ostream Limpiaelbufferdesalida.
std::endl std::ostream Escribeun\nylimpiaelbufferdesalida
std::ends std::ostream Escribeun\0ylimpiaelbufferdesalida
std::ws std::istream Saltalosespaciosenblanco
Mani pul ador Cl ase Si gni f i c ado
2008 {jmtorresano}
Flujos
Estatus
Pararepresentarlascondicionesdelflujoseutilizanconstantesdebit(flags)
goodbit Todoestperfecto
eofbit Findearchivo
failbit Fallo:error,peroelflujoesutilizable
badbit Errorfatal:nosepudeutilizarelflujo
Const ant es bi t Si gni f i c ado
good() Todoestperfecto(seactivaios::goodbit)
eof() Findearchivo(seactivaios::eofbit)
fail() Fallo(seactivaios::failbit oios::badbit)
bad() Errorfatal(seactivaios::badbit)
rdstate() Devuelvelosbitdeestadoactivadosenesemomento
clear() Borraoactivabitsindividuales
Mt odos Si gni f i c ado
2008 {jmtorresano}
Clases y Objetos
Segmentosdecdigoqueseutilizanparadefinir
untipodeobjeto.
Enelcdigosedefineelinterfazquepresentaal
exterior elobjeto:propiedades,mtodos y eventos
ylaimplementacininternadelobjeto:elcdigo
queseejecutacuandosellamaaunmtodoo
propiedadocuandoselanzaunevento.
Escribimoscdigoparacrearclasesycdigoqueusa
esasclasesparacrearobjetosentiempodeejecucin.
2008 {jmtorresano}
Clases y Objetos
Instanciasdeclases.
Losobjetosguardanunconjuntodevaloresparalas
propiedadesdefinidasenlaclase.Tienenestado.
Existenenmemoria.
Interactuamosconlosobjetosalleer/escribirsus
propiedades,alllamarasusmtodosyal
responderasuseventos.
2008 {jmtorresano}
Clases y Objetos
Esunalgoritmoasociadoaunobjeto(oaunaclase
deobjetos),cuyaejecucinsedesencadenatrasla
recepcindeunmensaje.
Unmtodopuedeproduciruncambioenlaspropiedadesdel
objeto,olageneracindeunevento conunnuevomensajepara
otroobjetodelsistema.
Esloqueelobjetopuedehacer
2008 {jmtorresano}
parmetros
mtodo
Clases y Objetos
Esunacomunicacindirigidaaunobjeto,quele
ordenaqueejecuteunodesusmtodos.
alguien.ponerNombre(JeanLuc,Picard);
receptor
2008 {jmtorresano}
Clases y Objetos
Escontenedordeuntipodedatosasociadosaun
objeto(oaunaclasedeobjetos)cuyovalorpuede
seralteradoporlaejecucindealgnmtodo.
Definenelestadodelobjeto
2008 {jmtorresano}
Clases y Objetos
Esunsucesoenelsistema(talcomouna
interaccindelusuarioconlamquina,oun
mensajeenviadoporunobjeto).
Elsistemamanejaeleventoenviandoelmensajeadecuado
alobjetopertinente.Tambinsepuededefinircomo
evento,alareaccinquepuededesencadenarunobjeto,
esdecirlaaccinquegenera.
2008 {jmtorresano}
Clases y Objetos
Clase A
Propiedad X
Mtodo H
Mtodo K
Obj et o 1
Propiedad X
Mtodo H
Mtodo K
Obj et o 2
Propiedad X
Mtodo H
Mtodo K
Obj et o 3
Propiedad X
Mtodo H
Mtodo K
8 32 58
Los mtodos son los mismos
2008 {jmtorresano}
Clases y Objetos
Laprogramacinorientadaaobjetosproporciona4ventajas:
1. Encapsulacin.
2. Abstraccin.
3. Polimorfismo.
4. Herencia.
2008 {jmtorresano}
UML y diagramas de clase
Unified Model Language
Lenguajeutilizadoparacomunicarlosdetalles denuestrocdigo yla
estructura delaaplicacinaotrossinentrarendetallesinnecesarios.
Coche
vel oci dad: i nt
get Vel oci dad( ) : i nt
set Vel oci dad( i nt )
Estos son mtodos de la clase.
Cada uno tiene un nombre y
los parmetros que toma y el
tipo que devuelve detrs de los
2 puntos
Esta lnea separa las
variables miembro de
los mtodos de la clase
Un diagrama de clases facilita
comunicar de un vistazo lo que
hace la clase. Se pueden eliminar
las variables y mtodos si as se
necesita
2008 {jmtorresano}
Clases y Objetos
Esunaoperacin(unmtodo),queinicializalos
atributos(propiedades)delobjetoenelmomentode
sucreacin.
Cuandosecreaunobjetosurgelanecesidaddeasignarvalores
iniciales alasvariablesquecontiene,esaeslamisindelconstructor.
Paradefinirunconstructor seutilizaelpropionombredelaclase.
Sepuedendefinirvarios constructoresparaunamismaclase,todos
ellostendrnelmismonombre(eldelaclase)perosedistinguirn
porsusargumentos.Nodebendevolvernada.Sinosedefine
ningnconstructor,elcompiladorcrearunovaciopordefectoque
nohacenada
2008 {jmtorresano}
Clases y Objetos
Esunaoperacin(unmtodo),quecreaunobjetoa
partirdeunobjetoexistentedelmismotipo.
Paradefinirunconstructorcopia seutilizaelpropionombredelaclase conun
nicoargumentoqueesunareferenciaconstanteobjetodelaclase.Nodebe
devolvernada.Sinosedefineningnconstructor,elcompiladorcrearunoque
copiarmiembroamiembro.
Fr acci on a;

Fr acci on b = a;
Fr acci on a;

Fr acci on b( a) ;
Fr acci on a;

Fr acci on b;
a = b;
Constructorcopia
Fr acci on a;

a = Fr acci on b;
Constructorpordefecto
2008 {jmtorresano}
Clases y Objetos
Esunaoperacin(unmtodo),queseejecuta
cuandoelobjetodejadeexistir.
Cuandounobjetodejadeexistirdebeliberarlosrecursos
utilizadosalsistema.Estaeslafuncindeldestructor.
Paradefinirundestructor seutilizaelpropionombredelaclase
precedidodelcarcter~Nopuedetenerargumentosniretornar
valores.Esnico.Sinosedefineningnconstructor,elcompilador
crearunovaciopordefectoquenohacenada
2008 {jmtorresano}
Clases y Objetos
Sedeclaranconlapalabraoperator seguidadeltipodeconversin.
Sedeclaransinningntipodevalorderetornoaunquelafuncindevuelveun
valor queeselobjetounavezrealizadalaconversin.
oper at or doubl e( ) const ;
Fr acci on: : oper at or doubl e( ) const {
r et ur n doubl e( numer ador ) / doubl e( denomi nador )
}
operator tipo()
Lasfuncionesconversionestienenlasmismaprioridadquelasconversionesautomticas
querealizaelcompiladorloquepuededarerroresenlainterpretacindelasconversiones.
Se recomienda no utilizar este
tipo de funciones y en cambio
definir un mtodo especfico
doubl e Fr acci on: : t oDoubl e( ) const {
r et ur n doubl e( numer ador ) / doubl e( denomi nador )
}
2008 {jmtorresano}
Clases y Objetos
Lahabilidaddeponertodoslosdatosyoperaciones
sobrelosdatosenunaestructuracontroladayabstracta,
deformaquequedeaisladadelrestodelsistema
Lasclasespermitenalprogramadorlalibertaddeencapsular
variablesymtodosenunanicaestructura,deformaquelos
nicosquepodrnaccederaestosdatosyoperacionessonlos
objetosdeesaclase.
2008 {jmtorresano}
Clases y Objetos
Lapartedelprogramadondeesaccesibleun
identificador,variable,funcin,
alosmiembrosdeunaclase
1. public:Pblico,accesiblepormtodosdecualquierclase
2. protected:Protegido,accesiblesloporlosmtodosdesu
claseydescendientes
3. private:Privado,sloaccesiblepormtodosdesuclase
Pordefecto,elaccesoalos
miembrosdeunaclaseesprivado
2008 {jmtorresano}
C++
EnC++,unaclaseesunfragmentodecdigocontenidoentrelas
declaracionescl ass { }; .
cl ass nombr eCl ase {
[ codi go, decl ar aci ones, ]
};
cl ass Fr acci on {
i nt numer o;
i nt denomi nador ;
voi d i mpr i mi r ( ) ;
};
2008 {jmtorresano}
C++. Organizacin del cdigo
Lainterfazdelaclaseseincluyeenunarchivocabecera
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / cuent a. h - I nt er f az de l a cl ase Cuent a
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#i f ndef _CUENTA_H
#def i ne _CUENTA_H
cl ass Cuent a {
char numer o[ 20] ; / / Var i abl es mi embr o
char t i t ul ar [ 80] ;
f l oat sal do;
f l oat i nt er es;
publ i c:
/ / Funci ones mi embr o
voi d i ngr eso ( f l oat cant i dad) ;
voi d r ei nt egr o ( f l oat cant i dad) ;
voi d i ngr eso_i nt er es ( voi d) ;
i nt est a_en_r oj os ( voi d) { r et ur n sal do < 0; }
f l oat ver _sal do ( voi d) { r et ur n sal do; }
};
#endi f
Lasfuncionesinline seimplementan
directamenteenlainterfazdelaclase
2008 {jmtorresano}
C++. Organizacin del cdigo
Laimplementacindelasfuncionesmiembroquenoseaninline,serealizaen
unficherofuenteconelmismonombrequeelficherodecabeceracorrespondiente.
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / Cuent a. cpp - I mpl ement aci n de l a cl ase Cuent a
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#i ncl ude " cuent a. h"
voi d Cuent a: : i ngr eso ( f l oat cant i dad)
{
sal do += cant i dad;
}
voi d Cuent a: : r ei nt egr o ( f l oat cant i dad)
{
sal do - = cant i dad;
}
voi d Cuent a: : i ngr eso_i nt er es ( voi d)
{
sal do += sal do * i nt er es / 100;
}
/ / Fi n de Cuent a. cpp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2008 {jmtorresano}
C++. Definicin de operadores
Ladefinicindeoperadoresesunacaractersticaavanzadadealgunoslenguajes
orientadosaobjetosquepermitedefinirelcomportamientodedeterminados
operadores(+,,*,etc.)sobreunaclasedeobjetos
EnC++puededefinirseelcomportamientodecasicualquieroperador:
+,,*,/,++,,+=,=,*=,/=,&,>,<,==,>=,<=,=,>,(),...
Podemosasociarunaimplementacinaunoperadorquenotieneporqu
corresponderseconsusignificado.Sinembargoestonoesnadarecomendable.
Ladefinicindeunoperadorsobreunaclaseserealizaaadiendounafuncin
miembroconlaforma:<tipo>operator<op>(<argumentos>)
Cuent a &oper at or += ( f l oat cant i dad) {
i ngr eso ( cant i dad) ;
r et ur n *t hi s;
}
2008 {jmtorresano}
C++. Definicin de operadores
<tipo>operator<op>(<argumentos>)
Observarqueaunqueeloperadoresbinario(operadorcon2operadores),slose
declaraconunparmetro.Elotroparmetro,eldelpropioobjeto,estimplcito.
Enoperadoresunario,noapareceningnargumento.
Fr acci on oper at or * ( Fr acci on f ) {
r et ur n Fr acci on( numer ador * f . denomi nador , denomi nador * f . denomi nador ) ;
}
Sepuedepensarenlosoperadorescomoquea*f es,enrealidad,a.operator*(f)
2008 {jmtorresano}
C++. Asignacin inicializacin
Aunqueseutiliceelmismosmbolo(=),laasignacinyinicializacinnosonlo
mismo.Lasdiferenciasimportantesson2:
1. Laasignacin(operator=)siemprenecesitadeunvalorprevio.
2. Lainicializacincreaelvalor
Lainicializacinsedaen:
Declaracindevariables
Enparmetrosporvalordelasfunciones
Enretornosdefuncionesporvalor
Enconstructores
Laasignacinsedaslocuandoseutilizaeloperador= enunaexpresin.
Controlada por los
constructores
2008 {jmtorresano}
C++. this
Cadaobjetodeunaclasetienesupropiaestructuradedatos,perotodos
compartenelmismocdigo.Paraqueunmtodoconozcalaidentidaddel
objetoparticularparaelquesehainvocado,C++proporcionaunpunteroa
dichoobjetodenominadothis.
Fr acci on f r ac( 2, 3) ;
f r ac. I mpr i mi r ( ) ;

Voi d I mpr i mi r ( voi d)


{
cout << numer ador << / << denomi nador << endl ;
}
En realidad:
Fraccion *const this =&frac;
this>Imprimir();
En realidad:
cout <<this>numerador<</<<this>denominador<<endl;
2008 {jmtorresano}
Clases y Objetos
Lasfuncionesfriend puedenaccederalosmiembros
privadosdelaclasequelasdeclaracomoamigas.
Sedeclaranlosprototiposdelasfuncionesdentrodelaclaseantecedidaconla
palabrafriend.Laimplementacindelafuncinnollevalapalabrafriend.
cl ass Fr acci on {
f r i end bool oper at or < ( const Fr acci on&, const Fr acci on&) ;
};
bool oper at or < ( const Fr acci on& a, const Fr acci on& b) {
r et ur n a. numer ador * b. denomi nador < a. denomi nador * a. nomi nador
}
friend noestransitivalosamigosdemisamigosnotienenporquesermisamigos
2008 {jmtorresano}
Excepciones
Paragestionarloserroresensituacionesinesperadasseutilizan,
normalmente,flags deestatus,gestoresdeerroresyvaloresde
retorno.Estoscasosdeerrorsetienequecomprobarytratarenel
cdigodelprogramaloquehacequenoquedeclarodndese
siguelamarchanormaldelprogramaydndesetratanloserrores.
Enloslenguajesorientadosaobjeto,lagestindeerrores
inesperadossehacemedianteexcepciones,excepcionesqueson
objetos.
Lasexcepcionesnotienenquesernecesariamenteerroresy
notodosloserroressonexcepciones.
2008 {jmtorresano}
Gestin de excepciones
Unaexcepcinescualquiercondicindeerrorocomportamiento
inesperadoqueseproducedurantelaejecucindeuna aplicacin.
Las excepcionespuedenaparecerporunfalloenelcdigo,recursos
delsistemaquenoestndisponibles,etc.
Podemos utilizargestoresdeerroresestructuradosparareconocer
erroresdeejecucintanprontocomoocurranenelprograma,
suprimirloserroresnodeseadosyajustarlascondicionesdel
programadeformaquelaaplicacinpuedatomarelcontrolyseguir
ejecutndose.
EnC++unaexcepcinesunobjetoqueheredadodelaclaseexception
2008 {jmtorresano}
Gestin de excepciones
exception
bad_alloc
bad_cast
bad_typeid
logic_error
domain_error
invalid_argument
length_error
out_of_range
ios_base::failure
runtime_error
range_error
overflow_error
underflow_error bad_exception
2008 {jmtorresano}
Ponerelcdigoquepuedacausarlaexcepcindentroestebloque
Cuandoocurraunerror,C++ignorarelrestodelcdigodelbloqueysaltar
albloquecatch
Bloque try
Especificarlaexcepcinquequeremosatraparoatraparcualquierexcepcin.
Unaporbloque
Cadabloqueesunmanejadordeexcepcionesycontrolalaexcepcindeltipo
indicadoensuargumento
Elcdigodelbloquecorrespondienteseejecutarsiselanzaesaexcepcin.
Encasocontrario,noseejecutar.
Bloques catch
Gestin de excepciones
Instruccin throw
Seutilizaparalanzarelcorrespondienteobjetoexcepcin.
Pasadel flujonormaldedatosalagestindeexcepciones.
2008 {jmtorresano}
Gestin de excepciones
try {
int x, a[] = {1, 2, 3};
x = a[4];
std::cout << Esto no va a salir) << std::endl;
}
catch (const std::range_error& e) {
x = -1;
std::cout << e.what << std::endl;
}
catch (const std::exception& e) {
x = 0;
std::cout << e.what << std::endl;
}
std::cout << x = << x << std::endl;
Lgica del programa
Manejadores de excepciones
2008 {jmtorresano}
void C(void){
//Aqunohaygestindeerrores!
long array[]={1,2,3};
int x=array[4];
}
void B(void){
C();
}
void A(void){
B();
}
void ErrorBurbujeante (void){
//Qupasaconloserroresnogestionados?
try {A();}
catch (){
std::cout <<Hubounerror<<std::endl;
}
}
Gestin de excepciones
Propagacindeexcepciones
2008 {jmtorresano}
Gestin de excepciones
Sisedisparaunaexcepcin,secreaelobjetocorrespondienteyse
recorrentodoslosbloquessuperioreshastaqueseinterpretaelobjeto.
Sinosegestionalaexcepcin,sedisparaunerrordeprogramaque
causalaterminacinanmaladel mismo.
HayvariasclasesestndardeexcepcionesenC++.what()devuelveuna
cadenaespecficadelaexcepcin.
Eluso dethrow nospermitelanzarexcepciones.
Lasexcepcionessetienenquedeclarardelaformaconst tipo&
Uncatch() cazatodotipodeexcepciones.
2008 {jmtorresano}
Herencia
Laherenciaesunmecanismoquepermitelareutilizacin
decdigo.Conellasepuedencrearnuevasclasesapartir
declasesyahechas.
Enlaherencia,lasclasesderivadasheredanlosdatosylasfunciones
miembrodelasclasesbase,pudiendolasclasesderivadasredefinirestos
comportamientos(polimorfismo)yaadircomportamientosnuevospropiosde
lasclasesderivadas
Laclaseexistente.Tambinllamadasuperclase
Lanuevaclasederivadadelaclasebase.Tambinllamada
subclase
2008 {jmtorresano}
Herencia
ClaseCuenta
ClaseCuentaCorriente ClaseCuentaAhorro
Clase base o superclase
Clase derivada o subclase
Clase derivada o subclase
Conlaherenciatodaslasclasesestnclasificadasenunajerarquaestricta:cada
clasetienesusuperclase(laclasesuperiorenlajerarqua),ycadaclasepuede
tenerunaomssubclases(lasclasesinferioresenlajerarqua).
H
e
r
e
n
c
i
a
2008 {jmtorresano}
Herencia
EnC++,paradeclararunaclasecomoherederadeotraseutilizala
siguientesintaxis:
cl ass nombr eCl aseDer i vada : [ acceso] nombr eCl aseBase {
[ codi go, decl ar aci ones, ]
};
public, private, protected
Unaclasederivadaheredatodoslosmiembrosdesuclasebase,exceptolos
constructoresydestructor.
Unaclasederivadanotieneaccesoalosmiembrosprivadosdesuclasebase
perosipuedeaccederalosmiembrospblicosyprotegidos.
Unaclasederivadapuedeaadirsuspropiosatributosymtodos
Losmiembrosheredadosporunaclasederivadapueden,asuvez,ser
heredadospormsclasesderivadasdeella.
2008 {jmtorresano}
C++
Clase Derivada Clase Base
public
private
protected
Acceso public
public
protected
Clase Derivada Clase Base
public
private
protected
Acceso portected
protected
protected
Clase Derivada Clase Base
public
private
protected
Acceso private
private
private
2008 {jmtorresano}
Herencia. Constructores. Destructor
Nieldestructornilosconstructoressepuedenheredar
Anas,tantoconstructorescomodestructortienenunpapelimportanteenla
inicializacindelosobjetosheredados.
ClaseFraccion
ClaseFraccionR
Subclase
C
o
n
s
t
r
u
c
t
o
r
e
s
D
e
s
t
r
u
c
t
o
r
e
s
Los constructores se
llaman de arriba-abajo
Si se quieren pasar argumentos
desde la subclase a la superclase
se puede utilizar la lista de
inicializacin.
2008 {jmtorresano}
i nt mai n ( ) {
Fr acci onR unaFR( 91, 39) ;
}
Herencia. Constructores. Destructor
cl ass Fr acci onR : publ i c Fr acci on {
publ i c:
Fr acci onR( i nt n=0, i nt d=1) {
}
~Fr acci onR( ) {}

}
cl ass Fr acci on {
publ i c:
Fr acci on( i nt n=0, i nt d=0) {

}
~Fr acci on( ) {}

}
1
2
1
2
2008 {jmtorresano}
i nt mai n ( ) {
Fr acci onR unaFR( 91, 39) ;
}
Herencia. Listas inicializacin
cl ass Fr acci onR : publ i c Fr acci on {
publ i c:
Fr acci onR( i nt n=0, i nt d=1) : Fr acci on( n, d) {
}
~Fr acci onR( ) {}

}
cl ass Fr acci on {
publ i c:
Fr acci on( i nt n=0, i nt d=0) {

}
~Fr acci on( ) {}

}
1
3
2
Si la lista de inicializacin
cuenta con una llamada a un
constructor de su superclase
2008 {jmtorresano}
Overriding (anular, ocultar)
Cuandounaclasederivadadefineatributosconlosmismos
nombredesuclasebaseomtodosconelmismonombree
idnticosatributossedicequeestaoverriding laspropiedadeso
mtodos.
Loqueseproduceeselocultamientodelaspropiedadeso
mtodosconelmismonombre.Nosepuedenaccederala
definicinhechaenlaclasebase.
Siesnecesarioaccederalaspropiedadesomtodosocultosse
debeutilizarelnombredelaclasejuntoconeloperadorde
mbitoyelnombredelapropiedadomtodo.
2008 {jmtorresano}
Enlazados
Losproblemasrelacionadosconllamadasamtodoserrneos
ocurrencuando:
Unobjetodelaclasederivadaseusacomoobjetodelaclase
base
Unobjetodelaclasederivadaseutilizavareferenciasopuntero
delaclasebase.
Debidoalqueelcompiladorasumequeesunobjetodelaclase
base,seejecutansusmtodosinclusosisehanocultado enlaclase
derivada.Estoesasporqueelcompiladordeterminaelobjetoal
queseaccedeygeneracdigoquellamaasusmtodos.
2008 {jmtorresano}
Enlazados
Elobjetoalqueenlazaunareferenciaopunterolodeterminael
compiladorcuandogeneraelprograma.
Elobjetoalqueenlazaunareferenciaopunterosedeterminaen
tiempodeejecucin.Segeneramscdigoyesnecesario
marcarcomovirtualesaquellosmtodossobrelosquesetiene
quehacerelenlacedinmico.
Cuandoutilicemosherenciadebemosseguirlassiguientesnormas:
Nosedebenheredarfuncionesnovirtuales.
Sisonnecesariasparalaimplementacindelaclasederivada,no
sedebederivarlaclase.
2008 {jmtorresano}
Funciones virtuales
Parahacerquemtodosconelmismonombredelasubclase
operendeformadiferentesalosdesusuperclase,seutilizan
funcionesvirtuales.
Lapalabraclavevirtual cambiaelenlazadoestticoen
dinmico.Entiempodeejecucin,seejecutacdigoque
determinadequclaseeselobjeto.
Alutilizarfuncionesvirtualesesposibleoverride (ocultar)
funcionesdelaclasebasesinlosproblemasqueocurrencuando
seutilizanpunterosyreferenciasalaclasebase.
2008 {jmtorresano}
Funciones virtuales
Unaclasebaseapropiadaparalaherenciadebecumplir:
Todaslasfuncionesquesepuedanocultardebendeclararsevirtuales
Sedebedefinirundestructorvirtual
Cuandoseimplementaunaclasederivadasedebetenerencuenta:
Ocultarfuncionesnovirtualesdelaclasebasepuedeconllevar
problemas.
Lasfuncionesdelaclasebaseseocultansicoincidenenlosparmetros
yeltipodevuelto.Existeunaexcepcin:siladevolucinesuna
referenciaopunteroalaclasebase,sepuedecambiarporunaala
clasederivada.
Funcionesocultasdebentenerlosmismosargumentospordefecto
Pormediodeloperadordembitosepuedenllamaralasfunciones
ocultadas.
Slosetieneaccesoalosmiembrospblicosdelaclasebasecuando
stasepasaenunparmetro.
2008 {jmtorresano}
Polimorfismo
Hacerqueundeterminadocdigo,talycomoest
escrito,secomportedeformadistintadependiendode
lasituacin.
C++soportapolimorfismopormediode
1. Miembrosdeclasesdiferentestienenelmismonombre.
2. Laocultacindemtodos
3. Funcionesvirtuales
2008 {jmtorresano}
Polimorfismo
Clasequenosepuedeinstanciar.Sepuedenutilizarparacombinar
propiedadescomunesdeclasesdiferentesparaquetrabajendela
mismaforma.Unaclasequesepuedainstanciarrecibeelnombre
declaseconcreta
Sonfuncionesquesedeclaranperonoseimplementan.Sedeben
implementarenlaclasederivada.Puedentenerimplementaciones
pordefecto.
virtualvoid dibujar()const =0;
virtualvoid leer(int&)=0;