Está en la página 1de 82
El lenguaje de programacion C++ Bjarne Stroustrup 2 Ellenguaje de programacion C++ ‘9 th Mareus, me has dado muchas cosas; ahora voy a darte yo un buen consejo. Sé ‘muchos. Abandona el juego de ser siempre Marcus Covoza, Te has preocupado demasia- do por Marcus Coccza,y en realidad has se esclavo yprisionsr> suo. No tas hecho nada sin considerar antes c6mo podta afectar ala felicidad y el prestigio de Marcus Cocozs. ‘Tenias siempre mucho miedo de que Marcus hiciers una tonie-a o se absrriera. :Y qué importaba? Todo e mundo hace tonterfss.. Me guttaria que lueras esponténeo, que tv ‘oraz6n se iluminari de nuevo A rarir de ahora debes ser no una, sino muchas persons, tantas camo puedas imaginar... » Karen Blixen “ de C++ — Cy C++ — st ‘gerensiaspara programadores de C — sugerencias para programadores de C++ = reflexiones sobre programacisn en +t — consejs —referencias LL Estructura del libro El presente libwo consta de ses partes: Turoduceiér: Los eapitulos a 3 ofrecen une visién de sonjunto del lenguaje C++, los estilos clave de programacién que soporta y la biblioteca C++ estinda arte [: Les capitulos 4 & 9 proparcionan wna inteoduccidn didactica alos tipos pre- {de inidos de C++ y alos recursos hasicos para construir programas a partir de ells. Fane I: Les capitulos 102 15 son una ynrocuccisn didjetica ala programacisn orien- {aca a objetos y genérica con C+, ante Il: Ex los capitulos 16 a 22 se present: la bibli Farte IV Ex los eapitulos 23 a 25 se estudiantemas re saurollo de software. Apéndices: os apéndices A, B y C contiena detalles sobre los aspects técnicos del Tenguaye El capitulo 1 o'ece una visién de conunto de ibro, algunos consejos sobre emo usarlo € informacisn fundamental scbre C++ y su uso Animo al I2ctor a que lo hojee, Tea lo que le parezca intewesante y vuelva a él trax lee ots partes del libro. Los capitulos 2 y 3 ofrecen una visin de conknto de los conceptos ycaracteristica pri teca C4 sind. nados con eldiseRo y el de var al ketor para que dedique tiempo a los conceysos fundamentales y 1ay‘varacterstcas baisicas del lengucje, mostrindole lo que se puede expresar undo todo el lengusye C=+, Cuande menos, esos captulas deben convencer al lector de que C++ no es (slo) C.y de que C+ ha recorsido un largo camino desde la primera y segunda ediciones de este lites El capfulo 2 sirve para fumiliarizarse a alty nivel con C4+. Se analizan las caracteristicss del lenguaje que soportan abstraccién de datos, programacién orientada a objetos pro _gramac6n genérica. El capitulo 3 introduce los prncipios bai:os y los componentes prin ipalesde 1a biblioteca estindar, Ello me permite usar compenentes de la biblioteca ex. ‘indar en los capitalos siguiente, y al lector le permite usar cemponentes de Ia biblioteca en tos gercicios. e1 lugar de trabajar directumente con earactesticas precefinidas, de me- nor nivel Los capitulos inroduccorics oftecen un ajemplo de una técnica geseral que se aplica a 4o largode todo el ibro: para posbiitar un andlisis més directe y reaista de alguna ice 6a 0 camcteristica, en océsiores presento primero brevemente un concepto mas adele te To amilizo en profundidad, Este planteaniiento me permite afrecer ejemplos concrcts antes de presentar un tratamiento més general del tema. Asi pies, la organizacin del bro reflja Ia idea de que habituslmente aprendemos mejor avenzando de lo concreto alo abstract, aun cuando, al miraratrés, lo abstracto parezca sencillo y evident. La Parte I descrbe el subeonjunto de C++ que soporta est os de programacicn tradi- 19), cadenas! (capttlo 20), EntradaSalida (capitulo 21) y soporte pars computacidn ni inética (capitulo 22) {La Pare TV analiza cuestiones que surgen suando se usa C44 en el dis e implemen: "A to large de todo el ibro, se uiizaseaden (em inglés. siring) como sinérimar de asecuencia ot para er 1 i ae toy in erie. Enel pul Pes aala lsh ent ol lenaje do Beatie elaknere Cy Cosy enve etna Cr+ Cambie lmao 80 Cr+ Lei yo ‘Sela No ence nade ve puede initiate escraurs de programas de ato rea pare formarse una idea exacta de cémo es un lerguaje dz programacién. Este libro se cen- dos 300 a y By funciones f1) y #1) ; En los ejemplos de cd go se usa ur tipo de letra de anchura proporeional para los iden: lifieadores. Por ejemplo: ‘include -iostream int mein) std: scout << "Hola, nuevo mundo | a" A pier iste xl de presen pus parecer santas aos progrmado Tesacostunbradca ver el cligoen ps Je era dearciurs constant, Sn emtarg, fs po de anchuaproporcioal se comsieran en general mejores que bs de anche con tate pal proses de eno, Usrun pode anc proporcionan pert bien resemar el ebigo cn eno sos de agian. Ades, lo experimen gue he realizado demiestran que la mayor parte def gente excita ensegida el nuvo es: tilo mis facil de eer. ee : | Simp qu pol, las caracterticas del lengunie ya ibiteca Coe se oresen tan en contexte de so 9 no la fora dade un mana Lt coated ee ae presenta el dele cen que sedescribe ean i pono devise os se nessa para un uso fective de Co Un bo complemenaie, The sumone Coe Langage Stadard, esto en coaboacién con Andrew Keen, etc a denen completa del enue, amo eon comentarios cus propos hacerlo aces seine, deters haber ot libo completa, Te dnnouted Libram Cae, So tmbgo das mis iiacione en esta a tempo ycapaadad pas ese, no pose Promeer que lege a proc La referencias acts partes de ese Ro teen Ia forma $234 (apo 2 garado 3, sutapartado 4), $8.56 (Apenice B, sabapataco 56) $6610] (apts &: cercets 10, Lacusve seus en oaones par desta albas per enplo sun cals dea no es acepane), para stale a primera paiion de concepts portant por ejemplo, polinorfsmo) para sinbols no terminals de le pamaten Cx po som, sentrcafory palo comentarios ens empl de eg Seunacantnegng representa detfeadoes,palatas cave y valores numercos en lo jen de eotne (por empl, clas, contador y 1712) 1.1.2 Bjercicies Los ejericios se encuentran al final de ios capitules. En su muyoria consister en escrbir lun programa. El lector debe escribir siempre eéaigo suficient: para que sea sompilada sjecutada una solusién con al menos tres casos de prucba. La dificultad de los ejereicios varia considerablenente, por lo que se indiza Ia dificultadestimnda para cada uno mediante luna escala exponeacial, segtin la cual siun ejercico (*1) le Leva al lector diez minutos, tun ejerccio (*2) puede Hevarle una hora y un ejercicio (*2) un dia, El tiempo neceserio para escribir y probar un programa depence mas de a experiecia del lector que del er. cicio ea sf, Un ejersicio (*1) Hevara un dia si el lestortviera que familiarizerse primero con un auevo sistena informético para ejcutatlo. Por el contario, un ejerciio (°8) po dria hacerlo en una hora alguien que caualmente vera a meno la coleccin de progr Coma fuente de cjervicios extra para la Parte I se puede usa’ cualquier libro sobre pro- framacin en Cy vara ls partes y Ile pueden usr libros sobre exvtues de das ¥ algoritmos. 1.1.3 Nota sobre inplementacién lenny wad ene ibe Cv pron tl como sede ena Cee [Ce 199] Ee cnscucsia seo sos farce sabe ees moc es Cio rica gnats propa dl ibe poe ea oe pleneindones C+. Los eomps co qu se un eaterco elope mene or Cov no ompinen e su Inpleeaions Socmngs eae ‘esés mencionar qué implementacida fallé en la compilaciin de qué ejemplos. Semejante jnformacién quedaria ensepuida antcuada peryue los implementadores estén trapajando fnuvho para garantizar que sus impkmentaciones acerten correctamente todas las carac- Teritigas de C++. En el Apéndice B encontrariel lecteeseperencias sobre eso manejar fe con conpiladores C++ mis antigans y con eédigo eser to para compiladores C 1.2 Aprendizaje de C++ Lomés imporiame para aprender C+ es concentrarse en los conceptos y no perderse en Jos detalles tenicos det lenguaje. La finalidad de aprender un lenguaje de progremacién es mejorar como programsador, es decir, ser més eficaz en el dseflo e implementacion de fos sistemes nevos y en 21 mantenimiento de les antiguos Por ello, es mucho més impor de programacicn y disefo cue conocer los detalles; ese co: tene comprenr ls tice toeimient ga son el rrp ya tic ‘cre sonora diversos esos de popramavion, Todos se basen en uta comprobacisn estaica de tipo rigrosay I mayor pretend: leavar ox alto nivel de abstain yuna fepresentacgn deta das ieas del prorar or. Tedosellos pueden ogra ut prop: ‘Mes de meta eficaz al tempo ne mantire la efeencia de espaci y de fempo de Sevucion Un progamacor que prea de wn enguge cifrente(C, Foran, Smalltalk, Livy ML Ada Eifel, Pacalo Modl-2) debe ener encurna qe, prs ener maxi tereicio ve Co, dee dda erpo a arenercimerbriza exis 9 tenis de pro fPanacionadeouados Cr, Lo mismo puede devise de los propramadores asiuados Ta apliacinineexva aor lenguaje ds tcnicasecaces en uno conduce genera mnt Taobtncion de slg orp de bajo zndimiot y Bel de mumener seri. Toesulta ademas sumamenc frostant,porce cada linc de codigo cada nesaje de tre del eompiladorreeedan al proramad> que e!lerguse ula es dient dl Saguos Se puede escabir con elestito de Pan, Small, eee, enculguer Temuse er-ne resulta apadable 1 econdmic cuan la isoia del lenguaees fe rene, Chalgue enguaje pore ser ua product va uete ce ideas sobre cm eerie pro- frunas Cs Sin embargn hs ideas ceben isormae alo qe se alate Is csr tern ger ye sine depos de C+ parse sean cktvas en ene context diferen- tebe shea sin depos den Teng sos den obtener itr piss. esata poimacin aa al sprndizae mo se plate care apen- diye de tn mivolenguyje de pogunacion pended lo qu a sep de Ip guepe- tena aprender No hay un planeantento que ea vio ra odo el mundo, La pes dea qc he prio esq lector ets aprtiend Ca pts mejorar como arama tory dschador Es dec sapongo gue el prepito dso l aprender C+ 0 es Se cilmente aprender una ints neva pars er cost dea form lau est aon tea, sno aprender formas noevas mejores de consi sistemas. Yeo hay que hi cero rndalmnt, pane aison de suger ueva habla inportae require Senipoy rictea Pensemosen lo ie va gprnde bin um oma new 9 apron éera tocar ben an insuento muse, Mj come enador de sistemas 1m ei 1 ms pl, por no tanto cono le gustaria a mayeria de Ia gem Como consecuencia de lo anterior, el lector va.a usar C++ —a menudo para crea ss temas reales— antes de comprender todas las caracterfsticas y técnieas Jel lenguaje. Al vo Portar diversos yaradiginas de programacién (capitulo 2), C++ soperta programacivn pro. difieren sélo en la forma en que sedefinen, no en la forma en que se usan, La biblioteca estindar C+ des rita enla Parte I proporcicna muchos ejemplos de esos tips y sus sas. Desde el punto de vista del usuaro, hay poca diferencia entre un tipo predenido y un spo proporcrona. do por I biblioteca esténdar En eldisefio de C++ se am evitado las caracteriticas susceplibles de suponer costes extra en tiemo de ejecacién o en memoria aun sin ser uilizadss. Asi, por ejemplo. se rechaza. ‘on construceione: que huieran hecho necesarioalmacenar «informacién de mantenimien fo» en todos los objetos, de modo cue si un esuaro dectara una estructura compuesta por dos cantidaces de 16 bis, esa estructura cabei en un registro de 32 bits, ‘Ce fue dseniado pera si uso en un entors tradicional de compilacin y tempo de ee ucidn: e ertorno de programacidn de Cen el sistema UNIX. Afortunadamente, C+ nunea tha resirgid a UNIX: simplemente ws6 UNIX y C como melo pare Is relastoney ae lengua, bibitras,compiores, nian evonos de esi, esters fnodelo mimo ayudé a C++ a salrairoso en précticanente cualquier plataferma infor- ‘ndtca. Hay sin embargo, buenas racones part usar C+-+en entornos que proporcionan bas- fante ma scporte. Se puede sacar partido d= recursos como la carga dindmica, la comp lacién incremental y una base de ditos de dfiniciones 4e tipos sin afectar al lenguaje ‘Las caradteristicas de C++ de comprobacin de tiposy ocultacién de datos se basan en 2 anilisis de los programas en tiempo de conpilacida para impedir corrupcionesaccider tiles de 1s datos, No proporcionan confidencalided 0 proteccién contra alguien que ineumpla deliberadamente las normas, Sin enbargo, se pueden usar cun libertad sin inet Fir en costes de tiempo de ejecucién ni de espacio. La dea es que. para que sea iil, wet ‘aracteristicn de lenguaje debe ser no slo eegante, sino también asecuible en el conte Para vnadscrpcién sstemdicay deta ada del deo de Cv, consult el lector [stroustrup, 1994). 131 tiene +e desarolls apart del lengaje de rogram’ Cy, con estat excpsione smervaC som sion. Ellngje see bsojune Cd Coen hac amg ays anc eae cite sn in iy ec os ots dos ae ocupan fneanzt lee compares: nines, caters Secloes Save pralosoperaes mew, ete pth dymomte ay throw ye lo ine sxe setendes ndvidaes Ce wo nscesian spot de temp de Cr+ puede usar las mismas secuencia de lamada y rtorno de funciones que C, w otrs is eines. Cuando in lo sos mecansnos atramenteefcentes son demands Stone se puede suit en line una Turion de Co, de modo qe pderos ds ie a coma ota ona de las fio sin cose ra en emp de eject Una ds ialidade rginaes de er ssi coliicaionen lenge ensan- nde parts rent igen do progamaviGn Ge itn, Cate Sach Crs presto gan ancora vo comprometer ke ganado cr esa se, La diferencia ete Cy Cer ada funamenamente ene grado d nfs sabre onion) la extra, Ces Expresveymermisiv Crt es an ns expresvo.Sinewbaro, para comer ev tumen se enpresividad, ry que presi encin os ipo de los bles. Concsendo les "pos de sabes ef compiler puede menejrcoratament expesiones en situci= rer en las que, de a od, habs ico que espesfiar las operons Bast mi timo dette Concer stp dels objets permite iinimoal compar dexear er tqu, de Gro modo, aban persist hast a pra, ones mi ard, Hay ge er Er cues qu lwo del sem ce tipo pare comprar agumenton de uncer fe los dato de una crap accidental poporiose nuevos tipo, proporonar mi y estructura Nos opraores, tetera, no amen Ios ones en cuanto a tempo de jecusin nae Pacio en C++, ies La importanci conceal cxtrucra en C+ refuel mento en salad fos progranas escros desde que eds Poems hace furciona ala fcr sn prea Pegue> (0 lines por esp) anc incl sa ei eo tio, Peo no oeur lo mismocor an pean mix pande Sila esrctra de un pp ta de 190.000 nea es mal, deseubrrenes ie se itoducen menos emerson la mana Yeloctnd con que se eliminan los antigacs. C+ fue dsehada para hacer pole gue os brogranas mis grands se estucsaran de rancra raion de mod que fers ae ‘ue ane person se ocopara de cntdadesdecoipn mucho mores Ade se pete 4a que uma na promedio de eigo Cr expesira macho ms que un linea pre de ego Co Pascal ests ars, Cus ha leanzado com eves ess bjevon, Notndos los fepments de tiga plelen estar bien esucurados se ndependisnes del hncware, ies dele, eer, C++ poser caters extn eas pas spar cursos del hardware de manera ects Yeisen, si ene en cunt a sg dada facade comprensin, Pose simismo recurs par ao xe egy ce. tes de merfaces elegans yseguras Nairalmente,e uso de C-+ fra programas mis grandes conduc al soe C++ por srupos de programadores El fess de C-+ cn la auras interac uerenon, te ips a flex bildad demuestra enfonces sa valor. equi de ecu de Cos pra xii programas grandes ro lo tee ning lengune Sn embargo metide que Ios progames on ms grande, lo probit cna desarloymatenmshe pasan ser problemas de leeguje ast yoblemas mis glides de heramientae 9 es tin. Ena Parte TV se explore algunas de ests custiones, En ede libros hae incaiéon encase sirven para rcporconarrcunos dep pésito perl pas de gran liad itineas, enter, Ets tcica servis los disetadores de ropramaspegusos conn alos deprogramas andes. Ades ded 4 que tos los programas no wives se cmp de muchas partes semindependenes las téncas de excrtra de eam partes sren& fos programadors de cunlguer pcan El eo pia pensar qu a epecifiasion deur prograna mediante a dense trctura Je tpos ma detalada da igar aun texto fuente dl programa ms large Con noes st Un programa Ct gue declare pos d Tos arptmentos es funciona se cls, etter, ser haitualmente ws ovo mi corto qe programa C eulle due no enplee eos recursos. Cuatdo se tse iblzas, en peprana C+ resuard ho més corto que 50 equivalent C, suporendo,nstrament que se patie consis un egufatente € que funciona 13.2 Neta filassfies Un lengeaje de programaci6n cumple dos propésitos rlacionades entre sf: proporciona un vehiculo para que e! programador especifique acciones que deben ejecutarse 9 propo ‘na un eorjunto de conceptos para que el programadcr los use cxando piense en lo que s¢ ppuede Facer. El rimer propésito requiere, idealmemte, un lengaaje que esté «préximo a Ja mAguiva», de mado que todos 1s aspecios importantes de uia méquina sean mancja dos con sencillez y eficiencia,en una forma que sea tazonablemnte obvia para el prosra ‘mador. El lenguaje C fue disefado partiendo de esta icea. El segundo propésito requiere, fn rondicones ideales, un Inguaje cue esté ara soportarcontenedores de tpi feaci6n estatiza (tales como listas, sectores ¥ mapas) ¥ Fara soportar un uso elegante y sficiente de exos contenedo-es (progamacién 2enérica). Era objetivo fundamentilredv- Cire uso de macros y moldes (casts, conversiones explcitss de tipo). Las plantillas se ins- Fraron en pare en los genéricos de Ada (tanto en sus punos fuertes vorro en los débiles) Ye parte en Is médulos perametrizadas de Clu, De ferms semejant, el mecanismo para ‘manejo de exeepciones de C-+ se inspits patcialmente en Aa [Ichbiah 1979], Clu [Liskov, 1979] ML {Wikarim, 1987). Orosaances inrducios ene 1985 y 1995 como la ern mulls onsones vite gus es pac omnes orn Se fo grcralizacionesimpulsadss por la etpereacc en el wo de Cosy no Mee pos das de otros lengusjes. . e - peta : Desc 1980s hn wsado versiones ries del engi, cmos en conjunto como ,igeamente mis Corto, ean err ee siti seta usa ambign come nome dean lengafe oan una coerin cone! que nos ocapa. Quetesconocn a sematica dC enuenton joc Cates nferiora 44 El lengaye no se lama D pore esa eatsson dC vm tena acinar problemas soprimiendociratristzas. Par ta inerpetaeion a sone ct tr apne (Or 199) ‘+ ue disad> oiinalmete prague ator sus amis no avian gue pre: ina en ensambladcr, en Ci en ders lenguajes modern le ate aie Sh Halll Brincipa era consevir que fuera mas fai y mis agadable pura el pogramader nde ual esibir bueno: programas. E lox pineros anos no hubs cncno cn papel de Cosel ise, documenaidny la imglementuin aeren simultinon, No to tampors oo lioteca de tareas descrita en [Stroustrup 1987] y en §12.7111] formé parte 31 primer programa «C con clases» que se cescribi6. La esribi, asf coma sus clases asociadas, pata soportar simulaciones de estilo Sirula, Labibjioteca de tarecsha sido revisada.y reimplementada, sobre todo por Jenathan Shapiro, y se s gue usando rnucho, Labibliotece de fujos (em inglés, streoms) que se des- cibe en la primera edicidn de este libro fue disefada e irplementada por mi Jerry Schwarz Ta transforms cn biblioteca de fujos de E/S (cxytulo 21) wsando la técnica de manipula- dor de Andrew Koenig ($21.46) y oss ideas, Lz biblioteca de Mujos de EYS se perfeccioné luego durante proceso de estandarizecién,reaizando el grueso del tbajo Jerry Schwar7, Nathan Myers y Norihiro Kumagai, El desarrolly del rezurso de plantllas estuvo influido por las platiles veetor, map list y set ideadas por Andrew Koenig, Alex Stepano’, ott0s autores y yo mismo, A'su vez, el trbajo de Alex Stepsnoy sobre programacién genérica ‘cen uso de platllas desemboo6 en lis partes de contenedares y algortmes de la bibliote- 9 estindat de C++ ($16.3, capitulo 17, capituls 18, §19.2). La biblisteca valarray para ‘computacion numérica (capitulo 22) es fundamentalmente tabajo de Kent Budge. 15 Uso de C++ ‘Cortenares de miles de prog-amadores usan C++ en pricticamente cualquier dominio de aplicacién, Est: uso esté soportado fer alrededer de una decena de implementacienes in ‘dependientes, centenares de bibliotecas, centenares de manuales, diversas publicaciones \é:nieas, nuchas conferencies e innumerables aonsultores, Hay formacién y enseaanza a tuna amplia vaiiedad de nivek. Las primeras aplicaciones tenian generalmene un fuerte aroma a progiamacidn de sis- temas, Asi, por ejemplo, varios sisteras operativos importantes han sido escritos en C++ [Campbell, 1957], (Rozier, 1988}, [Hamilton, 1993], (Berg. 1995], (Partington, 1995] y muchos ms tienen partes clave hechas en C++. Consideré que para C++ ota esencial una Tigurosa efcieacia a bajo nivel. Esto nos permite usar C++ para eseriir controladores de dispositivos y software que se basa en la maniptlicién directa de hardware con restrcciones. de tiempo real. En e6digo de ese tipe la predevsilidad del rendimiento es, como ruinimo, tan importante como la pura velocidad. A menudo es tambin la compacidad del sis ima reitante, C+ fue dseado de moto qe tos las earicersicn eae esa utilizatles en el cddigo en condiciones de fuerts imitates de titmpco tenes {Stouseup. 1954, $43). La mayor pat de ls aplicaciones nen ramos de cig que so eseciles para un tendimintoacepbe. Sin embargo, major cana de ego no sigee noe omen Para la nayor par: del eSigo a maneiiidad facade eters a fcaa de pret es clave. El soporte de Ce paraests custonestaconiedo we amelie siempreque la fatilidades indspensaey en ies en Tas elas novedades contin sinifieaivamente ao la-go del tempo, Son ejemplos de clo la banca, el coneie he seguros is telecornnicacionsy las apicaones militares. Dirate sol contol ey ta dl sistema tlefnicoestadouidens de larga distancia be confady en Cary tas las amas 400 (sn cost para abonato gellar) han sd encaninadas por wv me rama G+ [Kanats, 193) Muchas dees aplicaciones son sander de age sda consecunci, ia extailia, compatbilidad y posbilad de aio de tcl han spe cupacicns constants ens desarolodeC-s No esintecuetsenctas own dein miln de ness Algal que C C++ no cise esposficiment para computacion numérica Sinem bargo, se hace com ++ mucha computacisn numer, cinta de ingeniona, Usa te 26a impertante pars ello es gue el wabsi numérico radiconl debe cminase a sone so con gaicos yon cculos que se basa en estrus dedelcsy no chejon cn cleo Fortran tadicional Budge, 192){Baron, 1994] Los pifcos as eines de wes son dre en ls gue se use mucho Ce, Cunguira que haya undo sls ves on Aspe Macintos oun PC son Windows ha nad indrectaente C++ pore ls intrest arias de usuario d esos sistemas son programas Cr, Adem alfunas dels nis po Polaesbliotecss qu opatanX para UNIX extn crits er Cae, Aa pots, Cas ooo opcisnbsbitval puree vaso mero de plcacionet en ls gurl neti de woucan Sa pare important “ode b antericrsala el qe puede ee principal punt fee de C4 su capacilad pata ser wsado cor eeaciaen aplicaciones que requcen taajacn dren eae «sci, Es stants tecuerte encontrar aplicaciones gue enraan iter cad ee 3 de gran ampli, anaiss aumerco. gio, imeccion dl wats Meco a bn datos Tadiciona mente estan seas de apcacin hn sido coda stn he So atencdas cas spmpre por comunidades teenies deremes ge saan dinero leans ce progranacién Sir embargo. C+ a= ba wsado anpliament tn tas cos ees Ins, pace coexisircon fragments de cig» provamas ecios ee oe eneaas Ce es ampliament tiizaco en la emetanesy Ir investigaign algo gus fe Fendi alguna: personas que —aceradinente— elaine Css ances leone ts poqtto ni mis impo de los uc se tan dscRadh. Es sin nba ~ ‘sufentement pi pcs a enseanra de lon concepts bee, ~ sufkientemente reais efcentey exible par proyects exreents, ~ sufkintemente accesible par rganizacionesyslaboracones aus apyan ends tints entmos de deals yejecucon, ~ sufidentementeamplio como vehictlo para la enseRanza de concerosy técnica avamados, y : oe _ suficientemente comercial como vehiculo vara poner en uso profesional lo aprendido, ‘Cex es un lenguaje con que el lecior puede erecer. 1é Cy C++ stu elegilo como lnguje base ps C+ pare CO esl concise de nivel elaivarent Dj 23} advan pra a myor pare dels areas de progranacin de sisemes 3S Cerna ents pansy con tds is agua {Teak see Po ap fisnus de ox conocts, Algo importante taj con hizo posible que «C com el 2a her sna hewamien lune ope alos poor meses de pensar por pra ver tertair a lsc como lis de Sir . fella qu ac genre el wre C+ ye hiiron més signieaivos os ecurss aot acts mut aly poretcima deC. surgi ona y ova veu la pregvts de ser omnes Awe ome mantener compat, Es events que goian haters evita algunos Verena de C(vease por ejempla [Sethi 4a) hay cenfenares de les de programadores que conocen C y, portato, s6le neces: 41 lengvaje C también ha evolucionado, en parte por la influencia del desarrolla de C++ [Rosler, 1984]. El estindar ANSI C[C, 1990] conticne una sintaxis d2 declaraciér de fun- ‘erieas y rucos que las jemplo, la conversin expicita de tipos se necesita con menos frecuencia en C++ que en C (81.6.1). Sin embargo, les Euenos programas C tienden a ser programas C++, Por tjer, Blo, todos los progtumas de Tie C Programming Language (2rd Edition). de Kernighan y Ritchie (Kemighan. 1988], soa programas C++, La experiencia con cualquier lenguaje de ‘ipificaciin estatics sera de ayuda para aprender C++. 4.6.1. Sugerencias para programadores de C Cuanto mejor se ccnoce C, mis dificil parece que es no escribir C++en estilo C, con bo ‘ue se pirden pare de los bereficios potenc-ales de C++. Ruego al lecior que convulte en ol Apéncize B las diferencias entre C y C++. Veamos algunas ce las reas en las que Cat iene fornas mejores de hacer algo que C: [1] Lés macros casi nunca son necesarias en C++, Use el lector const ($5.4) 0 emu ($48) para defini constantes manifiesas, inline (87.1.i) para evitar los costes ev {te de las Hamadas a funcién, templates (capitulo 13) para especificar familias U fuaciones y tpos, y namespaces ($8.2) para evitar conf ictos de nombres. {2] Ne declare el lector ina variable hasta que la necesite, de modo yue pueda inicial 2arl inmediaamente. Una declaracin puede aparecer en cualquier lugar en cl que uoda aparecer una sentencia (6.3.1), en inicializadores de la sentencia for ($6.3. ¥¥ en condiciones ($63.21), [BI No hay que esar malin). El operador new (§6.2.6) hace mejor el en ligar de realloc(), se debe intentar un vector ($3.8). [4] Precure el lector evita void", la aritmética de punteros, las uniones y los moles (er inglés, cass), excepto em las profundidades de Is implemsntacidn de alguna funcir © clase. En lt mayoria de fos casos un molde es una ind eacidn de error de dives Sil lector tiene que usar una conversién explicita de tipa prucbe a usar uno de low nuevos moles» ($62.7) para un enunciado mis preciso de lo que -ntenta hacer, {5] Hay que reduc al minim el uso de arrays y cadenas de estilo C. A menudo se pue der: asar las clases string (§3.5) y vector (§3.7.1) de la biblioteca estandat C++ para simplificar la progranacién con respecto al estilo tradicianal de C. En general el lecter debe traar de no construir Io que ya proporciona la biblioteca estandar Para cumpli las convenciones de enlazado de programas con C. debe declararse que una funcién C++ tiene erlace con C ($9.24). Lo mis importante es que el lector trate de concebir el programa como un conjunto de ‘conceptos en interaceién representados como clases y objetos, en lugar de como un ma ‘0.0 de estructuras de datos con funciones que juegan con sus tils 0 trabajo 1.62 Sugerencias para programadores de C++ En este momento hey muchas personas que llevan ya wna década usando C++, Son mu: has més las que usar C++ en ua solo entomo y han aprendido a convivit can las restric. ciones impuestas por los primeros compiladores y las biblioteces de primera generac ‘A nenudo lo que se I ha escepado en estos afcs a un programad:r experimentado de C++ ‘noes la intreduccién d las nuevas caracteristicas com tle, sino los cambiox de relaciones entre esas aracteristicas que hacen viables tericas nuevas y funcamentaes de programe co de otro modo, cosas gue ector vo pens no encones prticas cuando eee psitan comer aroun placenta Es algo eo purse seer recxeninando ls Tundamenbs del lerguaie. . nnd a Tetor qe Tea Tos capitals pcr orden. Sky conoce el contenide de un vo pur! epasaro eh nos mino. Sic lo cance aprender ago con Toque ho seine: Porm pare, he aprenddo stant erbiendo ee Ho, ysopesho qe ape a ‘aingiin programador ce C++ conoze todas kas caracteristicas y técnicas presentadas, ‘cata sr ie egies flan erst gu pong orn aime Je cameterscasy wenicas, Medians ss organi-aign sux epmplos, et I bro free ea pespectiva 1.7 Reflexiones sobre la programaciénen C++ far un rogram seplaiea en res fase. Primero Br adivioes ideale, lara de dsr un programa sep . tc legaa um comprensi clara del problema nisi) egos detifecan los concep tse ar enn ln Sey pr san se expan lane on zozrams (ogramacin), Sin enturgo, es Fecvene gue lox detalles el problema y Tonconcepos da slucion silo se comprendar con ceri tel esfucrz ue supone expres cou program © ncaa uc Ste fancioneacepablement. Presa zn es imprint ae een del engaje de pr a Ey ta mayora de ls aplicaciones uy clncetos que noes (il repreenur como de ks tips frdamene o como una fncion in datos asrlaos, Dado an concep a hay ue deca na clase psa represent eel programa, Una clse Cos ex un ipo, Es dcr, eae fen cio se comporan los obtos des ise: come se crea, case puecen manpu ary mo se destryee. Una elie pusdeepeifinr abi emo ae Pret lo ojo, une en scapes nak Gl dk de un programa eso ao debe terunspresuracion important. La dave paresribir buenos programs x dear lx flies de meoque cada na de ells resents con linpiera un sao concep, Amen do eo sigs que hay coe cenrae cn cuesiones del ipo: ,cimo se eean los objetos de eas cane eden copie fo desis In objets deta lane? QUE opericiones puccen apie exon eee Si ay respiesitssaifactrs para eas {5 potable qucel concepo ro esiver linper desde elprincipo, ers enoncts bu na eu pei nds en el rotlema ja souciypropuest par ela de enpezat immediate ecco preem, 7 Tbs canes fies de abort son fs que tern na formas matetca uation sneros de todo tipo, cojunto, ferns gemma, tft ES oenada 2 tot, cadens contenedones isis, los signtmosFancomentles sabe esos cote dores y algunas clases matemiticas forman parte de la bibioteca estindar C+ (capitulo 3.4 612) Ex st, ademés, una enorme vaiedad de hibtceas que soportancoaceptos emai espetfios de dominio. : Los coaceples mo exien en el vac: siemprt hy agnpanintos de concepts rac rads ents Dganiar a rela etre ly ches de ut programa es dev stern Zarb reac sxacta qu ay entre os erenes concep qe inerverenen ura wl ida sel a mds dif ue estbleceriicalment ls dns caw. El reside tno debe ser un embroileen el que cada clase (concepto) depénda de todas las dems. Con sideremos dos eases, Ay B. Relaciones como «A llama a linciones de», «A crea B ‘ que el lector suede tenes en cuenta para ‘aprender C++, A medida que gane dominio del lengusje podré alaptarls para hacerlas ms cin Som, de manera deere my iadas sus aplicacions sv estilo de progamacion Son, de a arias que no enranen detalles, Noy ue ars lp del et, ?ara cx ne ae poprama hace aa nlgeni, gst y fa nc. No expe el bx ha eben aa primers experiment bans cl intaciGn conereta de sus ideas fara la fund elector programa, cies una reqs wa rein de algun probema, Hay sue dr que la etroctora de posrama eee aver lo nis drecament one oe faunas prnear cu spe comme un ie independente convent 3 wt (oS pure pnsar cn lgo como una en dd independiente, cave es algo tr ojo de alguna clase fey Sido clases nen sear com, conven en wt else bart, [al Ste mplementcin de dos clases as algo sigcav ea comin, core sos pots comes en aca Be le] omc es un cre de con splat If Stora ncn implements un algo param ont : Ticién plantilamplementand el algyting pre una fami de contexedores cieaue Stum conjumo de ass, plains, ccter,puudahrelacion lige _ Jas em un espacio de nombres comin. : 2] Cuando aia una clase gue no implemen onetime como tam iz oun nmere comp. oun ip de bjo ave como una lia vnc [al No se datos gabales ase tembros {b] No use funciones globales. {el Neuse miembros d dates pblics [G1 Nowe unions amiga, savo para eit] 0 [ef Nopongnunscampo de ipo en una case: we fnciones vues UN etic te no onnetin i Enel apuriio sConsjoe de cada coptul encatrar el esr norm rites se pesca o cells, Recuerde queens conse son slo ecomenacones rts ie nuts. Con cualquier conso sae deben alice scan sea raztabis Linligensia, la experiencia seta ominy el buch gusto son ssi, pin us as ecomendacons ncptvas(entca haga tl cos) sm iis Ea con- sect nye arte de scons etn formes como sugeencks sobre To qe sede acer nets qe ae seretisnegarvan no sin extar fla com po hiciones acl. No conto ninguna crasersicairponant de Ca qc no haya vise ben vilizada Los consjos no ntenenepleacione, ino qe cala Uno de los re une ffeil apart coverpomerte det ibe Cando canes i dela wferenia poporciona una alternate va seompat jo es negativo, generalment ‘conendada 181 Referencias ‘Aurxue en el testo hay unas cuantas referencias Jirectas, sha reunide aguf una breve re lacidn de litros y otras publicaciones mencionacas, directa o indirectamerte 2 Recorrido por C++ Antes de nada, metemos «todos los abogades del lenguaje. Enrique VI, parte Il Qué es C++ — paradigmas de prozramaciér — programacisn por procedimien: tos — >rozramacién modular — sompilaci‘n indepensliente — manejo de ex: cepciones — abstracciGn de datos — tipos definidos por el usuario— tipos cen: cretos — tipos abstractos — funciones viales — programacién orientada 2 ‘objetos — programacin genérica — conrenedores — algoritmos — lengusje ¥ progiamacién — consejos, 21 Qué es C++ C4 es un lenguaje de programacién de uso general cor un sesgo hacia la programacisn de sistemas que’ ~ es un C majorado, = soporte absiraccién de datos, ~ soporte programacién orientada a objetos y ~ soporte programacid genérica El presente capitulo explica lo que sipvifica esc sin entrar en los detalles més sutles de la dfinicién de lenguaje. Su Sinalidad es ofreces al lector un panorama general de CH y las ecnicas clave para usarlo, no proporcionare la informacidn detalada neceseria para ‘conenzat a progeamar en +4 Siel lectce encuentra pasaes dificiles de segur debe saltirselos y seguir leyenco, Todo ‘se explica con cetalle en captalos posteriores. § n embargo, si omite alguna parte de este capitulo, debe hacerse a sf mismo el favor de vo ver sobre ella mis adelante, El conocimiento detallado de las caracterisivas del lenguaje —aunqve sea de todas clles~ no compensa la fata ce una vision de cenjunto del lenguaje y las téenicas funda revels para usar, 2.2 Paradigmas de programacién La pogamacin venta aos es ura ence para prgrmar paradigms prac eri programas “buon: prs cnanto de poblemas Ss dcromtaate shreee de pramacién serads«ojstse sain ag, had eetine son enoeae tramsién que poporcons mecanisor que sopertan ben l ext de rosasaon orienta a obs, Hy aqua cisinctn importante Se dice que un lense soporte de yo tramation i poperionarectras qe lagancomedo ansnemene teh rey oh Gini) sar est eto, Un lengusge no soperta una ena tce ft on sno oa bbl excepinal par xeric les propramas: simplemente fers siaee fea nic AS, per cempo, es pose escihr programas etnctraocn Fonvan ose mas orentadosa bets enC, pero x ianchaaent aie hacer prc noe os tuajs jue soponen de manera duecla eam ties soporte paraunparalgma ops St la ‘oma eve de recs del ng: je queyermia elas directo de ptadigma, sino anti rma has sl de co bacions enn de eecucin soon terpo de complain pre decor a desta iinersonaa Se mismo. La comprbasion de tips evel eenpo ic Sens ty s© san detccin den ambighedad ycomprobacnes entero de Secuson yon ne Dla soporte linseed on paraiznas. Recuven exist come Le Bol teas fs entre de programaignputenaumena ct seper den ponies Un inguje no es necnramente gr gues org pines ana cst ea Ge «lotro 0 tiene. Hay mucho ejemplos deo Contato La inpoateno so ate eso "acterisias que pen un lenge, como que esa cuactetacas tan soe naa ‘opona los eslonde progam desis ena at splcacrs enn (1) aa ls cameras dete exter Lpiny eepumemsne nepads ca engue (2 be ser pose ua scarcer en combina ars ipa ce ‘& otro modo, exigirian caracterisiicas independientes alicionales. 7 [3] Bebe hater an pocas carci expres} spares copeificse come sea _ (4) implementa de ana sracteritica no debe impaer coses esa importance stor proganas que no aecesten 15} Uo usuario cebe neces conoe lo el suconun celle sado exp tmente prs esi on programa Bl pring pincipioes una amas l esticay Ta ie. Los dos siguientes son exe ssn de ida de minimal. Lis oe ltmos pace seaumine ch te oreo ce Toque w spas no haga dan Ute dsead> prs sopor abstain de duos. prog anacin crema obos » progninacion grea, alerts de tcncn tadconaes de con on eens hee pretend’ que impos un etl de progamaionconceto «eels usa En bs apartacos siguientes se etudana guns exon de pepanstn yo mecei sos le dl lenge ue lox soon. La presnaiga eso ans nie oe eng due van ese a poramacion pr procedinienes ant el wands forme carn tropanacign orenada + objets» prograacion tna conel aod dale fase paraigna se contuye sobre los que than pcceio.aaie algo micioal nenaae Herramientas el propamador Cx tefl unplaneamiena de decks dense 2.3 Programacién por procedimientos Et paradigm original de programacitn es: Deciir qué wovedimuetos se desean: usar los mejores algcritmos qu? se puedan encontrar. Bl centro de ate cidn estéen cl procesamiento: 2 algoritmo necesario para realizar e cl: ceulb deseado. Las lenguaes soportan este paradigma proporeionando recursos para pasar fargu-nentos alas funciones y Jevolvierdo valores de las furciones. Lo putlicado ex rela cin con esta fexma de pensamiento ei repleto de andlsis sobre formas Ge pasar Ios ar= ‘gumentos, formas de distingur diferente tipos d> argumentos, diferentes tipos de funcio- nes (procedimientos,rutinas y macros), etcéters Un ejemplo vpico de «buen estilo» es una funsién de rais ewadrads (sqr). Dado un ar gumento en coma flotante de doble pecisi6n, produce un resultado, Para elo, realza un tefleulo matemsico bien conocido’ double sqn (double arg A 1 eédig para caleuler una rai euadree void f q double -oot2 - sgrt\2) : Mu Las aves expresan agrupamiento en C4+. En ese caso indican el comienzo y el final de los cuerpos de Lis funciones. La doble bara inelinada alve un comentario que leg hasta lira de Ia linea, La palabra clave vaid indica que una funcién no devaelv= ningun valor. Desde el punto de vista de la organizaci6n del frograma, las funciones se usan pars crear orden en un laberinto de algoritmos. Los propios algoritmos se escriben usando Hlamadas a fancid y ote recursos cet lengnaje Fn los sutapartadys siguientes s2 presenta una ver- sin reducida de Tos recursos “undamertales de C++ para expresar ealeulos 2. Variables y aritmética Todos los nomtres y todas las expresiones tienen un tipo que determina ls operacioy {que se pueden ralizar con ellos. Por eemplo, ln declaracién int inch specifica que dach es de tipo int; es decit, inch 2s una variable entera ‘Una declaracidn es una sentencia que introduce un nome en el programa. Espectica 'untigo para ese nombre. Un sipo define el uso adecuado de un nombre o una expresin, (C++ offece una serie de tipos fundamentales, que se c»-responden directamente con recursos del hardware. Por ejemplo: bool 1 s0oleano, fos valores posibles son verdadere y false char I cardcter, por ejemplo, “a, °c’ y'9 int Hentero, por ejemplo, I, 42, y 1216 double 1 ximero.en coma flotante de doble precisiin oar ejenple, 3.14 y 269783.0 Una variable char es del tamao natural para contener un cirécter en wia méquins deer ‘minada (ipicamznte, un byte) y una varicble int es del tamaio natural nara aritmetica de enters en una méquina determinada (tipicamente, una patra). ‘Se pueden usar los operedores aritméticos para cualquier :ombinacicn de estos pes: 4+ dims, tanto monario como binario = Aimenos, tant» monario como binario + Ai mutipticar 1 Weividir eee ‘Lo msmo ocure con los operadores de comparacisn = Miguat I= Meistinto © Mnenor que > Wnayor que menor oigual que = mayor oigual que En lasasignacienss y en ias operaciones artmsticas C++ reali todas las conversiones cue tienen sentido enre los tipos bisicos, de forma que se pueder mezclar Hibremente, oid una fencion<) i funcién que no devuelve ringuin valor double d = 2.2; Winiciaticar mimero en coms flotane int i= 7 Winicialcar enter dad Masignar suma ad i-dei; Wasignar producto a i Comocen C, = es el operador de asignaciér y == comprucba b igualdad, 2.3.2 Pruebas y >ucles C++ proporciona in conjunto convencional de sentencis para expresa:se‘eccién y backs. ‘Veames, por ejerplo, una funcién sencilla que da un mensie al usuario y develve an booleano que india la respuzsta bol accept) ‘cout << "Desea continuar (s 0 n) ?\n* ; Hescrtir la pregunta char answer =0 i toner ane : cout sto de sae Inder cc epome es) as coo opera de dec ar lor cobleet den) incon operat ene choo car Eig del prada daha de v= tna sadn ep sae casino dea porcine enna crise a fide cadre to de lide representa un sal a 'El ejemplo anterior se podra mejorar ligeramente tenienco en cuenta uns respur leer ta respuesta '") return true; ‘ool accept?) ' cout << “Desea continuar ($9) ?\x char answer = 0. Mescribir la pregunta leer ta respuesta switch (answer) ( retucn true: retwen false defaute: ‘ut << "Tomo su respuesta como n1 no.\n" retwen false; Una sentencia-switch contrast un valor con un conjunto de constantes, Las constantes de loseasos deben ser distintasy, si el valor probsdo no conceerda con ninguna de elas, se elige default. No es necesario que el programadcr proporcione un default ‘Son pocos les programas que se escriben sin bucles. En este caso, nos gustaria felt a usuario utos euantos intents boo! accept3\) int ry <1; while try <4 ‘cout << "Desea continuar (5.0m) °m" + describir la pregunta ‘char answer = 0: sith (answer) tr trae rte fas; default Meer la respuesta ‘cout << "Perdon, no lo entiendo.\n* ry = ry 61; , cout << * Tomo su respuesta como un n>. \n* return false; 1 La sentencia-wRile se ejecuta hasta que se condicion se have false 23.3 Punteros y arrays Un array se puede declarar de la forma siguiente: char v (10) ;/ array de 10 caracteres De forma similar, un punte se puede declarar as cchar* p: 11 puniero a un cardcter En las declaraciones, |] significa «anay de» y * significa spuntero a». Todos los aay tienen 0 come limite inferior, por lo que v tiene diez elemenos, v().9/9). Una vieia bie pantero puede contener la diteccida de un objeto del tinc adecundo. P= 6919]; ip apunta al cuaro elemerto de v El signo & menario es el operador «ditecién de, (Censideremos la copia de diez elementos de un array a oto void otra_juncion () ( int v1.10. int v2 10) Us for (iat i-0; ic10; i) vd} ev2t): Esta sentencia for se puede leer como «poner i a ero, mientras # sea menor que 10. vo Pir el iésimo slementa¢ inerementar is. Cuando se aplica a una varie entera, el ope rador de incremento ++ simalemente afade 1 2.4 Programacién modular | Alo lrgo de los aos, en & diseio de programas el énfass 2 ha desplizado del disco de los procedimiento ala ergunizaciéa de los datos. Est rele. enre otras cont, Um ‘umerto en el :amafio de los programas. Un conjunto de procedimientosafines junto com los davos que manipulan se denomina a menudo médulo, Eparadigma de programacién ~ Decidir qué mddutos ve desean L_ partir e programa dt modo que los datos queden ocutos en los modulos. ‘ests paradigma se conoce también como princiio de ocultacidn de datos. Cuando 10 hay eripamierto de los procedinientos son los datos relacionsds, el eslo de prograraci6n proced:mientos es sufiiente. Las técnicas para diselar «buenos procedimientos» se Porecan ahora ambién a cada uno de fos procedimientes de un médulo. El ejempio mas fede rédulo es la definicidn de una pia. Los principales problemas que hay que fresoen ‘si Gvoprionar un inter de stra prs a ila cones pak y nap) Dp} Acegurare de que slo se pueda accede fa representacicn de apa (por jem pio, un aay de elementos) por medio de esta ntefsz de suaro 1p eegurarse de que lala sen iilizada antes de er usada po pivera ve cet proporicna un mecaniimo para arupar dos, fucione, etcetera, relacioralos en Jowde nombres independiente, Poreempl ante de usvaro eum méde Stack feria deckirae 9 sare as: ramespace Stack {——interfaz: oil pas char) char op ) void f) Stack: :push \'e"): if Stock: :pop () ‘= 'e") eror ‘imposible La nalifiescidn Stack: indica que push () y pop () son los del espacio de nombres Stack, NNointerferrin ai causardn confusige otros usos de esos nombres 1a definicin de Stack se puede prxporcionar en una parte del programa que se compi- le parte: namespace Stack { 1 implementac ‘const int max_size » 200; char v(max size) inttop = 0; void pash char e) | /* comprobar que no haydesbordamiento y meter */ char pop) (/* conmprobar que no hay subdessordamiento v extraer */ } punto clave de este médulo Stack esque el eédigo de usuario estéastade de la represen tackin de los dstos de Stack por el c6sigo que implementa Stack: push) y Stack::pop E ssuario 0 necesita saber que Stack se implerienta usando un array y e puede cambiar lainplementacién sin que ello afecte al e6dige de usvavio. Debido a que los datos son solo una de las ecsas que se podria desear «ocular», la no- cia de ocultacién de datos, ulizada deforma 20co cuidadosa, abarcala de oculacion de infermacis; es dect, también los nombres de las funciones, 10s tipos, etcetera, se pueden hacer locales de un médulo. En consscuencia, C++ permite que cualquier declaracin sea colecada en ur espacio de nombres ($3.2). ste médule Stack es una forma de representar una pila, En los apatados siguientes se ‘bl an diversas pilas para ilustrar disintos estos de prog:amacién 2 Compiacion separnda C++ soportala noc de € de compli ain sepa, que puede usa para organi un Programa en un conjunto de fragmentos semiindzpendientes. : oe Habiuamentecolecum>s ls deceacones que especiican la ierfz para un malo en un archive com un sombre que indca su uso evista, A namespace Stack inert void push (char) ; | Char pep : | se colocaria en un archivo sack y os usuarios incurs de cabecera, dea forma sguene include “stack 28e archive, Hamado archivo Hobvener ta interaz void f() ‘ ‘Stack: :push'e"); (Stack: spop () =e" error|imposisle®); ’ ara ayudar a campiltor arantizarla coherence aio mentacion del meu Stack incl ambien a eran include "stack namespace Stack (—__//representacin const int mas. size » 200: char» ma seet int tp "0: , void Stak: :push\ char} ( /* comprobar que no haydesbordamiewoy meters * ‘har Stack pop\) comprohar que no hay subdeshordamiena seca #/ El cédigo de usuario va en an te hi Alig 1 en an tercer archivo, por sjemplo, er. El edligo de usere stacks compan la infomocion de intra de ps preset en ace pave td archivos som oro demisinfepediemesy pueden ser compladoaperseprae, Las age ‘menos del programa spelen represent grfcament {que proporciona la imple MW obtener la intefaz stacks | inerfas Stack orice | | wncide acta?” — | ncnde “toca or fine ta La compilacién seoaradacs us problema.entodls los prograrrat reales: Noes sin unapreocupackin en programas que rresentan como méiulos recursos como una Steck. El rode compilasion separada no cs, ensentido estricto, un problema de enguaje; een pro biema de edmo aprovechar mejor una implementacion concreta del Ienguaje. Sin embar fevtiene grit importanca prictica. La mejor forma de wescvero es raximizando a mo selaidad, representando esa modularidad lgicamente por medio de caracterfsticas del fengusje ¥aprovechando entoncesfisicamente kc modularidad por medio de archives para tana compilicic separada efectiva (capitulos 8 » 9) 242 Manejo de excepeiones CCxzndo un programa esd diseiado como un conjunto de néculos, el manejo de excepciones ideo considerarse teniendo e1 cuenta esos médulos, ,Qué médulo es esponsable del ma- neje de quéerrores? A menudo el méolo que detecta unertor no sabe qué aecién 2mpren- {der La accidn de recuperacicn depende mais del médulo que ha invocato la operaciin que ‘del médulo que ha encontrado el erro mientras intentabe realizarla. A medida que los pro- jgramas crecen, y especialmente cuando se hace un ampio uso de la bibiotecas, auie: ren importencia los estindares para manejar los errores (0, ms en gener tancias exeepeionales») ‘Yolvamos al ejemplo de Stack. ;Qué hab-‘a que hacer cuando intentamos splicar ‘pesh () a cemisiados caracteres? Quien ha esc“to el médulo Stack ne sate qué eso que fal .suario le gustaria que se hiciera en ese case, y el usuario no puede detectar el proble mma de manera continuads (si pudiera, no se produciria desbordamiento), La solucin est fen que el programador de Stick dete el destordamiente y se lo comurique al wsuario {(de:conocido), El usuario podtd entonces emprender la acci6n apropiada. Por ejemplo: namespace Stack { ——//iterfaz void push (char) ; char pop): class Overflow ( ; Iripa que representa las excepciones de desbordanento [Al Jetectar un desbordamiento, Stack: :pusi (| puede invccar cl eédigo d= mar cepeiones; es deci, «lanzar una excepcidn Overflow: void Stack: :push (char e} jode ex: if top == max size) throw Overflow ( meter ¢ ) E ahrow transfiere el contra un mensjador de las excepciones de tipo Stack: : Overflow cen tlguna funcién que directo indivectamente ha lamado Stack: :pash ). Para elo, la implementicién desenredari la pila ce lamadas de funcién para volver al contexto de es lanada, Ass pues, throw actia come un reture multiniel. Por ejemplo: void fi) ” fry (i exepcionestratadas pore manesidor defo mis adel hie (rue) Stack push 'e) ) catch (Stack: :Oveftow) { (aya desbordaniento det pila: emprender kein adecuda ) ” ) 1 ce while instar ite indeinidanente Por ano, sire a elisa eh ue prporione un maneadr pura Stack: Overfow desu dec sguns llama Stack: : push |) cause un throw. tee Eo de mecaismos de mnsjo de xcpciones puede lac manejo decrrores ms regulry leibe.Véase $8.39 capt I para an anise mis pormenorsada 2.5 Abstraccién de datos La mecularidad es un aspecto fundamental de todos los bueeos progeamas grandes. Se ‘mantiere como centro de ateacién en todos los comentarios sabre diseio realizador alo largo ds este libro. Sin embargo, los médulos, tal eomo se han descrito anteriorments, no Son suficientes para expresar con limpieza sistemas complejos. Voy a presentar ahora una forma de usar Ios médulos que proporcioms una fora de tipos definidos por el usuaric 4 contiuacién mostraré eémo superar alganos problemas dz ese planteamienio definica. do direcament tipos definidos por el usiaro, 2.5.1 Médulos de definicin de tipos {La progamaciéa con médulos conduce a una centrlizacién de todos los datos de un tipo ‘bajo el control de un méduto gestor de ese tipo. Si, por ejempl quisiéramos muchas as —er lugar de Io nica que proporciota el médulp Stack an-rior— podfamos detinit lun gestor de plas con una interfaz como la siguients: nanespace Stack ( struct Rep W defnicién de ia estructare de ta pila en otro lugar ‘ypedef Repistack; ack ereate() ; W hacer unas nueva pita Youd destroy stacks); borvar s push (stacks, chare!; i meter cen s ‘har pop{stacks); Wf sacarde s La declracién struct Rep ic ue Rep es mombre de un ip, pet deja ado eltpo pars despts (87 La declaacién, ea ela ‘typedef Reps. stack dae nombre stack 2 una eteferencia x Rep» (detalles en §5.5). La ides es que una pila se ‘enifica por st Stack; :stack y que ls demas detalles estén ocultos pars Tos usuarios, ‘Una Stack: =stack actia en gran medida como una variate de un tipo predefinio struct Baa pop (7 void J) Stack: :stack $1 Siack: create () ; — M hacer una nueve pita Stock stack s2 - Stack: :eteate(): haces otra nueva pila Stack: :push (s1,'e’) ‘Stack: spush (s2, 7°); ‘Stack: :pop ($1) 1= ‘e") throw Bad pop () Uf (Stack: :pop (s2) = “k") throw Bad pop Stack :: destroy (s1): ‘Stack: destroy 32) Podkiamos smpkmentar esta Stack de diversas formas. Es importante que los usuarios no rnesesiten suber emo lo hacemos. Sieripre que mantengams la interfaz sin modificar, al Uustario no ¢ afzetard que nosotros devidamos reimplementar Stack, ‘Una implementacign podrin preasignar memoria para unas cuantas representaciones de pilsy dejar queStack: sereare() diersuna referencia. a una ro utilizada. Stack: sdesray |) podria marcar entonces una representacién «no utiizadas de modo que Stack: :ereate | putira recta: ‘namespac* Stack const irt max_sice = 200; stract Pep char y|max_size|: int top; 1 representacién Unimero mésximo de plas Mrepresentaciones de pila preasignaaas const irt max ~ 16: Rep stacks (max bool used {max} : Msed (i) es verdaderorsi stacks (1) estd en us9 void Stach: :push (stack s, chore) { /* comprobar desbordaniento de sy meter ov ‘char Stace: ;pop stacks) { /* comprobar subderbo-damiento de sy sacar */ ) Stack: :stack Stack: create) i 1 eegir Rep mo usada marcarls como usia, inicialicarla y devolser referencia a ella void Stack: :destroy (stack $) /* marcar s como no usada */ ) ‘Le que hemos echo es envoiver un conjunto de funciones Je inerfaz.en toro al tipo de |a reoresemacida, Cmo se comport el «tipo d Ia pila resultante dependers en parte de _céme definarmos esas funciones de interiaz, en parte de co presentemos el tip de la ‘epresentacicm a tos usuarios de Stacks y en parte del diselo el tipo de la representacidn ‘A menudo lo anterior esti lejos de sr idéineo. Un problema importante es que la pre- Sentari6n al usuario de stipes falsos» cemo el descrto puede Vatriar considerablemente exesidades. Censideremos un tipo Steck defin co por e stati de lamikma manera que ltipo comptex. Para que el ejemplo sea un pore ms realeta, el tipo Stack ests definide aratomar com argumento su niimem de elementos: class Stack { cchar* + int top int mex size; public class Uaderflow ( ) class Overflow (3 class Red size ( }; MW usada como excepeiér 1 usada como excepeicn 1 usada como excepcién Stack it 8); W constructor Stack) W destructor void push (char) : char pop); El constructor Stack (int) ser llamado siempre que se cree we objeto de a clase. Eso tiene {en cuznta la inicalizacién, Si se necesita realizar alguna accion de liripieza cuando un ab- jeto de Ta clase sale fuera de su Ambito, puede declarar vx complemento del corstuc. tor, denominado destructor Stack: : Steck (ints) 1 constructor ‘ top Y1000e; 1 usada como excepeién virwai void push (char e) =; virwai char pop) = 0; sa estar en Simul y Cox, Una sedan Se Sal oenge ee et sip nr bu tno Pe gee ee disc aaa ups e jue implemente sus funciones push () ( tate Esa Stack se podria usar asi: oe void f (Stacks s ref) i fee ae bee esto como usaf) tina Stak en compe lc implemeniacion. Una cla que poyorcion a neta so iar men atre 00 er epee, a inplemetain pods contr de Sch je a guado fuera de mer Sack nt ss Aray. stack: publi Stack harp Ines sie; int ton: bite Array Stack int) Sarraact void pch (char); thar op ignorancia ds los detl as diversas clases se deno- todo lo de la elase concreta W Array stack implementa Stack Aqui, «:public» puede leerse como «se deriva de». «impleme Para que wna fusion como (use un Sack ignorande implernentacin es necesario. i ‘opera or ejemp: vod gi) mY «es un subtipo de Dr completo fos detalles le |e alguna tra funciin haga un objeto sobre el eval pula " : Array_stack a (200) Puesto ie () no sabe nada d> Array_stecks, sino que slo coroce la intertaz Stack, fu maré ualmeate bin para una implementaciin diferente ce ana Stack. Por semble lus List stack + public Stack { if List stack implementa Stack Btccharole a in coo ‘ista de ecracteres{ biblioteca estinder) ($37.3) Hist_stack () ( void pusit (char ©) ( tepush froutie) ; char pop); de ‘char List tack: : pop ( MW obtersr primer elemento W elininar primer rlemento earns : r? ch _fr lade ae ; stack y haver que fi) ia use: 24 Funciones virtuales {40émo se resuelve la Hamads s_setpop () en +) para a definiciGn de fancidn adecua- 4a? Cuando) es lamada desde h debe ser llamada List_stack : pop (). Cuando esllemada desde g (), debe ser lamada Array_stack::: pop (). Para lograr esta resoluci6n, un osjeto Stack debe contener informacin que indique la “unci6n que debe ser llamada ‘entiempo do ejeeucién. Una tenica de implemenacién habi ual es que el complader con- Vert fa amad de una funciGn virteal en un indice de ura tabla de purteros a fancio. nes. Esa tabla s2 denoming habitualmente «tabla de funcioves virtuales» o, sencillamen- te, nbl, Caca ura de las clases con funsiones virtales tiene una vibl propia que ideatiiea sur fineiones vinwales, Se puede representargréficamert ObjetoArsay_sack: bl + i. = ‘Auray stack :push() | ’ = — max_size| ae —~>|_Asray_stack : :pop) | top i ae Objeto List_stack: : —— | dist_stack : :pash () : Jo aks nO) I Sp a stack pep 1) Las Uunciores ce la ve permiten que el objeto sea usado zorrectamente aun cuando st tamaho y la distibucién de sts datos scan desconocidos par el autor deta llamada Todo logue éste necesita conocer es Ia locabivacién de a vel ev uaa Stack y el indice usado para cadafuncién visual, Este mecanismo de llamada virual se puede hacer esencialmente tan fiei:me como «1 mecanismo de «llasada de funcién normal», Su coste er cuanto « espa cio €s un punte-o en cada obeto de uaa clase con funciones virwales mis una ¥f8l para cadauna de las clases, 2.6 Programacién orientada a objetos {is abiraccién ds datos es fundamental para el bien diseRo y se mantendré como ceatro de atencin del ciseRo a to largo del presente libs. Sin emtargo, los tpos defnidos por ¢1 usinrio no sor en si mismos suficientemente fexibles gama atencer nuestras necentig es. Fh este apattado se va a plantear primero un problerra con tipos de datos sencilos Aefiidos pore: wsuari ya cominuacién se va a mestrar eémeresoverlo usando jerargusy de clues, 2.6.1 Problemas de los tipes concretes Un tip» conereto, como un stpo falso» definido por medio d+ un médul, es una especie de cajc negra. Ura vez definida esa caja negra, no interact realmente con el reto del Drograna. No hay manera de adaptarla a ruevos wos si noes modificando su definietin Esta siuacién puede ser ideal, pero puede también conducira una grave inflexibildad CConsidsremos ia definiiin de un tipo Forma pars su uso enum sistem grafico, Supe {gamos por el motrento que ese sistema tire que soportarcitelos,tiingulos y cuad-a Supongamos tamtién que tenemos class Punto /*... */) cess Color /*.. */ /* y */especificas,respectivamente, el comienzo y el final de un comertario, Esta no ci6n se puede usar para comentarios de vasias lines y para comentarios que terminan on tes del inal de uns linea, Podramos defiti una forraa asf: ‘enum Varieded ( cireulo, trlangulo, cuadredo } ; less Forma ( Variedad ¥ Punto censo: Color ect; 7 public oid dij () + 1 enumeracién ($4.8) 1 campo del tipo El scampo del tipo> k es necesario para permitie que operaciones como aibujar () y gi rar} daerminer d qué forma se trata (e1 un lenguae semejante a Pascal. habria que ser an registo variante con etique'a k). La funcién dibujar () se definiria as void Forma: :dibujar) vite (ky ( case circule UY dibuiar un etrculc break: case triangulo 1 dibujar un triéngulo. break case cuadrado: 1 dibujar wn cuadrade break: , 3 En consecuencia, el cédigo paracsalquier funcién semejante aut a eases sraciones con las formas. No podemos ‘ las operaciones. Dado que afiadir una forms nueva en‘raiia «tocar el eddigo de 2.62 Jerarguies de clases sas or temas en gue wohay sini nes propia ene eae tc ec ua foma ine on coe, puede Ajanta de on tec erm ican me ar ee ta je po fn ato se chen te a xen din 9 re Into cs Toque deine a rograma eta oto Los lengua om cost: Shs Lt det leaps wl sron — Eten de herent tno or 2+ Si) por ls. late gue defi as pple goers de ns as primr ugar, especificame forms class Forma Punto centro; Color eat; u publie Punto donde) (return cen'to : void mever (Punto hacia) | centro — hacia; /*.. */ dibujar() Virtual void dibujar |) ~ 0; Virtual void gi u Come en el tpo abstracto Stack de §2.5.4 las funciones paca las que se pucde divi la intefiz de Hemada —pero 2n las que ‘a implementaciGn no puede ser detinida togavie- son wrtual. En particular, ls funciones dibujar() y girar( "se pueden detnir slo para formas especifices, por lo que son declradas virtual Data esta definicin, podemns escritir funciones generals que manipulen veciores @ punteos a formas wid girar_todo(vectoriv, int angulo) ¥ girar los elementos de v tingulo' grados Sor (ints = 0; icvsize|) 7 +8: v8) ~ >girar angulo) ; Para definir una forma concreta, debemos decir qu2 es una forma y especificer sus fropie dades soncretas (incluidas las finciones virtuale lass Circulo : public Forma ( 1 int radio; public: void dibugjar() (1... 4) void gira int) () 1 i le juncidn mula h En Ct se dice que la clase Circulo es devivada de la clase Forma y se dice que kaclse Forma es una base dela clase Cireulo. Una terminologta alernativa lama a Circuly y Forma subclase y superclas, respectivamente, Se dice que b clase derivada hereda lox ‘miembros de su clase base, por lo que el uso de clases base y cerivadas se denomina habi tualmeate herencia El puradigma de programeci6n es: iE Decidir qué clases se desean: | Preporcionar un conjurto completo de operaciones vara cada clase: | hacer explictos los aspectos ode la herencia. | (Cuandc no existen aspectos comunes es suficiente ka abstraccin de datos. La cantiad de ‘aspectos comunes entre los tipos que se puede aprovechar usande la herenciay las func ones Virtakes es la pueda defintiva de la aplicabilidad aan problem de la programici6n crien, tada a chjetos. En éreas como los grfics interactivos existe slaramente un enorme ane bite par la programacién orientada a objetos. En etras, como los tiposaritmiéticos els £08 y lcs cdlculos basados en elles, aparentemente asi no hay: Ambit més que pars abo. {raccidnde datas y os recursos necesarios para el soporte de prvgramacion onenteds to. jetos purecen imecesarios, Encontrar aspectos comunes entre los upos de un sistema fo es un proceso trivial, La ccantidac de aspectos comunes a explotar esti afeetsda por Ii firma en que es:é disehado cl sistema, Cuando-sediseia a sstema —e inclusa cuando se escriben los requisitos del sistema— hay que buscar activamente aspectos comines, Las cases se pueden dischares- Pecfficamente como bloques consiructives para otras tips se pueden examiat las la- ‘ses existontes para ver si muestan semejanzas suscepsiles de ser aprovechadas enna clase base contin Jc exlicar gut sla programa n orienads objets sn eur cons amie cua Se poprastoncapesic, cone elector [Ker 15871y mat en $23.6. ; Ce acl aches ars '9254) cmplemesan te se agar ae erctmeniari ¥ a menudo se soporan mutwamente, Asf.por ejemplo as clases y Ios ca diveros paradigmas de acxerdo con las necesidades Gisetador con experiencia aplca diveros paradig 217 Programacién genérica Esxpaco prague aauien que quirauna ta quis siempre una pit de craters Una pila es un concepto general, independiente Je la nceién de carécer cia, debe resresentarse de manera independiente Ex general, s un algoritmo se pued> expressr con independencia de los detalles de representaciin, si se puede hacer esk sin excesivo cose y sin contoniones logicas, hay aque bacerlo El paradigma de programacién es: - ~~ Decidir qué algoritmos se desea; 2a. e-camacteres y convertion pla-de-lo-que-sea haciendo Podemos generaizar un tipo pla-de-caracteresy : 7 de éluna plantiday sustituyendo el tipo especitico char por un parimeto de plantila. P ejemplo: template class Stack | Tsp. int max size: int top: public: class Usderflow ( ) class Overflow ( Stack (mes); M/consirucior Stack}; M/destructor void push T pop) bs El pretijo tempute hace de T un parimetro de Iadectaracién ala que sieve de Pref, : [Lis funciones miembro se podrfan definir de forma s mila Contenecores femplate void Stack: :push \T e) ¥ (op == max size) throw Overflow | ¥Utop) =: {op =top +1 } ‘emplate T Stack : pop \) if (top — 0) throw Underflov ) ; top =top ~ 1 retura ¥(top) : Dads estas definiciones, pedemos usa pilas com las siguientes: Stack-se ; UW pila de caracteres Stackseple; —1/ pila de mimeras complejo; Sacke istcint> > sli; 1 pla de lista de enteros void f4) sepush (e") ; ¥ (sepop') \= ‘e’) throw Bed pop) sepls.push (complex (1,2) ); 1 F ser90n = complex 1.2) throw Bad pop De mo similar. podemos definir lists. vectores, mapas (ei decir, arrays asociativos), tcétert, como plantills. Una clase que contiene ura coleccisr de elementos de alsin ipo se denomina habitualmente clase conteredor o simplemente (7 ~ >t 1 weuencia tene un comienzo y un final, Un iterador se refiere a un elemento y pro erento de la se- ado mas us m eevant opacion qu hae su © erador 2c refen siguiente mca nade una secuecia es ur rador que se rele un elemento eure nm la secuencie La reenentaic iis de finaly puede ser un len al pela pot a ene por que ser. En ealiad lo portant es qucesta noc de eS cure una ampliavaedad de epresemacones,ieluids lists y arays ‘textamos guna toacin esto paraqeracions com saealera un elemento pov edio eur ierador shacer qu el erase rier a elemerto siguientes as peridadr obvias (ua vez que se tne Ia des son si perador Se deseferencia * ar iar caccder aun elreno por meio dun tral yl opersdorde increment mera incarshacer qu el teradorse refer al elemenasiguient Teniend en cena lo anteor,pocmos exc cedeo templte-class Entrada, class Salida> vid copy (Entrada desde, Entrada demasiado jos, Salide a i while (desde \= demasiado_tjos) sa-*aesde; I! copiarel elemento al que se apunta se: W entrada siguiente sséesde: W salide siguiente ) > Eso copia cualquier contenccor paral que podamos di Ta senntica adecuadas, Ls tipos preletinidos en C++ de stray y pursero de baje nivel tienen las operaciones. sideeradas para 0 anterior, por lo que podemos escribir F iteradores con la sinuxis y char vel (200); // aay de 200 caracteres char ve2 (300); array de 500 earacter2s void f) t copy (ve (0), Svel (200), ve201) + } Eso copia re desde su primer hast stim elemento en ve2 emperando en el primer elemento de vez Tacos los contenedores de la bibietea estircar ($16.3, capitulo 17) soportan esta no- cién de iteradors y secuencis Se usan dos parémetros de plantll, In y Out, para indicar los tipes de la fuente y ot destino en lugar de un solo axgumenta Esto se Fa hecho perque a menudo queremos co- Pier Je un tpo de contenedo a oto. Pr ejemp complex ae{ 200) ; ‘oid g (vee-or& ve, lstccompler-6 Ie copy (se 10} sae 200), ein) ony lebegin) steend eben 1: 1 Esto copia el ary’ st ya lit nel vector Para eS un iterador qu? apunia al primer elemento, a 2.8 Posdata Ning lenge de programa es pret, Por : , fortuna, res nesta que un nel de programas sea pefeco para gue consiya ta bucnsberaions po loon ci de prandes sistemas Ea edad n nguaje e pograrnicn detec goer pe ser petecto pandas as inoumerables tes ues le denina, Lagos epee una toe sce ravemente dfetiose para on, pong a pefeetn ok ine ae alica epecilizac én. Ac ps, Ce fs cnc par se ra beens hearin a éreacen de una anplia vida de svemasy pa permit qe ane spies ideas sean expresadas directamente. 7 m= : . No odo pus expressediectanest wsando hs cratic predefnidas de {uae Fa rela tampoco es es 1 el Exisenaratersca el Lape a cor diver els y denies de progam, En comsecuenia I ts de oped en tue de cenrase en el domino dels stems ator suns dees acon on a comprens hasta el minimo dtl de tos as carta el een En progranscion pctivnofece ny pocas emaan coc asta lar coe ‘cas mai oscuras del lenguaje o utilizar el mayé isticas. mayor rimero ps be de enruteitias arate dl inguae asada tee poco inter Solo eae seldes intra en éontex gue preprionn as eis yet dems evactrna Aatpusecnieg ae ts capt no peri visa el et qu ainda ele ean’ odie ++ ser caar de uso conjutament pa seprtar untae de pees en el centexto de cisefios sensatos. ae 7 2.9 Consejos {1}, Que no cunt isco, Tod se claar ens moment; §21 [2] Noes necesasio que el lector conozea :odos los detalles Je C. c ‘nos programas; §1.7. Hy que cencntane en las encase pogmacion, yen crc lergunjes 8, “4d Recorrido por la biblioteca estandar Por qué perder el tempo apresdiendo ‘cuando ‘a ignorancia es instantinea? Hobbes Bibliotecas estindar — salida — cadenas — entrada — vectores — comprota- cidn de rangos — conteredores: generalidales — algoritmos — iteradores — iteradores de E/S — wansversales y predicalos — algoritmos que usan funcio- nes miembro — algocitrros: generalidades — nmeros complejos — aritmét cca de vectnres — biblioteca estindar: genetalidades — consejos, 341 Introduceién [Ningin programa importaste xe escribe nica y exclusivanente con Ienguaje de progr ‘maztn, Primero se desarzolla an conjsnto de bid iotecas de apoyo que constituyer fa base paracl trabajo posterior. ‘Como continaacidn del anterior, el presente cepitulo cfrece un recorride répide por los recusos bis cos de biblioteca, para der al lector tna idea de lo que se puede hacer usando Coty su bislicteca esténdar. Se presentan tipo: dtles de biblioteca tales como string, vecter, list y map. asi con formas ites de usarlos. Elo ine permite ofrecer ejemplos y ejerccios mejores en los eapitulos siguientes. Ccmo en el capitulo 2, cnito vivamente al lecter a que no se distraiga ni se desarime si no entiende completamente fos detalles. La finaldad de este capitulo es ofrecer al lector una idea de lo que va.a venir y ayudarle a enteader los usos mas sencilles de los recursos ce bibl stiles, En §16.12 se fa cits una introduceisn més detallada ala bibliot-ca esténdar. Ls recuisos de biblioteca estndar descritus en este libro forman parte de cualquier impkmentacién C++ completa, Ademis de la bislioteca es-éndar C+4, la mayor parte de las inptementaciones ofrezen sistemas de «intetfaz gratica de usuaric», a menudo deno- rminados GLI (graphical user interface) o sistemas de ventanas, para la interacciGa entre el usuario y el programa. De modo semejante, le mayor parte de los entomos de desarro lod: aplicasiores proporcionan «bibliotecas funJamentcles» que soportan entornos de de- sarolo yl ejecucin westindar» de ls emprest o sector de que se tate. Tales ssn y bibliotecas no se describen aqui. Lo que se pretende es proporcinnar una deserincisn ay ‘6toma de C++ tal como lo éefine e estindar mantener la portibilidad de Ios ejenplos, excepto cuando se seiala expresamente lo contario, Naturalments, amo a los programa, deees a explorar todos los recursos de que disjongan en todos ls sistemas su alsance, Peo esa tazea se deja alos ejercicies iHola, mundo! El programa C++ minimo, int main) ( define una fureién denominads max que no tema argumentos y no hice nada Todos los progranas C++ han de tener uns huncién llamada main). El programa eo Iienza ejecutando esa funcisa, El valor int devwelto pot main () es.en su caso el valor int main) std: scout << "Hola, mundo \n" ; 1 i La inea ¢inelade da al compiladorla insteueeidn de que incluya Tas declara- cioses de los recursos estindat de E/S que se encuentran en dastrecm. Sin esas declatacio- res Ia expresin Std: :cout << “Hola, mundo \n* ; 4 ‘no lendria sentido, El operader << (sponer en! escribe su segundo argumento solxe si primer argumento. En este caso, se escribe el litral de cadena "Hola, mundo" en el ‘lu de salidaestindar std: scout, Ur literal de zadena es una secuencia de caractens ro {eata por comillas debles. En un literal de cadera, el cardter de barra invertida \seguido de cro cardcter deno'a un tnizo carécter especial. En este caso, \es el caricter 4 salto de Ine, de modo que los caracteres escritos son Hola, mundo", seguidos de mn salto de Tea A 3.3 El espacio de nombres de la bibli {La biblioteca estindar est definida er un espacic de nombres (82.4, §8 2) llamado std Por sta razén por la que he escrito std: scout, et lugar de Slo cout. He indicado rx. lamante que se use standard ccut, y no otra cout Todos los recursos de biblioteca esténdar son proporcionados por medio de alga ‘beoera estindar semejante a . Por elemplo: joteea estindar inclde-sring> ting namespaces; Strings" Bienaveturad el fgnorante pera ee mal gusto descargar todos los wmbre de un espacio de nombre Eps de nombres lol. Sn embargo entrada brevedad, elo Fapmnton Pro fina oad pra sar carters de rie del iblieca emit rept fs sraicaions ticle std 1-9 To largo dl bro cai exlivamente la tite tain poo ues Se ica unre ea ib ofc etd, trata dew wo Sele que ec: el estar ora parte deus expen sobre emo pa denise eines etandar 34 Salida La biblioteca de lujos de entrada y s:lida defn: la sala para todos los ipos predeint os, Ademis, es facil definir la salida de un tipe definido por el usuario. Por defecio, los Valores de slide & cout son convertdos en una secuencia de caracteres. Por ejempb, oid f t cout << 10; caricter 1 seguido por elcaricter @ en el flujo de sada estindar. También to void |g) { =10; cout «); trac esténda. tipo del operando situado a la derechs de >> dete ‘aceatada y cuil es el destino de la operacién de entrada, Por ejempl void $14 inti cin >i; tee un entero ai doubke d; cin >-d; 1 l2e un nimero en coma flotante de doble pression ad ) lee un nimero tal como 1234, de Ia entrada esténdar ala variable enter ‘conta otante, tal como 32.345, a la variable en coma fkxante de dedte precision \Yeamos un ejemplo que tealiza conversiones de pulgecas a centimetros y de centime {tos a pulgadsi, El lector introduce un nimero sepuido po" un caricter que indica la unis dad Se medica: centimetres o pulgadas. El programa da el valor co-respondiente en ln otra uni: int main) t ‘consi oat factor = 2:5 Sloat x, in, cm; hares out << “intreduci longitud: * cin >>; ler un mimero en coma flotae ein Sch; leer un sufjo site (eh) cate "0's pulgade em = "factor: break; 1. Al igual que los ostream. jos {steams se orupan de representaciones de cadenas de curacteres de bbs tipos predetinides Y pueden ampliase ficilmente para manejar tos definidos por el usuario. in es el flyjo de en- ‘mina qué entrada es 11 pulgada es iguasa 2.54 0m ie in ctor treats deja from 0; frat 4 k wich conan un Yao con un enn de eons, Para sali da se are inh eum seme brea. Las cotanes deca dee isn, Ste ‘Gr contrnado mo comneide Son nngina dels, ip: fault No es ncesao gue ard reser ma een de exacts Us fama mala ie x Jeera une string. Por ejemplo: int main ( c string sr; cont << “Por favor, introducca su nosibrevi™; cout << “Hola, " << sir << Sic lector teclea Bric Ia-espuests c= Hola, Erie Se puede ler una linea completa usando ta func getline). Por ejemlo string str; cout << “Por favor, introducea su nonbre\n cingetine \cin, st ‘cout << "Hola, , ‘Cam este programa, la entrada Eric Bloodaxe 4 a sade desea Hola, Eric Bloodaxe: ‘Las cadenas estindar tienen la bonita propiedid de expandirse para contener lo que pon ‘amos en ellas, de modo que si introducimos ua par de megabytes de puntos y comas. el Programa nos devolveri pégines y péginas de puntos y comes, a menos que nuestra mi Quira 0 sistema operaivo se le agote antes algin recurso evencia 3.7 Contenedores ‘La computacinsuele entrafiar la creacién de colzciones de distin:as frmas de objeto y {a posterior maripulacion de esas colecciones. Leer caracteres a tra cadena e imprittr ly cadena es un ejemplo sencillo. Una clase cuya fnalidad prncipal es contener objets xe concze comiinmente como contenedor. Proporeionar los contenedores edecuades pat. un, tarea determinaca y soportarlos son operaciones fundamentile iiles sor pasos importante, ‘en Ie construccisn de cualcuier programs Para ilustrr os costenedores mas tiles de la bibliotera esténder, veamos un progr sma sencillo pare guarcar nombres y nimeros de teléfono. Fs el tipo de programa ps e cual hay diferenes planteamientos que gurecen wieneillos y evidenies» a persona de. tintaformacién, 3.71 vector ‘A muchos programadores de C un ary predefino de pars (nombre, nimero de tléo-| 0) les pareceriaun punto de psrtida spropiado: struet Butrs { string name: int numver; be Entry phonebook {1000} ; void prirt_entry (int 3} / uso simple ' Sin enbargo, am array predefinito tite an tamato fj. Si ee C i clegimos un tamano gra itunes pc scegmos in nao ms pour, aye Setne Ee ca 4qvier sso, endremos que esrb code gestion de memoria debaje nel Ls bod tesa esindar proporcionan recor (6163) que se ocupn de soo rector phone book (1000 oid print_entry int i ct aga phn Sak tae 17 wo simple, exactamente como pare un arras cout << phone book i). name << ° * << phone book (i).aumber << *\n* void add entries (int n) Haxmentar el amano ex.s . Phone baok.resize (phone book.size\) +n); ? La funcion miemtro size () de veetor da el niimere de clemertes Si ee pndrcapurrd el ero yer ur meneae de eror cud lector nen te asarel eon {in vector es un objeto unico que puede ser asgnado. Por ejemplo: void f veetors ?) ‘ vector Entry v2 = phone book. vow, a , [Asignar un yeewr implica copiar sus elementos, Asf pues, srs fa iniciliascin y asigna- iden f(),¥ y #2 contienen ana copis de cada-ino de los elementos Entry de la guia te- lefbnica, Cuandb un veetor contiene muchos elementos, estes asignaciones ¢iniializacio nes, en aparencia inocentes, pueden suponer uncs costes prohibitivos, Siempre que la co pia na sen ceeahle deen utilizarse referencias o punters, 3.12 Comprotactén de rango El rector dé Ia biblioteca estindar no proporciena comprebacisn de rango por defecto (16.3.3). Por empl: void f: ‘ int i= phone book (1001 | munber; 1/1001 esi fuera de rango u ) Es probable qué la inicializaciin cologue algdin ~alor aleatcrio en fen lugst de dar error Como esto no es deseable, voy a usar una adapscién de cemprobaciéy de rango sencilla se vector, deno ninada Vee, en los capitulos sigtentes. Un Vee es como un veetor, salvo Porque lanza ura excepcidn de tipo oul_of rang? si un subindice ests fuera de tango. Las técnicas para implementar tipos como Vec y para ussreficazmente las excepeiones se analizan en §11.12, $8.3 y el captule 14. Sin enbargo,es-a definicidn es suficiente para Tos ejemplos de! libro: femplate-lass T> class Vee + public vec'arT> { public: Vee\) : vector(s) () Te opesator| | (int iv ¢ return ati Heomprobedo el rango ‘const T eperator() inti) const ( retura at(i) :) M7 comprobedo el rango Lacperacin a() es una operacin de subindetaciGn de veetor cue lanza una exe. pein de :po out_of range si su argumento esté fuera del rango le vector (416.33), ‘olviend> a. problema de emo ghar los nombres» tdmerr telco, sora derps usar an Vee para asegurarnos de que se cpturan les aceson “uta de tgs ey ejemplo: Vec phone_book (1000) ; void prins entry inti) //uso simple, exactane te como para vector c out <+ phone_book|i).name << + * << phone_book (i} number << "n° ; Un sces0 fusraderango lanzacé una excepei6n que puede capture usuario, Por cmp void $1) by for (inti = 0; '<10000, > catch (>ut_of range) cout << “error de rango\n" ? =) print eniry (i {La excepcion sex lanzada, y capturads, cuando se intente puome book [i} con 1100, Sil usuario no captura este tipo de excepeion, el progrema terminard de un msiera bien definida. er lugar de seguir adeleme o fallar de una menera no definida, Ur torma 4e reducir al mirimo las sompresas procedentes de las excepetones es usar ua main con un blague-try come cuerpo: int main) nt W cbtige del lector atch (out of range) ( err << “error de rango\n" ; (atch (2. ‘err << “lanzada excepcion desconociddn ; Esto Froporcione manejadores de excepciones por defecto, de modo que si dejamos ‘capturar una excepeidn se imprime un mensaje de error en dl flujo de salidaestandar diagnéstico de erotes cerr ($21.21), 373 ise La inserein y el borrado de entradas en la guia do teléfonos seri habitual. Por tanto, vez uma lista seriamés apropiada que un vector para represeater una guia de telefones : :eonst erator Lt {for (LBi = phone book.begin( |; i= ohone Sock.end() > ++) ( Entry € = "i; f/ referencia usade como abreviatura if (5 —= ename) cout << éname <=" * <= eaumber << Wi Latsisqueda de+ comienza al principio de la list sigue avanzando hasta que se encuentra '5¢ egal final, Todos los contenesores de la biblioteca estindar proporcionan les fun- tienes begin) y end () .que devuelven un iterador hasta os elementos primero y siguiente 3 imo, respectvamente ($15.3.2). Dado un iterador,e elzmento siguiente es ++i. Dado ‘umterador jel elemento al que se refise es *i [No es necescrio que el usuario cosozca el tipo exacto de iterador pars un contenedor estindar, Ese tipo de iterador forma parte de la cefinicién del contenedor y es posible re {erirse a él por #l nombre. Cuundo no necesitarcs modificar un elemento del conteredor. ‘constiterator «sel tipo que queremes, En caso zontrati, usamos el (po simple iterator (163.0. Es fi void aid entry (Entry e, list Phone book.push frente) ; Phone book push back \e) ; Phone bookinsert (i.e) sad elementos auns list iterator is Mahady al priseipio Wade al final Wahiady antes del elemento el que se refiere ¥ 34 map Essriiresdigo para buscar un nombre en una tia de pares (nombre.nimero) es realmen: te etioso, Ader, una isqueds linet es bastatepoce ficient pare lsus que no sean uy conas. Ors estructuras de datos soportan drectamente inseri6a, borado y bisque \dabasados en valores. En especial, la biblioteca e-indar proporciona el ipomap ($17.41) Un map es un contenedor e pares de valores. Pr ejemplo: ‘map-string, int> phone book; Enatrs cortex os son conocido los map como arrays sociativos 0 dicionaros, Cuando etéindexado porn valor de su priner tipo (denominado clave). un map de ‘urle el valor eorespondiente del sezindo tipo idenom nado valor 0 upo mapeado}. Pot Serle: oid print_entry (const strings 5 i If (int = phone book's}) cot << 8 << ° * << } Si no se ha etcontrado concordancia para la clave's, se devuelve un valor por defect dd phrone_book. El valor pcr defecto pura un tipo entero en un map es 0. En nuesto caso, supenemos que @ no es un numero de eléfono velido ves 3.75 Contenedores estindar Para represeniar una pula de telsfonos se puede usar un map,una list y un vector. Sine bbargo cada uno de ells tiere ventajas ¢inconven entes, Por jemplo,subindexar un vet es filly barato. Por otra pure, insertarun elemento entre 10s dos tiende 1 ser castosof Una dst tiene exactamente las fropiedades contrvias. Un mep se parece a una list de pax rs (Cave,valor) pero esté optimizada para encontar los valcres a partir de as claves, biblioteca 2stindar proporciona algunos de los tipos de contenedores mis gererales ¥ les, para que el programador pueca Seleccionar el contenedor que mejor se adapte las nezesidades de una aplicacisn: ‘Resumen de contenedcres estindst vecton ‘Vector de tamatin variable :§16.3) istT> Lista dobiementeenlazada ¢§17.2.2) ‘quene Cola 1§17.3.2) stack-T> Pila(§17.3.1) dequecT> Cols de dos extremos ($172.3) prior’y queue Cola clasficada por valor (17.3.3) sete Conjunto (§17.431 i mulfiset Conjunto en el que un valor puede aparecer muchas veces (§174d map-tey ,val> Array asociativo (517.4.1) ‘multinap key, val> Mapa en el que un valor puede aparecer muchas veces ($174.2) Los centenedores estindar se presentan en $16.2, $16.3 y el capitulo 17. Les contsnedo ress Jefinen en al espacio de nombres dy se presentan ex Im cabecerts vero Ist ‘inap>, etcetera ($16.2), Los contenedresestinde y sus opercionesbisies et dsetiados pars que san miles desde el punto de vista otacional. Adem on sigaifeados de las ope atone ‘equvdentes en los distntos cortenedores. En gerzrl, ls operaciones bisicas son apc bes andos os tipos de contenedores. Pr ejemplo,push_back puede wars (on on sficieacia) para fair element al final de un vector asf como de na fs, y tos 1 conteredores ren una funciGr miembra size () que deveelie su mimero de elemen os Est unifoimiiad notacional y semintica pernite a los prosramadores propercionay ruevos tpos de contenedores que se pueden usar de formas ny semejanes a fos estén dar, Eemplo de ello es el vector de rarg> comprebado Vee (3.72). En el captule 17 rmuesta e6mose puede aadir ala estrsctura un kash, map. 2 uniformidad dela rte {aces de cortenedor nos permite asimismo especificaralgoritmos con inlependencia de los tiposindividuaes de contenedores. 3.8 Algoritros ina stractra de datos, como una lsta0 un Vector, no.es muy: itl por sf misma. Para wsarla, evoitamor operacianes para acceso hisico tales como alae y suprimir elementos. Ade- nis ara vez nos Fimitamos a almacenar objetes en un contenedor. Los clsificamas, fos jimprmimos, exraemos subcenjuntos, suprimimes elementos, buscames objetos, eteétera la biblioteca estinda: proporcio a los algositmos més zomunes para con ‘de proporcionar los tpos de contenedares més frecuentes. Lo siguiente, ‘una enpia de cada uno de los elementos inicos teredores adem: por jemple, clsifica un veetor y cola de vector en une lis: void fveetors ve, list Le ( sont (ve begin () ,vecend () unique copy (ve.begin |). veend |) .le.begin(\ | > Los slgoritmos estindar e describen en el capitul> 18, Se exoresan en term nos de secuen, cis Se elementes (§2.7.2), Una secuercia esté representada por un par de iteradores que cespecifican los elementos primero y siguiente 1! ultimo. Er el ejemplo, sort() clasitica la servencia deste vesbegin () hasta veend () .cue casualrente son todos los elementos deus vector. lu hora de escribir. s6la hay que especificar 21 primer elemento a escribir Siseescribe mis de un elemento, todes los elementos que sizan a ese incial sern sabres lesedtamcs afadir los elementos nuevos al final de un contenedo:, padrfamos haber void fvec‘ors. ve, list-Entry>é le) ‘ son(vebegin ) , vend) unique copy (ve.begin(), veend() back snserter le} ) > //edjumar @ te Un dack_incerter|) sade elementos a final de un comenedor, ampliando éste para hae ceiles huecu ($19.2.4). Los programadores de C agradeceria que los contenedore dir ns back inserter einen la cesidad ce utiliza le gestion de memoria exp {2 deestilo C. fropensa a errores, usando reall () (§16.3.5). Olvidase de utilizar un ‘back inserter a a hora de adjuntar puede comucit a errcres. Por ejemplo void f list -Entry>s ve, vectori le copy \vebegin \) -veend () le): copy \vebegin) ,veend () ,Itend () + copy \vebegin ) vend )le.begin error leno es uniterador UW mals eseribe rds allé del final UW sobrescribir elementos 3.81. Uso de 0s iteradores ‘Cuando se encuentra por primera vez un contenedor se puden oltensr unos cunts ite adores que haven referencia a elementos utiles: Begin () end) son los mejons cir, pos de ello. Ademés, muchos algoritmos devuelveniteralores. AS, por ejemplo el alge "itm estinder find busca un valor dent-o de una secuencic y devuelv> un iterador al ele. ‘esto encontrado. Usendo find podemos escribiruna func'én que cuene el nimern de pas Fieiones de wn cartes en ui sing: int count\const strings $, char €) string. :const iterator i-find (x.begin (\,s.end (1 ,€) : while | pend) ( (if ssend() 6); retura n: ) El algoritmo find devuelve un iterador 4 la primera aparic én de un salor dentro de una secuencia 0 el #erador siguiente al final. Consideremos lo cue ocurre con una simple la. ‘mada de count: void f() string m = “Maria tenia un cordero™ ; int a_eount = count (m,'a"); ) 1 La primera llamada afind () encuentra laprimera a de Maria, Asi pcs, el iterador spun ta a 2se cardete: y no a s.end (), por Io que entramos en el bucle. En I, comenzas la bbaspeda en é+4; es decir, empezamos un cardcter después ce donde hemos enconirado la "a. Luego seguimos en el bucle hasta encontrat las otras Jos "a, Kecho esto, find () alcanza el final y devuelve s.end (), por lo que la condiciée 1 =s.end ) no se cumple y salimos del buce. Lalllamada d: count() podria representarse grificamente de la forma siguiente: Las flechas indiean los valores inicial, intermedios y final del iteradoe & ‘Naturalmente el algoritmo find funcienaté de modo equivalente en odos los cont dores estindar. En conszeuencia, podriamos generaizar la fancién count) de la mis forma templateint count \const C6. v, T val) typename C: :const iterator’ find (rbegin () ,wend() val) ; ver $CI3S intn while (i != vend) ( Lie saltar después del elemento que acabamos de encontrar Ffind (i, send () val); ) Esto funciona, por lo que podemos deci: void flistcompler>s le, veetor argu mento en luga’ de un contenedor, por lo que diiamos: itccompler>< le, veetorcstring>s ve, string 5) int it~ count (lebegin |. leend |) complex (1 3 {int i2 ~ count ve.begin (),v.end ()*Diogenes" ) : {int i3 = count s.begin () ,S.end(),"#) laso de una secuencia nos permite tsar count para un aray predefinide y también para ‘centar partes ce un contenedor. Por ejemplo: void gchar es), int sz) inti = count (ses (0) , 6s 52) .°2") int i2 ~ count (ses(0) , ces sv), 1 tas del array 1p Weta de la prinera mitad del array: 382 Tipos de iteradores 10¢ son en realidad los iteradores? Cualquier tsrador eonereto es un abjeto de alain tipo hy. sin embargo, muchos tipos diferentes de ieradores porque un iteader tiene que con= Ltr infra necesar a par acer su bao para mn tipo de contenedor determi ‘aco. Estos tipos de iteradores pus ores las ‘esidades especializadas que atienden. Asi, por :jemplo, ur iterador de veefor es con toda Prababilidad un puntero ordinario, poryue un gantero es ua forma bsstante razenable de eerie a un elemento de un vector: ser tan Sferentes como los comte iterador: P ~~ Piet vector: i Alterrativamente, un iterador veetor peda implementarse ecmo un puntero al vector itersdor, —scomienzo==p, posiciin=—3) vecor: [PL Te [t] [He TT] El sode un ierador asi hati posible ia comprobecié de ango ($19.3) 1 Uniterador de lista seria algo mas complicadc que un simple punte-o a un ele nento, Porque un elemeato de una lista en general no sabe dénde esté el siguiente elemente de ca lisa. Asf pues, un irador de lista podria ser un puntero « un enlace: iterador: > tine: [Satace}“entace“fevace}“[ennee}” cee Lo quees comin aos os eras su seminal sombre de us pero Aspe empl pica » +4 cau tea e tens un lr i foc reci sigue ten, De tarma ilar calle So read, eager on gue cmp mas cun els ols com an tuner (61931) Adem ov arora ne nccentanconoer clots von dor ecto; cata contender someon sus tio de erly ts ars ces tos nombres coverione tertry cna eras Por geno, ite Bisys sea eset tbo delat genera prs ftcary ara ver ego gue pesca te Setar sabe cones ine po 7 to al que se refiere elit 38.3 Teradores y E/S Los itetadores son un concepto general y itil para ratar con secuencias de elementos ccontentdores. Sin embargo, los contenedores no son el dnice lugar darde encontano secuencias de elementos. Por ejemplo. un flujo de entrada procuce una secuencia ce val res y ecribimos una secuencia de valores en un Tlijo de salida. En consecuencia. kano cid deiteradores se puede aplicar ala entada y salida Parahacer un ostream. iterator, hemes ce especificar que flo se va usar y el tipo cbjens eserios en él, Podemos definit, por ejemalo, un terador que se refiera a fio de Salidestndar, cout: ‘ostrears iterator string>00 (cou!) El efecto de la esignacién a *40 es escribir el vor asignads en cout, Por sjemplo: int main) “1d significa cource"Hola, too = *mundo\w" ; significa coure<”mundon” ae. rm mis esl en coe Wann I a aa papain prs ana rea tan seta perl ildad de ta ais com un com MEecor de io csr rsd em sepa eset, xn oes Dy forma semejan. un iteam, Heat es ao que Ns permit un fp de en urls como en conenedor de slo era, Nueviment deers expeiia el Mj gue tevea wary eltipe de vilors previ isream iterator cin Cone os eradoresdeentaasparccen sempre en pares que representan una seen fete rnotionaren nga eratr para inate ial de laead, input erator porcctecos iran Hertor-srng-¢0s; Poss shor er Hola, mundo ces a etd y eso de muesoas int main string sti, ont cost cc "1 <<82 << , Enralida, os pretend qcinputertos ypu erator sean was dectanene Perel contaio.habitualnent son peporcionsos como arguments de algritms, Po- ders eserii,por ejemplo an propa seni o pra cern archivo, cliifca sp labs eas. chiminar duplicactones esrb el extdo en to archi int main t sting fom, 10: WV obtenes nombres de los archivos fuente y destino ifstream is rome ste\)) : iV input stream(c_ste): véose $3.5) istream iterator-string tis); //te-ador de entrada pare el ujo istream_iterator-string eos; //ceatinela de entrada vector string=B i, eos) : Wes un vector iniializato desde la estrada sort b.begin ) , bend) ): MW clasificar A bifer ofstrears 05 (toe sr); WMlujo de sabia ostream iteratorhistogram ; f [La acion evdente a realizar para que cada cadena regsire s frecuencia es told record (strings 5 histograra(s) +<; 4 registrar la frecuencia de “s Una ver leida fa entrada, nos gustaria exraer los datos que h jcompone de una secuencia de pstes (string, int) En conse rid print (pairstring, ints r) mos recopitadd, El map sencia, nos gustarfa Imar , ara cal elemento del mapa Cl primer elzmento de un parse lama first y el sms | pfitst << ** << rsecond << "\n'; mento second) El primer clemento del pair es una const sting porquc todas las claves de ‘map sn constantes. Asi pues, el program prineiyal se vomvier en int main) istream_ierator-string >i (cin: ‘stream iterator siring-e0s; foreach tit, os record) ; ‘Sor_each chistogram.begin () ,hitogramend (), prt) ; A sefiaar que no es necesario clasficar el map para obtener sal da en orden. Un map mine cE al eve ordenadosts elementos de mate que ona tracin farviesse1 olen recente) mecha ens de progimaciu hay aus tusar algo en un connor eo gar 3c dunner sgoa cia uno delos clerenon As por joe alenmo find (6185.2) oa amt forma cota de buicar on ar espacio. Und aia ds general Bee va idea busca on ements qe camp: un requis epeifi Po ejemplo. po se geet barca un map el per alee mayor que 42 Un apes un ccna sa veal) or lo Gue burumos en co lists un palr% m Iypedef map string int»; const iterator MI; MLi = find if m.begin ) ,mend\) , 42) : u Como alterativa, podrfamos contar el nimero de palabras void g (const map por el algoritmo para realizar Is accion prevista. Por ejemplo, find sf) busca has- lagee su prediado devuelve true para indicar yue se ha enzontrado un elemento de inte 16s, De forma semejante, couut_ift) cuenta el vimero de vaces que su predicado es true Ls bibliotecestindar proporciona unos cuauos precieados ities y algunas plantillas ue srven para crear mas (§18.4.2) 34 Algoritmas que usan tunciones miembre Michos algoritnos aplican ura funcigw a los elementos de na secuentia, Por ejemplo, ex S384 for each tit ,e0s, record) ; Nama a record :) para las eadenas leks de Ta 2rada, ‘Amenuco trabajamos con contenedores de punteros y no: gustaria amar a una fancin Iierbro del objeto apuntado en lugar de a uns funciGn glchal sobee el puntero. Ast, por Sierplo, pedrfamos querer llamar a la funcién miembec shape : :draw |) para cada ele ‘Men o de una lit-shape* >. Para mansjar este ejemplo ct ‘um uncién no miembro que invoque a ka func eto, sencilamemte escrbimos n miemiora Por ejemplo: void drave (Shape p) c po>drew 6); ) void f (list-Shape* >< sh) ( for each sh.begin ) ,shend (), draw) : , Generatizando esta técnica, podemos escribir asf et ejemplo old g (lisicshape* > sh) ‘ for each sh.begin ) ,shend\) ,mem_fun (Shape : :draw |) La plntlla mera fun (1 ($18.4.4.2) de la biblioteca esténder toma an puntero & una fan idm miembro ($15.5) como argumento y aroduce ego que peede ser llamado para an fun {ero cla clase ¢e! miemtro. El resultado de mem fun (shape: :draw) tna un arguments shape* y devue've lo que devuelva shape: draw. Elmecanisme mem_jum () es importante porqu: hace pesible que los algoritmos esin dar sean usados para contesedores de objetos polimérticos, 3.8.6 Algoritmes de la biblioteca estind Qué es un algositmo? Una definicién gereral de algoritmo dice que es «un conjune fin to de reglas que da una secuencia de operaciones para resolver un conjunto espect'ico de problemas [y} tisne cinco caracteristicas importattes: Fintid... Defin ein. Entrada Salida... Efectiyilad» {Knuh, 1968, §1.1-. En el contexto de la biblioteca estinda: C+ un algoritmo es an conjuntc de plantillas que operan sobre secuencies ds elements {La biblioteca esténdar proporciona muchos algoritmos, que se def nea en el esp.cio de nombses std y sepresentan 2n la cabecera : algunos son especial mente ities: Algunos algpritmos estandar foreach () —Invocar fa fancién para cada elemento 183.1) — Jind (\ Encontrar a primera apaticién de 0s argumnentos (§18.5.2) find i) Encontrar Ia primera concordancia del predicado ($18.32) count() Contar las epariciones de un elemento ($18.3) count if) Contar las concordancias de predicado ($135.3) replace) Sustitwir un elemento por un valor nuevo ($18.6.4) replace.if() Sustituirelemento que concuerda con predico por valo: nuevo ($18.6) copy) Copiar elementos ($186.1) ‘unique copy () Copiat elercentos que no son duplizados (§ 8.6.1) sort) CClasificar elementos ($187.1) equal_range () Encontrartcdos los elementos con valores equivalemes ‘$18.7.2) merge() __ Fusionar secuencias claifcadas (§18.7.3) aos algoitmos, y muchos més (véase el capitslo 18), se pueden aplicar a elementos de ceatenedores, strings y arrays predefinides. 39 Matematicas igual qe C, C++ 0 se eh6 pemsando pinodiaimene ene A Jette tan Geese hace gran camtidd de trtajo numéro y la biliotcaestindar re fuchsia 39ML Nimeres complejos La bibliotesa estindar sopora una familia de t pos de admeros complejos que sigue las leas de laclase complex deserita en 5:2, Pare soportarnizeros complejo en fox que fos cecalares son de precisin sencilla, nimeros ex coma flotsnte (floats. nimeros de doble preisiGn (doubles). etcétera, la clase complex de la biblio eca estindar es una p atilla template class sealarclass complex public ‘complex (scalar. re. sealar im u Las operaciones aritméticas habituales y las furciones matemticas mis frecuentes estin soportadas para adimeros complejos. Por ejempbs: W/fucion exponencial estindar de template class C, class T> complex pow (const complex C>s, int) void ficomplex-float-M1, complex-douste db) f complex-tong double» ld = flosqrt db db = 3; SN pow Hift,2), w Para mas detalles, véase 8225. 392 Aritmética de vectores rector deseo en 3.7.1 esta dscido pare ser un ness general pa valves, sr leibley near en l arqutectr de contneres,itraores yalgrtmos Shrembarg, no sop operaciones stems de vires, Ata ens operations "econ sera iil, pro su gveraliday eb dad unos bit opiizaciones ue sue leer considers esencaes para el ahajo mmerica sex. En comseustes bible tea estar roporciona uh vector, Tamas slaray us menos gencaly ms ts cexible deopimizacin pre calla antics template-elass V>class valarray { w. Te operator () (sive s) ; u dh El tips size_t 8 tipo entero sin signo que usa ts implemertaci6n para indices de aay Lai operaciones artmétizas habituaes y las funciones metemiticas més frecuentes 2, in seportadas per valarray. Por ejemplo ¥ fancién ae valor absoluto estindar de : . ‘emplatece'ass T> vaiarray abs (const alarray.s al, saterray a = al*3.14,a2/al ; 2 +2 al"3.14. = abs (2); doubled = 4217) ; Ws ) Para rs detalles véase §22.4. 39.3 Soporte numérico basco Naturamente, la siblioteca sstindar contiene las Zunciones natematicas més communes como bg pow) y c98 (para tips en coma flotante; vease 6223. Adems, vs pro Porcioran clases que describen las propiedades de los tiporfredefiridos, como cl expe nente nximo de an float; véase §22.2. 3.10 Recursos de la biblioteca estindar ‘Los recirsos que froporciona la biblioteca estindat pueden clsificarse asf 1 11] Soporte bisizo del lenguaje en tiempo de ejesucién (pare asignacicn e informacisa ‘bre tipos en tiempo de ejecucisn): véase §16.1.3 [2] La biblioteca C estindar (con modificaciones muy poco importantes para redox ‘ainimo las nfracciones del sistema de tipos’. véase $16.12, [3] Cadenas y flajos de E/S (con soporte para juegos de caractees inteanacionales 9 [> calizacidn; véanse los capftulos 20 y 21 [4] Lina estructra de contenedores (como vector. list y map) y algoxitmos que usin entenedores (como transversales generales, dasificacioves y fesiones); ven los expitulos 16,17, 18 y 19, (51 Seporte pera céleulo nemérico (nimeros complejos mis vectores con operacines aitméticas,porciones BLAS y generalizadas,y seméntica disefisda para facilcr ia ‘ontimizacion: véase el capitulo 22 1 evitero principat para inclu r una clase en Ia biblioteca fue que la usaran casi toon les pr prma general que no supusiera Cosies signifcativos adic ionales con: respect aaa ver S ‘a, la biblioteca estindar C++ proporciona \es estructuras de datos fundamentales ma csc Io aigortoorundaenas sade oh lis 7 SET trans pn ron Finns ine Jos contenedores y algoritmos estindar. 4 Tipos y declaraciones No aceptes nata que no sea la perfeceiin ‘Axénimo La perfeccién sélo se loxra al borde del colupso. C.N, Paskinson ‘Tipos — tipos fundamentales — booleanos — caracteres — literales de carde- ter — entercs — literales enteros — tipos ex coma flotaate —literalesen comma fotante — tamaos — voud — enumeraciones — declauaciones — nombres — ‘anbito — inicializacién — objetos — typedef — consejos — eercivio. 4.1 Tipos Consiceremot B=yfi2) Para que esto tenga sentido cn un programa C+, los nombre: x.y y fdeber estar adect ddamence declarados, Es deci. el progranador de>: especificar que las entidades llaiadas yy existe y son de tipos para los cuales = ‘asignacin) + (suma) y () (llamada de fancién), respectivamente, tenen sentido Toco nombre tdentificador) de un programa C++ ten: ua tpo asociado a él. Ese po deterrina que operaciones se pueden aglicar al sombre (2 cecir ala entidad referencia 4a porel nombre’ y e6mo se interpretan tales ope-aciones, Por ejemplo, las declaraciones Sfoat x; A es una variable en coma fbtante ity =7; ‘Ay es una variable entera son valor inicial ? oat f\int) ; 1f es una funcidr que toma un argumento de tipo int y ff devuelve un mimero en coma florame haan que el ejeraplo tiers sentido. Como se declara que y es un int, puede serasigma- 4a, tsada en expresiones aritmticas, etcétera, Por otra pare, se deslare que fes una tune cid que toma un int come argamento, por lo que se la puele Hamat cado un argunieny adecuado, En este capttlo se presentan los tipos fundamentales (84.1.1) y ls desaraciones (84.9) Los ejemplos se limiten a emostrar carateristieas del lenguaje: no se pretende qu he gan rada til Los ejemplos més amplios y realitas se har ‘eservado fara capitulos pos terior, cuando ie haya deszrto mas de C++, El presente capRulo proporsiona simpleneone los elementos mis elerentales a parts de los que se constnajen pregranas C++ El ets debe conocer esos elementos, més la terminology la sintenis sencilla que 10s aconpa fia, para poder llsvaracabe un aroyecio real en C++ y especialmente para leer cia on inemain() ql char e coute< “el valor de '* <<¢ << ** es" << intle) << \n'; La notasion int (e) da el valer enero pare un cariter ¢. La posbilidad de comet uit ‘har en enero suscita la pregunta Je si un char tiene signo © m9 lo tiene. Los 256 los represeniados por un byte de $ bits pueden interprtarse como los valores que van ds 6 255 0 como los valores que van de ~127 a 127. Por desgracia la opcion tomada pats #8 char sit més esti definida por la implemeniacién (§C.1, §C.3.©). C+ preporciona dos t- os pars los cuales estédefinda la respuesa: signed char, ue puede cortener comme ‘imo tos valores que van de ~127a 128, y unsigned char, cuc puede cortener com by molos valors que van de #2255. Afortunadamente, la diferencia importa sto pasa fos mio ftque quedanTucra del rango 0-127, y los caracteres mis comunes estén dere de se ang. ‘Les valores sit M jugar dlieados problemas de poriabiidad, Vea lector 8.34 sin testo de char 0 i almacenaenteros en variables char. suproporeinaun tipo wekar para contenercaracteres de un juego de caracetes ma: on wbmo Unicods Es un tipo dstino, El tamafto de wehar-f esté defirido por la imple aor eeson y es sufeiente para centener el mayor juego de caracteres soportado por ellocale se nimplementacion (véase 217, §C.3.3) La rareza del nombre se explica porque es un wtede C. EnC, vehar_fesun pedef 1§4.9.7) ev lugar de un tipo precetinide, El sufijo pee anadis para dstinguirlo de los typedef est. Gresrve el eter que los tipos de carasteres son tiposintegrales ($41.1) por Io que les son splicables operaciones artméticas y Wgieas (9.2). Jo fuera del ago arte almcenaes enn char inp pte dar 434 Literales de cardcter ardcter, sun eardeter ence Un literal de cardeter, denominado a menudo constante d= rrado entre comillis sencilla; por ejemplo, “@* y °0", Eltipo de un Fiteal de carécier es ‘har Los literale: de cardcter son en reslidad cerstantes simblicas para el valor entero te los zaracteres del juego de earacteres de la maquina en la que se va.a ejecutar el pro- sgrama C++, Si, per ejemplo, el lector esi en uns miiquina que usa el jusgo de caracteres [ASC lel valor de “0" es 4. El uso de literales d cardcter en lugar de la rotacidn deci- ‘mal tace que los arogeamas sean mas portables. Unos cuantos caracteres tienen ademis rombres estar que usan ls bara invertida y e\:ardeter de escape, Por ejemplo, \m es tun salto de linea 5 \F es una tatulacion horizontal. Véase en §C.3.2 los detalles sobre los caraceres de escipe. Las literales de caricter extendidos tienen la fcrma Lab’ ,estando el niimero de ca: raciees entrecomillados y su significado definides por la implementacion para concordar con el tipo wehar ¢. Un literal de cardeter extendido tiene el tipo wehar_t 44 Tipos enteros Al igal que chan, cada tipo entero poste tener es formas: int «simple» sigmed int y tnsigned int Ades os enters pueden tener testis: short int, int «simple» yong int, an fone intes posible referise snplement como long. De forms semejante, short 6% Sinn de hort int unsigned de unsigned it signed signed int. Listipos de encrosunsigned son ilreos paratsos en bs ques tata almacenaien ‘0.caro un aay debits. Csi-unca es buena ika sar unsigned en Iga dein int om fn de ganar un bit mis para representa eneros positives. Los intents de rant Zar Que algunos valores sean pcsitivos declarando variables ansigned serain desbaraiados habitalmente po as regs de conversion implista($C.6.1, $C 6.2.1, Adferencn delos char smples, los simples tienen sempre signo 0s tipos int con Sian son senilanente sininimos mis expiitos de sus equivalents int simples. 4.4.1 Literales enteros Los lteralesen eros se presentan de sustro formas: decimles, otaes, hexadecimales y litereles de carter. Los literals decimales son los que se asan mis Inbitualmente nen =I aspecto cue seria de esperar: © 1234 976. 12345678901234567890 El compilador debe acvertr sobre los literales demasiado lrgos para sr representados Un literal que comienza por cero seguido dex (Ox) es un rimero hexedecitnal (base 16) Un literal que comienza por cero seguido de un digito es un numero acta (base 8), Por ejemplo: decima: 9 2 63 83 octal: % 2 O77 ona hexadecimal: WO 0:2 Ox3f O53. Las letras a, ,€,d. €y f.© sus equivalentes en mayuisculas se usan para representar 1 11, 12, 13, H4y 15, respectivamente. Los notacicnes octal y hexadzciral son de mina utiicad para expresar sates de bits EI uso de estas nolaciones para expresar nimeros autérticos puede provoear sorpresa. Asi, por ejemplo, en ana maquina sn la que un ia se represente comoun ensro de 16 bits de complemrento a dos Oxf es el niimero dec mat “I. Sise hubieran usado més bis para representar un entero, habria side 65535. El sufijo U se puede usa para escribir explicitamente lite ales wnsigred. De forms s- Imejante, se puede usar el sufijoZ para sseribi explicitaniste literals lang. ASI po ee plo, Jes un int, 3U es un uasigued inty 3L es un long int $i no se provorciona sulin. el compitador di aun literal entero un tipo adecuado de acuerdo con su valor y con los tae ‘maiies de entero: dela implementacisn (§C.4) Es buena idealimitar el wso de consantes no oavias a uxes poco ii (85.4; o enumeredor (§4.8) bien comentados, izadores const 4.5 Tipos en coma flotante Los tpos en coms flotante representar nimeros en coma fctante, Al gual que ks exte” 10s, les tipos en coma flotante pueden tener tres tamalios: flat (precisir sencilla. donble (precisién doble)y long doable (precisi6 extendida) El sentido exacto de precisi6n «sencill, «doble» y sextendidar viewe definido pur lt ‘mplementacion, Elegit la precisi6n adecuada para un problema en el que la eleccidr de |a previsin es irsportame requicre uncs conocimientos corstlerables de célculo de cua flotare. Si el lector carece se esos corocimientos, busque consejo, ded que tiempo a ad- uiriros © use dauble y espere que ocurrs lo mejor. 4.5.1 Literales en coma fctante Por ec, ere ofan sp double, Tannen eect cn piladce debe aver scbre iterales en cama flotante que son demasiad lrpox para sed represntados. Veamos algunos iterates en coma flotante: ; rccr 1232023 10 1216 1.23615 ‘omerve el ecto" que no puede haber espacio en medio de un literal en som flotate, Por Soanlo, 65.43 21 no es un iteral en coma fleante sino cuatro comgonents lexi in SEpediontes (gue causan un ecror de sintans): 6543 = 2 ‘gise desea un Iieralen coma flotante de tipo floc se puede definir usando el suijo fo F BIMISMOY 20f — 2.997925F 46 Tamaiios ans aspcts J os ps uname de C+, camo el tm Je sn nt senen fet orl mplemenscin ($2), Suelo sear can dependency commend que se iehen os omen medidas ra reduc sa impact, Porque prevepare? Lan Ft ‘eS tie prgtanan en siverso sem owsancveso o plates se eoeypan Ape forguc sm To hacen even aid a ede empo buscandeysbsanane oF cae ecos as personas ue airman no prtcupare dea por ad habit: tC un ico ssema ) poem pemitine wantener lst de gue wl legs Ibeceinconpiadorinplcments- Pen eto devote exec de mri rade Si stoma tet ecoresun Ext, problemen selva oto sive ns, lees en Sidgas tana savers pblematfelcton os on ctacteriem depen de inieplemenucln, Adem amends necesro compton poganascon oncom pire pa emis sea inelso spose una version uta de moet om Pico prefrid haga ls cosas de un roo sgo nto sto Es cho mis i co Foc ir mpcto de hs depenencas dla implementa cand se escbe Ub pragma ve ent deshacer el entroo malate Er elaivamente i imi pact de I carats de enguae perdi tesdc a mplenenacin Lina el tnpactodelos recursos de bine dependents {elsistema es ocho mis dil, Un lnteamketo ex wa lo ecuoon da biblioteca esr sempe que sea pox rewin par proprconar nds dean tipo ertero mis de un ipo sn sgn y is de un go enema es pesmi quel programado poveche carats el Ran sree En mechs maqunas hy diferencias sign ean er cut arevedaes d me tors, cmos ke aveso a lamemorsy veloc dad de filo ete ls dents ae dices de lovtps fundamentts. Cuando se craoce un rin attainem e i elezir, por ejemplo, el tipo adecuado de entero para una variable conc-eta. Escribir cédi- gods bao nve realmente trnspotbl es msi Us tamatos dels jets Cr se expesanen mls del ama wn ear por ¥§22.2), Por ejemplo: = include int main) ¢ out << “largest float == * << numerie_limits-float>: :max ) = <<", char is signed => << numeric limitsckar>::is_signed << °\n'; Los tipos tundamentales se pueden mezclar ibremente en'las asignacionzs y expresion. Siempre que es pcsible, ls valores se convierten de modo cue no se pietda informacis0 GC) valor v se puede representar exactamente en una variable de tipo T, una conve sién de ¥ a T conserva el valor y no plantea problemas, Es mejor evitar los casos en que las conversioms no conservan el valor (§C.6.2.6). Es necesario conocer Ia sonversion implicita con ciero dealle para Hevar cabo un reo impartaate y. sobre todo, pars entender cédigo real escrito por otros. Sin emb- reson corocimienos necesirios par eer los captuls siguientes 47 wid tie void ex farental desde el put de vita sintéctc. Sin embargo, sla se puede ce i cic ov tipo ms compleado: no my obj depo wold. Se wa ua cs rngin vabr 0 como tipo base para apuntadores mat on Sen 48 Enumeraiones le valores especificados por ode muy parecido a 10s ti: Una erumeracicn es un tipe que puede contener un conjunt cl usuario, Una sez definidas, as enurieraciones se usan de pos entero ‘Se pueden definir constamtes enteras con nombre como membros de una enumeraci6n, Por exmplo, mum (ASM, AUTO, BREAK }; define tes constants enterat, denominseks enume adores, y les asigna valores. Por defecto. los valores de los enumeradores se asigran en orcen ereciene a partir de 0, de modo que ASM=-0, AUTO--I y BREAK-=2. & las enurreraciones te les puede dar nombe. Por ejemelo: ‘mum keyword { ASM, AUTO, BREAK }; Cade enumerscion es un tipo distinto, El tipo de un enumeridor es su enumeraciés. Por jemrlo. AUTO + de tipo Reyword. Devlarar ura variable keyword en lugar de sirplemente ff puede dar tnto al usuario ‘come al compilator una incicacién sobre su uso previsto, Per ejemplo: ‘oid f heyword key) c switch (bey) case ASH: Whacir algo break; case BREAK: haces algo break; ) ) 1 Un compiladr puede emi una adverencia en inglés, warm ng) pou so $e men dos de bos tres valores keyword. i ‘Un enumerador puedes incializado por una eypresén-cantant ($25) J ip ne gral (41.1). Elrango de una enumersi6n conten todos kx valores & enumeradr de Ta enumeraci6n econdeados sl potenca sinaria mayer mis prostta menos 1. El anes descend a 0 se enumerador mis poquto noes aegativo & la potenia insta eee mis présima mas sel enumerador mis peguedo = negative. Esto defn el menor cam, de bis capaz de conteaer os valores del enumerador. Po emplo enum el ( dark, light } ; M rango C1 femme (a= 3, b= 3); Wrango 1S am e3 (in = 10, sax = 1000000 ) range -1048575:1948575 Un valor de tipo itegral puede see converido expicitamente aun ipo de enuneraciéa El resulado de ul conven es no definido a menos que el valor et Jetro ds a de la enumeracién. Por ejemplo: me enum flag (2-1, 3-2, 204, €08 | iMramgo O15 flag f= 5; Merron de tipo: $ noes de tipo tag ‘Slag §2 = fleg\S) ; iT bien: lag) defo flag vest en et sango de flag Y Slax $3 = flog (cle); 1/ bien: lagl!2) es de tivo fla > esta en eb ange de fag ‘ag 4 = flag: 99);" —1/no deine: 99 mo esté ene! nango de fag - La tltima asignacicn muestra por qué no hay convessién implivita de an entero a uns ere meraciés: la mayor parte de bos valores enieros no estén representados en uma enumer ‘ign concreta ‘La nocién de rango de valores para una cnumercciGn difier: de la nocién de enue cidn en la familia de lenguajes Pascal. Sin embargo, los ejempos de man pulaci6n de bits {que requieren valores situados fuera del conjunto de enumeracores pera estar bien defi ds tienen una larga historia en Cy C4, I sizsof de una enumeracisn es el sizeof de algin tipo integral que peeda contener st rango y wo sea may2r que sizeof int), menos que un enumeridor no pusda ser represt lado como int o coro unsigned int, Por ejemplo, sizeof el) podria ser 1 tal ver 4. pa no 8, en una maquina en la que sizeof int) ==4. Por defecto, las enumeracicnes se convierten a enleros para las operaciones aritmétias (86.2). Una enumesacisn es u tipo definido por el usuario, por lo qxe los ustarios poe den defsir sus progias operaciones. tales como ++ j << para ana enumenaciGn ($11.23 4.9 Deslaraciones Para que se pueda usar un nombre (identificador) en un programa C+ es recesario de rarlo antes, Es desi’, debe especificarse su jipo para informar al compitador sobre « gié i entidad se refiere el nombre, Veamos unos ejemplos que dussran la diversdad de as de claracicnes arch; sting 8: in count = 2; ‘canst double pi = 3.1415926535897932385. ‘atern int ersor_number cPar* name ~ * Nal”; char seeson(\ = { “spring”, *summer*, “fall”, *winter* ) steuet Date (int dm, yi); int day (Date* p) | return pod: deuble sgrt(Youble) : tenplate-class T>T abs (Ta) { rewrn a0? aa: ypedef complex amespace NS (int a ‘Como se puede ver en estos ejeriplos. una dectaracién puede hacer més que asociar sim plemene un rigo con un nombre. La mayor parte de las decta aciones anteriores son tam bien deiniciones: 2s decir, definen también una exiidad para el nombre al que se refieren. Para ch, esa entided es Ia cartidad adecuada de memoria a usar como variable: se asigna réesa memoria, Fara day, es la funci6n especifieada. Para la constante pi, es € valor 3.1415426535497732385. Para Date, la entidad es un tipo mevo. Para point, es el tipo ‘ompler, de modo que point se convierte en sinénime de eomplex-short>. De las declarsiones anteriores, sélo double sort double ‘atern int eror_number; tuet User: fo son ambign de'iniciones: es deci, la entidad a a que se refieren tiene que ser definida en ott lugar. El codigo (cuerpo) para la fancién sqrt debe ver especificado por alguns otra declarci6n, la memoria para la variable int error_number debe ser asignala por alguna oa deslaracisn de error_number y alguna otta deelaracién del tipo User dee defini qué aspectetiene e' tipo, Por ejempl deuble sart double d) (+. *F int error nusiber = 1; seuct User i/* .. +1 En un programa C++ tiene que haber exsctamente una defin cién para cada nombre. Sin embargo, pued> haber muchas declaracicnes. Tocas las decleraciones dz una entidal de- ben coinciir ee! tipo de entidad a que ve reieren, Por fant, el fragmento siguient: ne dos stores: int count; int count; // error: redefinicién xen tat eror sander; xterm shor ervor-mumber;——//eror:icongrueeia de to y éten ene nnguno (pa sl wo de extern, vate $9.2) extern int ero nuber xurn nt eror-munber Atguna efinicions expeciieanunevalr pra lis entdades que dics. Pr cep strict Date int d, m, y; ); inpeef complersher>poin; incday Date p) (return pod: ) Cont double» 3.141592652589791238, Para tps plats, funconesy constants el «vor es permanent. Paras tips datos noconstanes cl valor nicl puede sr camblsdo mis lane o"eempl voit) 10 especifcan valores. Veanse en §49.5 y $104.2 explicacicms sobre eemo y cxindo asigna a una varabk un valor 90rdefecto, Toda dec sracin i especifics un vores uaa definicin 4.9.1 Estructura de las declaraciones Una declaracién se compone de cuatro partes: un «especificadbr» opcional, un tipo bass un declarador y un inicializador opcional. Salvo las definiciones de funciin y espacio de nombres, las declaraciones terninan con punto y coma. Por ejemplo: - ‘char* reyes = { *Amtigono”, *Seleuco* , “Ptolomeo ‘Aqui el tipo base 2s char, el declarador es *reyes {jy el iniciclizador es = ‘essecificador es una paiabra clave inal, como virtual ($2.55, § (69.2), que especifica algun atributo no de tipo de lo que es deslarado. Un declarador ecnsta de un nombre y, opcionalmente, de algunos operadores de deel rador. Les operadorss de declarador mis frecuentes son ($A.7.1) = . purtero prefijo “const purtero censtante prefijo & referencia prefiio 6) y exter th array suo ( Suncion rato Suu eta senillo si todos eran prefs osuios. Sin embargo. *. | y«) foe di Sut “pura wo especular er las expesions ($6.2 Axi pies * es prefio,y [1 1: son sre Tox operacores de declandor suis vincean mds que ls pefis. En consecuen- sie est] eu vector de punteros algo y tenemos que usar arenes para expresar eaten putea fancdnn arse cemplosen 5.1. Fac todos los dts, comslte Tica la gramatca del Apénie A ee Eun qe el hp no se puede dejar rade anaes, Por ejemplo eenste=7;— Hervor: no hay ipo gtlint a, intb) (return \a>b) 2a: b; asigned ui // bien: ‘unsigned’ es el tivo ‘unsigned int dng fi; UW bien: ong’ ese tipo ‘long int Werror: no hay tipo devuelto En esiel estindar C+ difiere de versiones anteriores de C ¥ C++ que permitian los dos primeres ejemplos al considerar que int era el tipo cuando 10 se especificaba ninguno {§B.2. Esta regla Jel dnt implicito» era una fuente de errores y confusion Es posinle deckara: varios nombres en una sola deelaracién, La declaracién contiere sen- cillamerte una lists de declaradores sepatados por comas. Pox ejemplo, podemos declarar asf dos enteros: ix, y; Minexs int: Observ» el lector cue los operadores se aglican individualmen-e a cada nombre, no a rom bres contiguos de a misma declaraciGn. Por ejemzlo: int py: Minc* ps int ys NO ine y nx, "4; ims: int 43 ie ¥(10), “pv; ins vf10}:_int* py; Constcciones cone éstas restan legibilidad a los programas y deben ser evitadas, 493 Nombres Un nenbre(identicador se compone de una seevencia de eas y digits, El primer ea- Hterdebe sere letra. El crite de sthrayado _se corsidera una lta, Cr+ no mpo- te lini al nimere de caractres de un aembre Sin embargo. hay partes dels implemen tcione: (en especial enlazado-) que no estin bajo el cord de quien esexbe el comp: Iadr y esas pares, por despracis,imponsn a ves limites, algunos enorros de tempo de ejecacidn hacer asimismo necesario ampliar o restringirel zonjunto de caracteres acep- {ado en. un idenifiador. Ls ampliaciones (por ejemplo, perme ercer§ en un 0 bee) de lugar» paogramas no portables, Las palaras clave ce C+ (Apenice A), como {nt ono. no pueden ser uses como nombre de na emia dfinida pore] essaro. Ejem- Blos de nombres son hota este_nombre_es_extraordinariamerte largo DEFINIDG foO bar uname — HorseSense vard varl CLASE —_lase [Bjempios de secu:ncias de caracteres que no puedzn ser usadhs como identificadores son on un loco Ssys class vr pay.due foobar nombre if Los nombres que 2omienzan cor un guisn de subrsyado estin reservados pars recurs es peviales de Ia implementacién y el entero de ejecucisn, por lo que no deben set tredoy en programas de aplicaciones, Aller un prog-ama, el compilador busca siempre la cadene més larga de caracteres que Podrfa comporer an nombre, Po: tanto, var/0 es un solo nomyre, no el nombre var sesui do de! nimero 10° Igualmente, elseif es un solo nombre, no la palabra clave else sepuidd de Ia palabra clave if Las letras mayésculas y mindsculas scn distinss, por lo qie Count y count son nom: bres diferentes, pero no es aconsejable elegir nombres que dfieran s6lo en el uso de las ‘aydsculas, Ex general, es mejor evitarlos nombres que presentan sélo pequeiasdiferen —estrucuras de davos ‘consejos — ejericios. 5.1 Punteros Paraun tipo T, 7+ es el tipo 4 void f) ‘i char |) = *Annemerie™ char’ p=; 1 cowversion inplicita de charl} a char? strlen 3) sirlen (#) 1 cosversién inplicita de char) a char* Yep: Wervor: no se puede asignar al array ) [En ambas Hamada se pasa el mismo valora ta funcion stew («dela biblioteca estauder La dificsitad esié en que es imposible ev tar la conversién impkcita, Dicho de otro modo, fo hay manera de Geclarar une fuscién de forma que se copie © array ¥ cuande se Hamat |a funcion. Afortunadamente, no hay conversién implicita ni explicita de puntero a aay. La ccaversicn implicita det arzumento del array en punter» implica que se pierde +1 tamatie Jel array para la funcin llamada. Sin embargo, la funcién llamada debe determi- nar de aigin medo el tamafo para realizar una opetacisn que ‘enga sentido. Como otras funciones de Ia bibioteca C esténdar que toman purteros a carccteres, srlen | conta en el cero para indicar el fin de la cadena; strlen (p) cevuelve el numero de caracteres que hay hast la terminacién 0, sin incluirla. Todo muy de bajo nivel. El veetor ($16.3) 9 el string (capitulo 20) de la biblioteca estindar no adolecen de ese problema, 3. Navegacisn por arrays Un acces eficiente y elegant alosarrays (otras estracturas de datos parccidas) es laclave para muishos algoritmos (véase $38, capitulo 18). El acceso se puede lograr mediante ul Puntere a un array més un indice o mediante un puniero a un elemento, Por ejemplo, tt: vesar un cadena de caracteres ussnda un fice void jiehar ¥ a for (nai =0; 910 Best use (vit ‘escqivalente 4 un transversal que use un punter: void jp (char ¥(1) for (ebar® p=; ~pi=0; pro) use “pr: : mero de mado que “psa el carice alque punta perado« prefij desrefeencia un puter de modo qe "psa el Pec incement cl pune de mo qe s fea aspen eens del sey Wo bay raze inrigeca for la que una version deba ser mds eps gue Ia ot. Con compilades redemos amb ejempis ben generar icénicocédigo ine §5.1¢), Los Fanaespsden clegirente ares versie indo criteria loco y exon # ae resultado de aplicar los operadores aritméticos +, -, ++ © ~~ a punteros depende del spol eye apumtado.Caundo se spin un opeadorarimético a un per pe ipo Tse supone que p apuinta aun elemento de un array dz objetos de tipo T; p=J apunta al siguiente elemento de ese arry y pT spunta al ” ementoanerior, Esto implica que el valor entero de pe1 seri sizeof(T) mayor que el valor entero de p. Por ejerpl. al ejecutar include iostream.h= int main) int vi (10) + short (10 cout << Gvi(0) <<" ce BLE << \mts cout <: x8 (0) << '* ce Gy (E) << '\nts se fa producido O7xfffaefo Ox7Efaefs Ox?ifacike Ox7fffaede ‘sando una notacién hexadecimal por defecto para los valores de punter, Esto muestra que en it implemertacién sizeofishort) es 2 y sizvof int) es 4 La sustraccign de punteros se define solo cuando amoos punteros apuntan a elementos el mismo array (aungue ! lenguaje ne tiene una forma ripida de asegurarse de que 2 asi), Caanto se sustrie un puntero de otro el resulta» es el ndmrero de elenemos de array que hey entre los das punteros (ux entero. Se puede sumar un entero a un puntero 0 restar un eto de un puntero: en ambos casos el resultado es un aor de puntero, Si ese valor n junta a ur elenento del mismo array que el puntero or gal 0 @ uno ns all, ef result 4o ce usar ase valores no definido. For ejemmpl void f¢) int 1101; int 210); intil = 20115)-K91(3); id = 2 int i2 = v1 (S)-G¥2(3}; 7 resultado no defnido int p M pl = &212) int 72 W*p2-no definido Habitalmente es innecesaria la aritmética complicada de purteros y suele ser mejor tarla. "2 snma de punteros carece de sentido y no esti permida, [Les arrays no son autodescriptivos porque no es garantizado que el n mero de cleme {os de un array etéalmacenado en el say. Esto. mplica eve para cravesar un ary que ‘no ccntiene un terminador como lo cortienen las cadenas de caracteres tenemos que pro Porcimar de algdn modo el némero de elementos. Por ejenpo: oid fp (char v{), unsigned int sie) for int 0; iesize, i++) use oC}: const int N = 75 ‘char v2(N) for (int iO; FN, i+) use 21H) + 1 Hay que sefalar que la mayorfa d las irplementaciones no ofrecen comprobacidn de ago para Ics arrays, Eite concepto de array es intrinsecamente de bajo nivel. Se puede propor. cionar una nociGn més avanzada de arrays mediance el uso de clases; véase §3.7.1 5.4 Constantes, C4 otece el concepto de constante definida porel usuario, const, para expresar la 10- cidn ée que un vador no cambia directamente. sto es til en varios contextos. Por cj plo, mechos objetes no cambian ss valores después de la inicislizacicn, las constants si bolicas conducen a un eddigo més mantenible que ls literales incrustados directamerte ‘en el eSdigo, a menudo se lee a través de los punters pero runca se essribe a través de cllos yla mayerfa de los pardmetros de funcidn se leen pero no se excriben La galabra clave const se puede aficira la declaacién de un objeto para hacer que et objeto declarado sea una constamte. Corse no pueden ser asigradas, las constants tieren que ser inicializadas, Por ejemplo: a const int motel model es une-const eanstint y= (1,2, 3,4 Movi} es una const const ints; ‘error: no bay inicialicador Declater algo const garantiza que su valor no cambiard denrerde su fmbito: veld f\) 1 ‘model = 200; vi2}en: Werror Werrer ; : ‘Xval; 4 val puede ser modificado Hows im , epee donne que sean compindr psd enfin ue bj aeertkr name de vena frm, Por eel inilndr pr une cmtants 2Snudn pero mo sempre nu cco conte G3: 8c psd se ral. SENEmps Secompatn, Adm se compar sone ods wo a comt sect mip ipsa pr cette. Pr emp ‘constint cl = 1: ‘const int 2 = 2 const int 3 ~ my f(3) extern corst int ed const int* p= 562; Dad> esto, el eempilador conoce los valores de e/ y €2 de modo que puedan ser usados cenecpresioges constantes. Como fos valores de G3 y e4 no se conocen en tiempo de com pilcién(usande so Ia informacién dsponible ex esta unidad de compiacidn: véase $9.1), ese asignarse nemoria para ¢3 y ed. Como se oma (y presumiblemente se usa en otro sito) la direccicn de €2, hay que asignar memors para ¢2. E’ caso mis sencilloy frecuente ‘esaguel en cl aa el valor de Ia consiate se canoce e3 tiempo de compilacion y no es rnesesario asignar memoria; ef es un ejemplo de ello. Le pslabra clave exterm indica que cf se define en otro lugar ($92) Habitvalmen e es necesario asignar almacenariento para un array de constantes porque I compilador a» puede, en general, averiguar a qué eleme tos del aray bay ref cenlesexpresiones. Sin embargo, en muchas migLinas se pueden lograr mejoras de e7 «as aun en ese eso colocande los arrays de coms antes en al macenamiento de so lectura Los usos habitales de const son como limites de atrays y como etiquetas ease en las sertencias-witeh, Por ejemphe const int = 42; ‘const int £99; ‘const int ax ~ 128 11 no 26 conoce #1 valor de ¢3 en tiempo de compilacién 1/no 1 conoce s valor de e4 en tiempo de compitacion 1 esnecesario esignar espacio para ¢2 void fine) switch (i) ( . case b W 1 ) Los emmeradore: ($4.81 son a menudo ura alternativa a can:t en casos semejanes. La forma en que se puede usar const con funciones miembros de clases se analiza $10.26 y §10.27 Se ceben usar sstemiticamente constants simbolicas pure evitar la presencia de wa ‘meros migicos» en el cédigo. Sien el e6digo se repite una constante numérica, como u ite de array, resulta demasiado dificil revisarlo porque hay que cambiar todas las apa riciones de esa zonstante para realizar una actualizicién eomesta, El uso de una constan simbélea, en carrbio, localiza la informaci6n, Habitualmerte una constente numérica re Present una hips esis scbre el programa. Por ejenplo, 4 puele represertar el nimcro de bytes de un enterc, 128 el ntmero de caracteres necesarios para almacenar una entrada yf {6.24 elfactor de cambio entre la corona danesa y el dlar estadbunidease. Si se dejan con constartes numéricas en el ciligo, esos valores son dificiles Je localizar y enterer pur uien se ocupe del mantenimiento, Los vilores numéricos deese tipo seelen pasar in Vertidos y se convierten en errores cuando se port: el prog-ana o algin otto camtio n| fringe hs hipétesisque representan. La representaci¢n de hipdtesis mediante constants sin. bélicas bien comestadas reduce al minino los problemas de trantenimiento mencionados 54.1 Funteros y constantes CCuande se usa un sunterointervienen dos objetos: el propio pantero y el objeto apuntao Al afiacir a una dectaracin de puntero el refijo const se hace que el objeto. no el pune- ro, sea zonstante. Para declarar que el puntero, noel objeto avuntado, sea constante use ‘mos el perador declarador *const en lugar de un simple *. Por ejempl vad f1 (char* p) ‘ chars) = *Gorm> const char* pe =; pei3) = *@ Pe =p: ll bien ‘char *const cp =$; ep(3) = "a"; V bien =p: error: ep es constrte U punteroa constant: error: pe apunta a constante M1 puniero constante const char “cons epe = s; epe(3) =a"; Werror: ese apunte ¢ constente pe =P: error: ee es constante MU puntero const a const El operador dectaridor que hace 2 un puntero constante es “eonst. No hay operader d claradbrconsi*, por lo que un const que aparezci delante del * es tomato como pare de! fipo base. Por ejemplo shar *cons! ep; pantero canst a chos ‘har const® pe; pantero « char cons. tonst char* pe: pantero « char cons ‘Aatgunas personas les resulta til leer evas declarciones de derecha a izquierda. Por jem 72 es un punterc a un char const» Ho, erp es un puntero const a un ehar> y spe? es-un p Prerpobjelo ue sea constante cuando se accede a él por medio de un puncero puede ser varatte cuanto se accede,a €l de otras formas. Esto es especialmente dtl para los argu- Jpencs de funcidn. Al declarar const un argumento puntero, se prohise cue la funcién tmoditique el objeto apuntado. Por ejemplo: char* sirepy (char p, const char* 4) Se pusde asignar la direccign de una variable a ua puntero a constante porque de allo no fe puede derivar dafo alguno, Sin embargo, no se puede asignar la direcciGu de una zons- tante 1 un puntero sin resrisciones porque ello pesibilitaria que se cambiara el valor del 1 no se puede modificar *q bjetc. Por ejemplo: void fa) c ina =1; constintc = 2; ‘const int™ pl 1 bien ‘const ine” p2 bien int® p3 =e; Werrar:inicializicién de irt® com const int “phe 7: Wintento de carbiar el valor de € Es posible eliminar expliciamente las restriccioies sobre un puntero a const mediante conversin explicita de tipos (§10.2.7.1 y §15.4.21), 55 Referencias Una referencia es un nombre slternati» para un objeto. Se usan sobre todo para 2speci ficarargumentos y devolver valores pars funciones en general y para operadores sobrecar gados(capituo 11) en partculer. La nolacion Xs significa referencia a X. Por ejemplo: ‘id f() inti =1 ints Ure ise refieren ahora il mismo int imxer; xt rad Win? Para garanzat que und reterecia sea el nombre de algo (es decir, est vnculada a un Objet) debemos iniilizar la referencia, Por cero: Esto es legal, pero 7r++ no incrementa la referencia r; en lugar de elo, ++ se aplica aun {nt que casualmeate es i. Ea consecuencia, el valor de una referencia no se puede cam- biar después de le inieializacién; se refiere siempre al objeto para el que fue inicialzats Para oMtener un pantero al objeto denotade por una referencie rr podemes escribir irr La implementacién obvia de una referencia es como puntero (Constante) que se deve- ferencia cada vez que se usa. No es demasiado perjudicial carcebir las referencias ke exe ‘modo, siempre que se resuere que una referencia no es un objeto que pueda ser munipu- Jado ccmo lo e un punter: pe : En alginos casos el compilaior puede optimizar y descartar ana referencia de moco eve ‘no hayt objeto que la represente en tiempo de ejecacisn, La inicializacien de una referencia es tivial cuundo el inializador en un valor! (un ‘objeto cuya direccién podemos tomar, vase $4.9.6). El valor para un T ssimplen debe sr tun valerl de tipo Ti No ¢s necesaric que el invializador para un com Ts ses n valor ni siquiera de rl T- En ules cases, [1] © aplica prmero conversién imp icta de tipo a T si es necesario twéase §C.6%: [2] © coloca a zontinuacisn el valor resultante en una variable temporal de tipo Ty [3] por Gltims se usa esa variable temporal como valor ce inieiaizador Consid:remos: doubles de = 1; Merron: ex necesanvo valor! enst doubles. cdr <1; // bien La intepretacicn de esta ultima inicializacién serie deuble temp = double (1); // crear primero una temporal cox el valor adec ‘cnst doubles edr = temp; // usar luego la temporal como inicializador para Una temporal creaa para contener un inicializador de referencia persste hasta el final Aimbitode su referencia, Fr ee, Sica comer nigra a—snyranacn aren pie emt) derail or are ere aa reo argrenes de cio 8) Se ae war una rere para enorme de unin de mode gue ncgptds cota el sao de on ato que ee pe. Por emp vol erent (its 40) a vod intx= 1 increment (x) : lx =2 ) La sendntica de! paso de arguments est definica por la de Ia inicializactén, por lo que, ‘euancoes llamaco, el argunento aa de increment se convierteen otro nombre parax. Para tmartener Ia legibilidad del programa & menudo ¢: mejor evita las funciones que odifi- ‘canis argumentos. En lugar de ello se puede cevolver un valor explicitamente desde la funein o requerir un argurmento de punter: int next int p) (return p+1 void incr int™ p) ( (“piv ) void g\) ‘ ints = increment x) : fx =2 x enextix) 3 iner sx): x =4 La actacisn increment (x) no da a quien lee el cadigo una pista de que el valor de x esti siend> modificado de la misma forma que la da s=next x) ¢ iner (5x). En consecuen: cia, sso se deben usar argumentos de referencia «simples» cuando el nombre de If ci6r proporcions un fuerte ndicio de que se modifica el argumento de la referenca [Lx referencias se usan tambien para definir fanciones que se pueden wilizar tanto en €! lado izquierde como en el derecho de una asignacién. Muchos de los usos mis intere- sane: de esto se dan en eld sefo de tps no trviaes definidos por el usuario. Com Plo, samos a definir un ary asociativo simple. Definimos primero la estructura Pai: struet Pair | string name; double val; La asa basica es que un string tiene un valor en zoma fotante asociads a él, Es ficil de: Finir una funcin, value), que mantenga una es ructura de datos consstente en wt: Pair are cada cadens diferente que se le haya presen'edo. Para abreviar la preseatacién, se usa ‘una implementacién muy sencilla (¢ineficiente vee pairs ; doubles value (const string’: 5) P ‘mantener un conjunto de Pairs: buscar s, devolver sv valor si se encuentra fen caro contrario, hacer un Pair nuevo y devolver el valor por efecto 0 ' for (int = 0; tepairssize() i8+) Y (s == pairs i).name) retum pairs i}.val; Pair p= (5,04: pairs.push back \p); —//aftadir Pair al final ($3.73) return pairs \pairs.size) -1).val; } Esta funeidn se puede entender como un array de valores en coma flotanteindexac sor ccadenas de caracteres. Para una cadena de argumentos dada, ralwe () encuertra el objeto {en com Mlotarte correspondiente (no el valor del objeto en coma flotante correspond te); devuelve entonces una referencia a él. Por ejemplo: int main() — /contar e} ( sing buf; i while (cin>~buf) value (Buf) ++ for (veetor :const_iteruor p-pairs.begin\ |p: cout<namece * =" <

valc<" \n" nimero de apariviones de cada palabra en la entrada ursend\), +p) 1 bicle while le una palabra ce la cadena de entrada estindar ein a buf (36) ¥¥ actualza el contador asociado con é1. Por dltima, se imprime la tabla resultante con las diferenes palabras de la entrada, cada una zon su nimero de apariciones. Por ejemplo. ded In enteda 4 bb bb aa aa bb aa aa el programa producirs ae: 5 be Es cil perfeccionar lo antrice y convertil en un tigo de array asocativo adecuado usando tuna clase de plantila con el operaor de se eccidn [)) sobrecargudo ($11.8). Es incluso ns ficil usar simpkrmente la biblioteca estdar map ($17.41), 5.6 Punteroa void . Se puede asignar un puntero de cualquier tipo de ebjeto a una variable de tipo void, se puede asignar vn void a otro void, se pueden hacer comparsciones de igualdad y des- ‘gualdad entre woid*s y se puede convertr explicitanente un void en otro tipo. Otrasofe= raciones serfan poco seguras porque el compilador no puede saber @ qué tipo de ahjao se ea U7 bien: conversion implica de int® en void* void pe = pi: apt Werror: no se puede desreferenciar void* poses error: no se puede desreferenciar void ints pid = statie_cast pv); {/conversidn explicita de nuevo a int* double* pdt = ps: Herr double? pa? = pi Yeror double* pd3 = static castcdeuble*> (pr); /Vinseguro En general, no es seguro usar un puntero que ha sido converido («mole») a un tipo die: reste del igo del objeto apurtado. Por ejemplo, una miquira podria suporer que a todos los double se les asigna un limite de 8 bytes. En 2se caso, se produciria un comportamiento ceutato i pi apuatara a un int que no hubiera sido asignsdo asf, Esta forma de conversicn exotcita de tipo es intrinseccmente insegura y peligrosa, En consecuencia, la noacién wad, statie_east, se diseAo para que fuera peligcosa El.uso primatio de void” es pasar punteros a funciones alas que no les est permitido hace: ipdtesis sobre el tipo del objeto y devolver desde las Funciones objetos no tipificados, Pra utilizar un objeto asi debemos usar conversion explicta de tipos. Hhbitwalmente las Funciones que ussn punteres void* venen existencia al nivel mk bajo 4el sistema, donde se manipulan recursos reales de hardware, Por ejemplo void* my_alloc (sizet x) + //asignar n bytes de mi monticulo especial Laaparicin de void en niveles supeiores del sistema debe considerasesospechosa in- icador probable de errores de disefio. Cuando se usa para optimizacien, roid se puede ocala tras una interfaz segura con respecto al tipo ($135, 4244.2). Nose puedenasignar a void* punters a funciones (§7-7) n punteros a miembros ($15.5). Sr ructuras Unarray es un egregado de elementos del mistro tipo, Una struct es un agregado ¢e ele ‘entos de tipos (casi) atbitrarios, Por jemplo: struct direccion ‘char* nombre; 17 “lim Candy” ong int numero; 1/61 char calle; 4 "South St char* ciudad; 1/ "New Providence” ehar* exiadoi2); N's! int

m es equivalente a (+p) .m. Las objetos de tipos de estructura pueden ser ssignadas, pasados como argumentos de funcién y devueltos como el resultado de una funcién. Por ejemplo tireccion actual ; ireccion actualizar ‘direecion siguiente) ‘ direccien prev = actual; actual « siguiente: return prev: i (Ouras operacicnes plausibles, como Ia eomparacién (== y !=) no estén defini. Sin ‘argo, el usuari» puede devinir esos operadores (capitulo 11 tama de un jt de un po era no mcrae a su lon jon de sus miembros. Est se debe a que mthas mauasreguiten qu Los ojetos ‘aman ips sean asignado: en Vimiss dependentes dele arguitetura¢ mane esos Sejan gon mucha mayor efiknci i estan. 2 ejemplos enteros se asigman 1 me sadn limes de palabra, En tales msjuinas se lice que ls objetos tienen que esr a meitanadccuacamente, Esto da ugar a «apujems» on ls estructura, Por ejemo. en tips miguinas sizeof direcrion| es 24 yn 22 como se pra esperar. El lector pue- vhnimiza el despilfarre ds espacio sncillamente ordenando los miembos por ato ttrmer el icinbro mas grande). Sin enbargo, bivalmen ees mejor orden 1s mien ceerteniendn en cuenta la leiblidad y clasifcrios por tana slo si hay una necesi- fad demosirada de optimizar. nombre dun tipo est csponie nara sus) inmediatemente después de queha sido encntrado, sin esperar aque + haya vsto toda h declarain, Por ejemplo: strut Link Links previous Links Successor: ) ‘Noes posible declarar objetos nuevos de un tipo esrucara hasta que se ha visto toda Indkclraic, Por ejemplo struct No_good ‘No_goad member: h Exines un error porque el compilador no es capcz de deterninar el tamaio de No_good. Pars posibiliar que dos (0 més) tipos de estructura se refieran una a otta podemos decla- rar que un nombre sea el nombee de un tipo de estructura, Por ejempl: strut List; ia definir mas adelante struct Link Link pre Link sue List member of; struct List | Link head: error: defimicion recursiva uso de Listen la declaracn de Link hubiera dado Sint primera declaracin de List, Iugar un error de sintaxis nombre de un tipo de est-uctura puede usare antes de que sea definido el tipo siem- Pre que ese aso no requiera que se conozca el rambre de wi miembro o el tamaio de la fstractura, Por ejemplo: class S$; 'S'e5 el nombre de algun npo extern S Sf0; void gS) St hiS) 5 i ‘Sin enbargo, muchas de las siguientes declaraciones no se pusden usar a menos que se fina eltipo 8: : void k(S* p) Sa W error: sin defnir; es necesari el ramako para asignar fOr M error: § sin defnir; es necesario e.tamafo por devolver valor rac Mesror: sin defnir; es recesario tana para pasar argumenog p-2m=7; error: 8 sindefnir; noabre de miombro 20 conocido / bien: se pueten asigna’ y pasar panteros error: S sin definir: noubre de izmbro ao conocido {Una stuct es forma sensilla dels (capil 1) Porrazones que se remontan la preisoria de, es pose dectray una struct y “4 oresiucturaconel mismo nombre ene ino dno. Por ekempl ruck sah CP 2415 ! lat stat (chr name, srt stat= buf): neste caso, nmbre sme (ta) esel nombre ela o-estctura 9 la estructura bay ave reerise cone prefo ruc. De fornia semen, se pueden war somo prefs as Palabras clave lass, unum ($C8.2) y enum (88.8) pa ever ambiguedades. Sin enter 20, es nejor no sebrecaga os nombres y quello no sea ve sari. - 5.7.1 Equivalenda de tipo Dos exructuras son tipos diferentes aurque tengan los mismes miesrbros. Por ejerapla, sruct $1 ( wt a; ): sruct S2 ( wit a; ‘son do: tipos diferentes, por tanto Stx; Sy=x; error: discordancia de tipo Los tipos de esructuras son también diferentes de los tipos fndameatales, por tanto Six; nine; Toda suet debe ener una dnica definicién en un programs (§9.2.3) error: discordancia de tipo 5.8 Consejos [1] Brite ta arimética no trivial de punters: $5.3, [2] Tenga cuidato de ro escribir més all de los limites de an array; §5.3,1 [3] We Oen lugar de MULL: $5.1. [4] Ue vector y valarray en lugar de antays predefinides ‘estilo Cy $5.3. rr {5}__Use string en lugar de arays de char terminals por un cer: 53. [oq Reduzca al minimo el uso de argimentos de referencia simples: $5. [11 Evite void= salvo en e6digo de tj nivel 85.6. [BI Evite fs iterales no triviales («nimeros migicos»! ene defina y use constantes simbsliess: §4.8. $54, 59 Ejercicios 1. Cl) Esotba declaraciones para fo Sguiente: an puntero a un carécter un armray de 10 fetes, ana referencia & u1 array de 10 entems, un puntero a'un aray de cadenas de ‘racers, un punto 8 un punteroa un earécter. un entero constan‘e, un puntero aun ‘entero censtinte y un puntero constante un enter. Iniealicelos todos. 2, C15) :Cudles son, en us stema, ls restiesiones de los tips de pantero ehar®,int* {yvoid? Por ejemplo, ,puede un int* tener valor impar? Pista: alineacibn 43, (ol) Use sypedef para defiic los ipos unsigred char, cons unsigned char, puntero a fnlero, pantero a puntero ¢ char, gantero a atays de ehar. array de 7 puntercs ai funtero « un array de 7 punteros aint y array de 8 arrays de 7 punteros a int. 4. C1 Esciba una funcidn que permate(intercambie los va‘ores de) des enteros. Use int ‘como tipo del argumento, Escriba ora funciSy de permutacin usard ints: come tipo &! argument. 5. (LS) Cuil es ef tamato del array str en el ejemplo char str {Ludl esl longtud de la cadena ‘una eadera corta”’? 6. Ch Detina funciones f(ehar) .g chars) y 4 const chars}. Liémelas con los argu rnentos 'a" 49, 3300, ¢, ue yse, sendo ¢ unehar, ue un unsigned char y se ut signed ‘har. :QuéHlamadas sen legales? Qué Hamedas hacen que el compilador intraduzca tna Vareble temporal? 7. (115) Defina una tabla con los nombres de Ins meses del ato y el mimero de dias de cada mes. Esriba esa tabla, Hagalo dos veces: una .sando un array de ehar para los rmombresy un array para ef nimere de dias, y otra usando un array de estructuas, cada tna de ellas con el nombre de un ms y su rtmero de dias 8. (2) Ejecute pruebas para ver si su compilacor genera realmente eéiz0 equivalente fara iteracn usando panterose iteracién usando indexacisn (85.3.1). Si es posible so leita diferentes grados de optimizcién, ver si ello aecta a la calitad del e6digo ge rerado yen qué modo, 9. (1.5) Ereuenire un ejemplo en el gue tend sentido usar un aomb en su prio ini Salizader: 10.(+1) Defina un array de cadenas en el que ls cadens contengan bs rombres4e los Ineses Imprima esas caderas. Pase el array ana furcicn que imprima esas eacenas. (2) Lea une secuencia de palabras de la entrula. Use Quit como polakra que finaliza Ia entrada. Imprim las palabras en el ordes en que fueton introduzides. No imprima singuna palebra dos veces. Modifique el prog-ama para clasifcar las palabras antes de inprimitias '2.(-2) Eseriba una funcidn cue cuente el nvimero de aparciones de un par de letras en ‘una cadena corta": 1

También podría gustarte