Está en la página 1de 82
El lenguaje de programacion C++ Bjarne Stroustrup 2 Ellenguaje de programacisn C++ Notas para el lector «Ha legado el momesto>, dijo la Morsa, ‘ide hablar de muchas cosas.» L. Carroll Escructurs del libro — aprendizaje de C4+— el éisefio de Cr+ — eficieneia y structure — nota filosStica — aotahistrica — uso de C++ — Cy C+ — ah ‘gerenciaspara programradores de C — sugerencias para programadores de C++ = reflexiones sobre piogramacsén en Ct — consejs —referenciss sy th, Marcus, me has dado muchas cosas; ahors voy a darte yo un buen consejo. Sé ‘muchos. Abandona el juego de ser siempre Marcus Cocoza. Tehas preocupado demas estructura del lil do por Marcus Cocca, yen realidad has so exclave y prisionen suye, Notas hecho naa 11 Estructara del libro sin considerar ante: c6mo podia afectar a felicidad y el prestigio de Marcys Cocora El presente libro consta de ses partes: ‘Tenfas siempre mucho miedo de que Marcus hiciera una toate ia se aberriers 2 que Tnicodueide: Los eapitales 1 a3 ofrecen un vision de sonjunto del lenguaje C++, los importiba? Toco e mundo hace tontris.. Me gustaria que Mueras espontéreo, que estilo clave de programacién que soporay la biblioteca C++ estind. coraz6n se iuminari de nuevo. A partir de ahora detes ser no una sino muchas persons, Farte fi Les capitulos 42 9 proporcionan una introduecisn didactic Tos tipos pre- tantas como puedasimaginar...» deiinidos de C++ y a los recursos bsicos para constuir programas a partir de els, Karen Blixen Farte Il Les captulos 10 15 son una inrocuccisn didetica a la programacisa orien- “The Dreamers taca a objetos y genérica con C+ Fate Il: En los captulos 16 a 22 se presents la biblioteca C++ estindar Fate IV: Ex os capitulos 23 a 25 ve estudian temas relasionados con el diseRo y eld saurollo de software. ‘Apéndices: os apéndices A, B yC contiexm detalles sobre los aspectos técnicos del Tenguaye Ei capitulo 1 o'ece una visiin de conjunto del ibro, algunos consejos sobre cémo usarlo € informacién fundamental sobre C+ y su uso. Animo al lector a que lo nojee, Tea To que le parezca intewesante y vuelva a él tras leer oss partes det libro. Los capitulos 2 y 3 ofrecea una visin de cosjunto de os conceptos yearac as pri var al keetor para que dedique tiempo a los concertos fundamentales y las‘caactersticas basicas del lengucje, mostrindole lo que se puede sxpresar usando todo el knguaje C+, Cuanco menos, esos capitulos deben cnvencer al lector de que C++ noes (slo) C.9 de que C¥+ ha recorsido un largo camino desde la prinera y segunda ediciones Je este libre El capt ulo 2 sieve para familiarizase a ako nivel aon C++, Se analizan las caracteristicos del lerguaje que soportan abstraccién de datos, programacién orientada a objetos¥ pro _gramacs6n genérica. El capitulo 3 introduce los priipios bisi:os y los componentes prin. cipales de la biblioteca estandar, Ello me permite usar compenentes de la biblioteca cx. ‘iindar en los capitlos siguientes, yal lector le permite usa: cemponentes de la biblioteca en fos Gercicios, ex lugar de trabajar direciamente con earactevsticas predefinidas, de me~ nor nivel Los eapitulos inroductorios ofrecen un ejemplo de una Kcaica general que se aplica a lo largo-de todo el libro: para posibilitar un anglisis més direct y realist de slguna len ca 0 camacteristica, en ocasiones presento primero trevemente un concepto y mis adelan- te To anilizo en profundidad, Este planteamiento re permite afrecer ejemplos concrcton antes de presentar un tratamiento més general del tsma. Asi pues, la organizacidn del In bro refleja Ia idea de que habitualmente aprendemes mejor avenzando de lo concreto alo abstracio, aun cuando, al mirar ari, lo abstracto parezca sencilioy evidente La Parte I descrbe el subconjunto de C++ que sporta esti os de programacién tradi- sore. ine y merge: capitulos 18 y 19), eadenas' (capitlo 20), EntradySalida (capitulo 21) y scpote para compulacion au, mérica (eipitulo 22) {La Pare TV analiza cuestiones que surgen cuando e usa Ci en el disefo e implemen: ‘A to lange de todo el ibro, se uiliza scadenas fen inglés. sting) como sinGnimo de «secuensis se carsetere= (Nde ws F) he an pata er enu cin de rds sem de sofa capo 23s et le asin Seconelal ngs, nap ex sn ele leu de sescetraciin C2 1s peblemas ce dso. Hl capo 25 presents agus fo rack aeae “++ con unas cuantas anotaciones. En el Apéndice es, PANSICo¥ yas versions gu lo an preclio, EL Apéndise C pret slguros cjem- Pion de aspects nics del lenge 1.11 Ejemplos y referencias este lito se hace mis hincapé etl organic del programa queen Ia es [or igortmos En covoseniz, he via ener agortnos ingens o dls de comprendér, Habituslmente un algorimo trivial es més apropiado para iistrar un aspecto Gl definciéa del lengusje o una custdn relac onada con a estructura cel programa. As Per jeph lain de ran data camden dg ral sea ner hnétdo ripdo. A menue forma pane de los ercieios una reimplementcién eon un al- fbrimo mis adecuado, En ego rel, una Imada ana fnciGn de biblioteca suele ser Insapropada que el cédigo utlizad> en el ben para ilustrar caractevsteas del lengua Tor cempls de mama hn neesiamente ns isin deforma dl desroll de set war Al rier y simp os empos dspace fs compas bias a cesccla. Noenouentro nads que puede susttut ala eserturs de programes de tama real pare formarse una idea exacta de c6mo es un krauaie de p-ogramacién. Este libre se cen- te en as caractriticas ds enguaje ls temees basics a pani de lis cuales se compo- nem todos os programas y Is reglas de compos cin : La selecién de ejemplo refleja mis antecedcates en compiladores, biblioteca y sim: lkdcres. Los ejemplos son versiones simplificales de lo que se encuentra 2n el c6digo real La simplifeacin es necesaria para evitar que e lengusje de programaciin y los aspectos Se eto piardan eno ees No hay ej estas incite m do ral. Siempze que ha sido posible he relezado al Apéndice C los ejemplos relaciona dhs son ater tencos dt lenge los qu se san variables mada 3, pos A yB.y funciones 0) y 80 ; En os eemplos decd go se usa tn ipo de cra de sncuraproporsional para bs iden Ia esertura de Iifieadores Por ejemplo: include ostream int main) sté: scout << "Hola, nuevomundo | a Aimer ist ete ex de prsenicin pds pares cannes alos prog mado Tes acstritradca ver el digo en ips de era de ancurs constant, Sin emtarg, fs tot de aachuaproporcinl ecorsigeranen general mejores que bs de anc con tate pa a proseniciénde texto. Usarun God anc popocigal me pert ta bien presenta el ebigo cn menos sites de nea lgos. Ades, lo speimenon gue he realizado demaestran que It mayor parte de fa gente encventra enseguida el n tilo ms ficil de eer. ‘Siempre que es posible, las caractersticas del lenguajey la biblioteca C++ se presen tan en su comtexta de uso y noen la forma drida de un minus, Las caractersicas dl ler {Buaje presentadas el detalle con que se describen reflejan ri punto de visa sobre I que Se necesita para un uso efectivo de C++. Un libro complementario, The Annotated Cx + Language Standard, escrito er colaboracién con Andrew Keenig, conticns la defricion ‘completa del lenguaje, junto con comentarios cuyo props es hacerlo mas accesible. Légicamente, deberia haber otto libro complementario, The Annotated Libsary C++, Sin ‘embargo, dadas nis limitacionss en cuanto a tiempo y cepacidad para escribir, no puedo prometer que legae a producito. Las referencias a otras partes de est libro tienen la forma $2.34 (capitulo 2, agatado 3, subapartado 4), §B.5.6 (Apéndice B, subapartco 5,6) y §¢.6[10] (capitulo 6 ejecicio, 10). La cursiva se usa en ocasiones pare destacar galabras (pcr ejemplo, «un literal de ea. dena no es aceptable»), para sefialar la primera aparicién de conceptos importantes (por ciemale, polinorfsmo), para simbolos no termirales de ia eamatica C++ (por ejemplo, sentercia:for)y pera los comentarios ens ejemplos de eédige, Se usa cursiva negrila para representa identfcadore, palabras clave y valotes numérico en los ejemplos de clio (por ejemplo, elas, contador y 1712), 1.1.2 Bjercicios Los gjercicios se encuentran al fnal de los capitules. En su mayoria consisten en esribir un programa. El lector debe escribir siempre cédigo sufcient: para que sea compilala sjecutada una solusién con al menos trex casos de prueba La dificultad de los ejerseivs varia considerablenente, por lo que se indica Ia difcultad estimna para cada ano mediante tuna eseala exroneacial, segtin la cual sin ejercieio (*1) le Leva al lector diez minutos, tun ejercicio ("2) puede Hevarle una hora y un ejecicio (#3) un dia, El tiempo necesario para escribir y probar un programa depende mas ¢e Ia experiescia del lector que del eer. ici en sf, Unejersicio (*1) Hevaria un fa si el lector tera que familiarizase primero con un auevo sistena informético para cecutatlo. Por el contario, un ejerccio (°8) po. dria hacerlo en una hora alguien que casialmente tuviera i meno la coleccién de proga 4 adecuada, Com fuente de ejervicios extra para la Parte I se puede usa’ cualquier libso sobre pro- {gramacién en C, y vara las partes II y III se pueden usar libros sobee estructuras de dntoe Y algoritmos. 1.1.3 Nota sobre inplementacién El lenguaje usado es este libro es «C++ puso», tal como se define en el estindar C++ [Ce 1997), En consecuencia, los ejemptos dcben funcicnar sobre cualquier imp ementacién C++. Los principales fragmentos de programas del libro se prosaton usando diversas int. plemertaciones C+-. Los ejemplos en los que se usin caractersticas adoptadas reciente ‘mente en C++ 10 compilaron en todas las implemertaciones. Sin embargo, carece de ine exes mencona uéimkerentact allée a complain de qu ejemplos. eejante Fformacidn quedaria enseguida anteuada porque los implementadores estén trabajando tmurho para garantizar que sus impkmeentaciones acepten correctamente todas lis carac- Bee ct rerencias sobre céme manejar- Tifucas de Cra Snel Rpendce Bencontrarel ltr s sa nase CH amigos 9 eo digo cc's pra compindores 1.2 Aprendizaje de C++ ‘asar versiones anteriores y menos enpresivas d: C+ Cemo consecuencia de lo anterior, el lector va a usar C++ —a menudo para crea ss tema: reales— antes de comprender todas las carscterstcas ytécnicas Jel lenguaje. Al vo Porta diversos yaradigmas de programacién (cagitulo 2), C++ soporta programacivn pro. difieren sélo en la forma en que sedefinen, no en la formaen que se usan, La biblioteca estindar C+ Ses tradicional de compilacién y tiempo de eje- ‘eaciGn: cl ertomo de programacisn de C enel sistema UNIX. Afortunadamente, C+ nunca eente uss UNIX y C como modelo para la‘ relaciones icin, ewstera. Ese he estngido a UNIX ‘Ei ergo blocs compisdres, eladore, tors dee eae meme aya Co a sli sitoso en praca nent calguerplatfra ini vat Hay in embargo buenas acones pi war Cen enoros go popionan is tate mn scp Se puede sacar partido de recurs Com larg namics, la comp [iSec'acrenental y ura tse de nos de Ufnciones depo sin aca l nga i ernaeisias de Crs de comprobecisn de tposy cclacion de datos se bisanen et niigs defo propamas en tienpo de concn yrs mpercrupones acide ther de losdaos, No paporcioan confencaldad oproteccidn coniraslgulen que ticumpladiberadamene las norm, Sin ritargo.e pueden war con lide inn Fare costes de temp de eecucn ni deepaco, La de gue gra ge sea il, na Caractere de lenptje de eo slo cant, sino tabi snequible en el cote Parana descrpcién stematicay dts ada (sruseup, 198 Usefio de C++, conse el lecior 131 Bice Cee se desarollé a paride emus de srogramacisn Cy, com excsasexcepcios cancers € somo sibempnt.Ellengaje ise, e subsonjuno C de Cos, eal isedao Ge Yorn gus haya una eaecha cespnde ca ene os lips, opetadoresy seen Sos ojtos de los qi se ocupan decane lox conputadres’ nero, carvers y Sireecones Salvo patos operates new, delete, pert. dymamic_cesty throw, eH tae ls xpestonssentencas Indias Geno nsestan spre deienpo de 7 (C++ puece usar las mismas sectencias de llamada y retorno de funciones que C, u otras ifs ef ienes Cano incluso ess mecanisnoselaareneefilenes son dersiado Costs se puede ssi enn una fron de Gr, de modo ge poets dita Ge la comociad nota onal de las funcions sin cows ren emo de jean Una ds ialidade orginal de esse coliicaion en lenge ens tar pra ares ns exigens de proamacin de ssemas, Cando se dsehS Cow ano compomete le ganado cr cxa ea, La diferencia entre Cy Ces race fondamentmen ens rado de enfans cre Ls tipsy la ester, Cs cxpresivoy mermisiv. C1 es ans expesvo. Sin enbaro, pra cnsegirese iment cx expesivnd hay gue prestar nis atenion los tp de lo objeton,Conocendo os pode los abjtos el compiler puede meneercorrectamente expesonesensitacio- revels qe, de oro modo, habamosterco que espesfcar las operons ast el m= fimo deale Conoer os pos de ls objet emit as nismo al comarca ro fs que de cro meds hbrfanprsto hasta prs, inclse made Hay i tener tv cueringuc el ws del etemac pos prt comprar argimentos de fncinne, pate fer los datos de una cope acedental. proporconsr nuevos ipo. proporionr nk: y estructura ‘© presté gran atenci os operadores, tetera, no aumena Tos cones en cuanto a tempo de jeccin ne pacio en C++, ea Ls inportancia conceit extrac en C+ reflec el mento en In esl fos progaras estos desde ques ise6CPodemos hace funciona la uerzaun propane Peau (OD lines, por explo) au np tc a ei et Bune tio, Peo no ccur lo mismocen in pean mis pande: Sila esrctra de un pr. tad D000 ines es mal, decubrreros es todenweves emerson lama velocidad con que se eliminan Ins antigass. C++ fe dsetada para hacer psible due lou proganas mis grands se estutoraran erancra raion de modo qe fer aie sue me peson se ocoara de cantidadesdecoign mucho mores Ades se pce 4a que uma lites promedio de eSdigo Cr+ expesira macho ns que un tea pre de elizo Coase. ests auras, Cor ha leanzado con exces eso bjtvon, No dos los fegments de efdigo pueden estar bien esucurados se nlependcntes del rear, cies dele, eer, C+ pose caters stn eas pas spar cures del hardware de manera Sects yeicen, i fener en cuenta asi dado facade comprenion, Pose simismo recurs para oto et edgy de tes ees elegans y spurs Natwalment, el uso de C-+ para preramas ns grances conduc a wsode C++ por srupos de progamadores El nse de C+ cn laura, ls interac. fuera, te tpt Ta Nex bildad demestaenknces st valor. Fl equi de recieson de Cos pra scribir programas grandes nolo tne ning lengua. Si embargo medio gue fos programas on ms grandon, probes mevad cna kesarro mena pasan dese problemas de leeguaje st problemas mis des de heramintae es Sdn. Ena Pare TV se explora algunas de ests tostions nese libro se hace hincaié on genic que sive para preporconarrectsos de po- pésito ger ties de gran liad, iboteas, tetera, Ets cea seviin a) a lo detadores de ropramaspegtetioscono alos de programas eande, Ader y ded 4 que todos los programas no tiles se componcr de muchas partes semindependenes las téncas de serra de eam pats siren & tos programas de cunlguer pcan leo posta pensar qu a speifcion deur programa metiant el so de ana trctura Je tpos mab detalad da gar awn texto fuente dl programa ms lrg, Con Ce noe 51 Un programa C+ gue declare hs pos Tos arzumentos es fcione oe se ls, etter ser haitualente ws poco mis corto eee programa Cequislate due no enplee esos recursos. Cusndo se tse bibltsas, un peprana C+ reuad ho mis corto que sv equivalent C, supmiendo,ntramem que se pai consis un egtatente © que funciona 1.3.2 Neta fleséfies Un lengeaje de arogramaci6n cumple dos propésitos relacionades entre sf: proporciona an vehiculo para que e! programador especifique accicnes que Jeben ejecutarse y propor: ‘na un covjunto de conceptos para que el programadcr los use cxando piense en lo que se puede hacer. El primer prop6sito requiere. idealment, un lengaaje que esté «préxime a Ja méquiva», de mado que todos los aspectos importantes de uia méquina sean mance dos con sencillery eficiencia, en una forma que sea rxzonablemnte obvia para el prosts maor, El enguajeC fue diseiado prin de et es El segundo propos rege IeSondicion’ ia. um longuajeque exe sproxim a blams # resolver, de male on pond expres forma eta concisa fos concepos ce na soli. Los Nos tas aC practear Cr+ fueron sade prtendo de xa srgonexign ent ef Tenguaje ene ue ptsaonprog-amaros yo problems y 50 tacos qu poemos imagines ny eset, Porestararo, restr las crater teeta enpaj con el fn deena ere del prograador es, camo minim pel to. Come ocure con fos lengua auras, ten grandes verse er al mesos Blin ste, Un lenge prporcona aun rogramaler vn cynuno de herenancenceptua tom nieces par na tare simplemente an asin, Ex iposiblegraiza Siscen sen Te ausenc Je eres por aera presenti oasencia de caraersticas sspeticas dl lenge remade pos debe ser de epecialwlidad paral areas notes. E concep vode clase de Crt ha Gemostado una pene herent concept 1.4 Nota histérica Insenté C++, escibf sus primeras de'iniciones y produje su primera implementacién. Elegi y formule Ios erterios de dsefo par: C++. diseXé todes sus recursos principales y me hice ressonsable del precesarniento de prepuestas de extensionesen el comiké de estindares C++, Sin duda, Cr debe musho a C [Kernighan 1978] C te conserve como subsonjunto, También he conse-vado el Snfasis de C en recursos que son de nivel suficientemente bajo pam afrontar hs treas més exigentes de programaciin de sistemas. C, por su parte, debe ‘mucho a su predecesor. BCPL [Rictards, 1980}; de hecha, la convencicn de conentarios {de BCPL fue reintroducida en C+. La otra fuente importante de inspiracign de C++ fue Sirwla67 [Daal, 1972]; el concepte de clase (con clases cerivadas y funciones virtues} se omé de él. La capacidad de C+ para sobrecarga de operadores la libertad de colo- car una declanicion en cua quier Ivgar en el que pueda apirecer una seatencia recuerda a Algol68 [Wocdward, 1974], Desde la egicida original de este bro el lenguaje ha sido revisado y perfeccionado am- plizmente. Las reas principales de revisin fueron los recursos de resoluciin de sobrecarga snlice y gestiin de memoria, Se hicieron ademis diversos cambios menores para aumen: tarla compattilidid con C, Se aftadizcon varias generaizaciones y unas cuantas excensiones Drivcipales, ente las que se ineluyen: herencic multiple, unciones miembro static, fun ones miembro canst, miembros protected, plentillas. marejo de excepeiones, identifica: ién del tipo en iempo de ejecuciény espacies de nombre. EI motive comiin deestas ex- lensiones y revisiones fue hacer de C+ un lenguaje mejer para escribir y usar bibliote 08 La evolucion de C+ se deserite en (Stroustrup, 1994} 51 recurso de plantllas fue disefado originalmente para soportarcortenedores de tpi Ficaci6n estétca (ales como lista, vectores ¥ mapas) y Fara soportar un uso elegante y Bfisiente de esos contenedores (programaciéa 2enériea). Era objetivo fundamental redv- firel uso de macros y moldes (casts conversiones explicitss de tipo). Las plantilla se ins- Piraron en pare er los genéricos de Ada (tanto en sus puns fuertes como en los débiles) ¥ ex parte en os médulos farametrsados de Clu, De forms semejant, el mecanismo para manejo de excepeciones de C++ se insvts patcalmente en Ada [Tchbiah 1979], Clu[Liskov. 1979" y ML Wika, 1987] Ovo anes indi ene 1985 y 1998 —como la here mito son virus usta Se mbsf ae lo geeaiacovesimpulada po la xperiencs enel wo de Cry no ides tapos das de otros Jenguajes. . be ee Pete a. Drsce 1980 se ha wsadovensoes incase gust cmocdas en cost cero lioteca de tareas descrita en [stroustrup, 1987] y en §12.7[11] forné parte del primer programa «C con clases» que se cacti. La esribi, asf como sus chses asocialas, para soportar simulaciones ce estilo Sinvula. La biblioteca de tareas ha si revisada y reimplementada, sobre odo por Jonathan Shapiro, y se sigue usando ruucho, La bibliotee de flys (em inglés, streams) que se des- ctibe en la primera edicidn de este lib fue disefudae implementada por mi Jerry Schwarz Ta transforms cn biblioteca de flujos de E/S (cantulo 21) wsando la técnica de manipula- or de Andrew Koenig ($21.46) y ots ideas, Ls biblioteca de Mujos de B'S se perteccioné Tuego durante el proceso de estandarizicién,realizando el grueso del tao Jerry Schwar7, Nathan Myers y Norihiro Kumagai. El desarrollp del recurso de plantllas estuvo influido por las plantas veetor, map, list y srt. ideadas por Andrew Koenig, Alec Stepanov, otros autores y yo mismo, A’su vz, el trbajo de Alex Stepunoy sobre programacién genérica ‘con uso de plantillas desemboos en lis partes dc contenedares y algortmos de la bibliote- ‘ex estindar de C++ ($16.3, capitulo 17, capituls 18, $19.2). La biblisteca valarray para ‘computacion numérica (capitulo 22) 2s Tundanentalmente trabajo de Kent Budge 1.5 Uso de C++ CCertenares de miles de programadows usan C++ en précticamente cuslguier dominio de aplicacién. Este uso esté soportado for alrededr de una decena de implzmentaciones in ‘ependientes, centenares de bibliotesas, centenares de manuales, diversi publicaciones léenicas, muchts conferencias e innumerables consultores. Hay formacién y ensefanza a tna ampli vasiedad de niveles Las primeras aplicaciones tenian generalmene un fuerte aroma a programacide de sis- temas, Asi, por ejemplo, varios sistemas operativos importantes han side escrtos en C+ [Camphell, 1937), (Rozier, 1988}, [Hamilton, 1993], [Berg. 1995], (Parrington, 1995] y muchos mas tienen partes clave hechas en C+. Consider€ que para C++ era esencial una rgurosa eficieacia a bajo nivel. Estonos permiwe usar C+ para eseriir controladores de sdspositivos y sofware que s° basa enla manipulicién directa de hardware con restricciones. ‘de tiempo real En edidigo de ese tipe la predecisilidad del rendimie {an importante cono la pura velecidad. 4 menudo lo es también la compacidad del siste- ‘ma resttante. C+~ fue diseRado de mode que todas las caraceristicas del lenguaje sean utitizakles en +1 e6digo en condiciones de fuertss limitaciones de tiempo y essacio, [Strouseup, 1994, $4.5}, ‘La rayor parte de las aplicaciones tienen tramos de cédigo que son esencales para un rendimiznto aceptable. Sin embargo, la mayor cantilad de o6igo no esti en es0s trams Para la aiayor part: del c6digo, la mantentbilidad, ht facilidad de extensin la facili de prucha es clave. Bl soporte de C+ parz estas cvestiones ha conducido a su amplin wo siempre que la fitilidad es indispensabee y en drezs en las que las necesidades camban Significativamente a lo largo del tempo. Son ejemplos de cllala banca, el comercio, om ‘seguros, las telecortnicaciones y las aplicaciones niltares. Durante afos el control cen tral del sistema telefnico estadounidense de larga distancia he confiado en C+, y tots tas Hamadas 800 (sin coste para el abonado que Ilana) han sid encaminadas por un ps ‘grama C+ [Kamats, 1993}. Muchas de estas aplicaciones son grandes y de laiza vida, 2 onsecuencia, luestbilidad, comptibilidad y posibilidad de cambio de escala han sido pre ‘ocupacicnes constates en el desarollo de C++. No es infrecuent: encontrar programas C12 de un mil6n de lneas. Al igual que C, C++ no se diseié espeetticamente para computacién numérica, Sin em bargo, + hace con C++ mucha computacida numén:a, cieniica y de ingenietia, Uns tas 26n impertante pare ello es que cl tabaje sumérico tradicional debe combinarse a mens 440 con grficos y con céleulos que se basan en estructura de catcs y no encajan en el mold Fortran vadicioral Budge, 1992}|Barton, 1994], Les gréficns las interfaces de usuario Son éreat en las que se usa mucho C++, Cualquiera que haya usado alguna ver un Apple ‘Macintesh o un PC zon Windows ta usado indirectamente C++ porque las interfaces pi- ‘marias de usuario d: esos sistemas son programas C+, Ademés, algunas de las més po- Pulares ibliotecas que soportan X para UNIX estin escritas en C++. Asi pues, C+ es una ‘pein babitual pars el vasto niimero de aplicaciones en las que la interfaz de usuario ex luna pane importante, ‘Todo bb anterior efala el que puede ser el principal punto fuerte de C++: su cupacidad para ser .sado cane icacia en aplicaciones cue requizren trabajoen diversas dreas de apl- caci6n. Es bastante recuente encontrar aplicaciones que entraian integracign e1 red local y de grat amplitud. andisis numérico, grificos, iteraccién del usuario y acceso a bases de datos Tradiciona mente estas dreas de apicacign han sido cotsideradas distintas y han Sido atencidas casi siempre por cominidadestéenicas iferentes que usan diverss lengua {de progrmacién, Sir embargo, C++ se ha asado amoliamente en todas esas teas, Ades mis, puece coexisircon fragmentes de cstigo y programas esctitos en otvos lenguaies C++ es ampliamente utlizado e1 la enseianza y |tinvestigacin, Es algo que ha sor Drendidos algunss personas que —acertadimente— sealabaa que C++ no ese lenge ans pequeno ni més limpio de fos que se han disefado, Es, sin embargo: ~ sufcientemente limpio para Ia ensenanza de Jos concepios bésicos, = stficientemente realist, eficiente y flexible pata proyectos exigentes, ~ suficientemente accesible para organizaciones y colaboraciones que se apoyan en di Tintos entorros Je desarrollo y ejecucién, ~ suficientemente amplio como vehfculo para la enseflanza de conceptos y técnicas avawades, y _ sufiientemente comercial con vehiculo vara poner en uso profesional lo aprendido ‘C4 es un lenguaje con que el lecor pued>«recer. Le Cy Ct fancion en ambos sertidos. As, por ejem ce i de punter ved fue inventado para ANSI C e implemenado por primera vet tncrs. Com se promt em la pera eden de este. se ha eis la defn Clin de C++ para climinarncompatbilidades gratis C++ es ahors ms compulible con Ce fo que loeraonginamente. Lo ideal era que C+ extviera tan prbxioo a ANSI-C ome fuera posible, pete np més [Koenig 1999. La compatbliad teal nunca fue una rea porque elo compromereria a sguridad con especto a os ios, laintegrackn ida 4 iposdeinidos pore usiri ytpos pede ido Sonocer C no es reusioprevioparaspreder Cav, Programar ex €favorese micas series y traces que ls saracteristvas de Inguaje Co¥ han hecho innecesaron Ast, po: 1o fuera an de C+ sempre cjemplo, la conversiGn exalicita de tipos se necesita con menos frecuencia en C++ que en (1.61), Sin embargo, ls buenos programas C tienden a ser programas Cx, Por ejen, Plo, tods los proguumas de Tite C Programming Language (2rd Editon). de Kernighan y Ritchie (Kernighan 1988), son programas C++, La experiencia con cualquier lengusje de tipificacién esttics serd de ayuda para aprender C++, 1.6.1 Sugerencias para programadores de C Cuanto nejor se ccnoce C. mis dificil parece que es no escribir C++ en estilo C, con lo ‘que se perden pare de los bereficios potencies de C++. Ruego al lector que convulte -n Apéndice B las diferencias entre C y C++. Veamos algunas ce las dreas en las que C-+ tiene fornas mejores de hacer algo que C. [1] Lis macros casi nunca son necesarias en C++, Use el lector const ($5.4) 0 enum ($1.8) para definir constantes manifiestas, inline (87.1.1) para evitar los eostes ex ‘ede las lamadas 2 funcién, templates (capitulo 13) para especificar familias de fusciones y tpos, y namespaces ($8.2) para evitar confictos de nombres. (2) Nedeclare el lector una variable hasta que la necesite, de modo que pueda inici 2zaila inmeciaament. Una declaracién puede aparecer en cualquier lugar en cl que purda aparecer una sentencia (§6.3.1),en inicilizadores de la seatencia for ($6.3. ¥y a condiciones (§6.3.21), [31 Nohay que usar maifoc(). El operador new (§6.2.6) hace mejor enlugar de realloc(, se debe intentar un vector ($3.8). 4] Precure el lector evitar void, la aritmetica de punteros, las unions y los moldes (en inglés, cass), excepto em las profundidades de la implementacidr de alguna funcicn © €ase. En la mayoria de los casos un molde es una indieaciGn de error de diseiw Si lector tiene que usar una conversién explicita de tia prucbe a usar uno de lew nuevos melds» ($6.2.7) para un enunciado ms preciso de lo que -ntenta hacer, [5] Hay que reducir al minim el uso de arrays y cadenas de estilo CA menudo se pu der usar tas clases string (§3.5) y vector (§3.7.!) de la biblioteca estandar C++ para simplficar la programacin con respecto al eso traci anal de C. En general, el lector debe tra de no construir Io que ya proporciona la biblioteca estandar Para cum las conenciones de enlazado de programas con C. debe declararse que una funcién C-+ tiene erlace con C ($9.24). ‘Lo mas importants es que el lector trate de concebir el programa como un conjunto de conceptosen interaceién representados como clases y objetos. en lugar de como un ma ‘ojo de esiucturas de datos con funciones que juegan con sus bits m0 trabajo 1.6.2 Sugerencias para programadores de C++ Ea este memento hay muchas personas que llevan ya una década usando C++, Son mu: eas més lis que usar C++ en ua solo entome y han aprendido a convivit con las reste. ciones impuestas por los prineros compiladoces y las bibliotecas de primera generac ‘A menudo o que se I ha escapado en estos afos a un programadcr experimentado de C+ ‘noes la intioduccién de las nuevas caracteristicas com ales sino bos camiox de relaciones lente esas caracteriticas que hacen viables tEenicas nuevas y furcamentues de programe ce dere moda, cosas quel lector wo pens ono encont pricticas cuando si oi Ce prt coms aboraon plane nienosopro, algo qu alos puede sete exe ninando les fundame os del erie ~eetcndo a ecor qn Tea fos capitals prone. Sia conce el contenigo de un capa repaario en unos minson. Si To cone aprender alo con Te qe 00 eee Berm pare, he apend mastaneeibendo ee Hoy sxpeco ge ae contin pogramaorce C+ come tas hs carters y Wench presents ‘ens pr le lege ce alt na eninge pn re osm decometrsca nics Mediate su ogani:aiény sus employ, ese I fre ee oa perpectiva 1.7 Reflexiones sobre la programacién en C++ oe r—==FEEE tinge sone ompresin cara el rob (is), gos deaican es oncep ins ence tne erin eo e,rsCs=*é«*=sCsia(‘iCiéséa eeeietet pour c tenn te none seqnaement Por eva ozone LL sla mayora de las aplicaciones hay concertos que noes fil represent eee hay dara cls paternal eae prgramn. Una ise Coes ip Era epe en timo compo lan objeos desu se bes ean som Se er, ees —— Serunaprescuracon mpurante La dn parweserbbueos progaas es dar ls {Xs de mod que cal tne eels epee con Timea uncle concep. Amen ee —™se err, sre eel pce (parva re eee eee he aie ia meer orang rene aioe, nolura pensar mene biome 9 soley props prac eh ng de empeat Ineo cial pretemas f oo F—r—s—S—SisCSCr—Ss eS ee dores y algunas clases matemiticas forman pert de Ja bibioteca estindar C+ (capitulo es, s—=Cié=S er ep as Ls conceptes no existenen el vacks siempre hay agrupumientos de conceptosrelaco nak ene signa feline laces de an programa ss dec, drm rr Clon "suc sma if que exatecr incatmen la sina canes: E lade tno debe ser un embrotio en el que cada case (concepto) dependa de todis las dem. Con sidenmos dos eases, Ay B. Relaciones como «A llama afunciones de», «A crea B» ‘plantillas (82.7, capitulo 13 Una pantitla de clase espec:fica una familia de chses. Asi, por ejemplo: una plantils de listasespecificaclista de Tx, pudiendo ser «T» cualquier tipo. Asf ates una plant lls v= lun mecanismo para especifiear emo se genera ut tipo, date otro tipo como argument Las plantillas mas frecuentes son clases contenedor coma lista arrays y auras asocictiven, ¥ los dgoritmos findamentales que usan esos contenedores. Habitualmen ees un error ex Presarla parametrizacicn de una clase y sus funciones asociadas con Ua tipo que we la herencia. Se hace mejor con plantllas Recordemos qte gran parte de las tareas de programacisn s+ pueden realizar con sere lez y slaridad usando sélo tips primitives, estructras de dats, funciones simples y unas ‘ewan: clases de biblioteca. No se debe usar todo el aparato que intervisne en la dein i6n : tipos nuevos a menos que sea realmente necesario. {La regunta:«{Cémose excriben buenos progranas en C+?» es muy garecida ala pre- santa: «{Cémo seescribe buena prosa?s. Hay dos ‘espuests: «Sabienld 19 que se qutere decir y «Con la prctica,imitando la buena escrtura». Ambus Jarecea tanapropiadas para (C++ cxmo para laprosa, y no menos dificles de seguir 1.8 Consejos A continuacidn se ofrecen una serie de «reglas» que el lecter suede ‘enes en cuenta pera ‘aprender C++, A medida que gane dominio del lenguaje podré alaptarls para hacerlas mis cin, Son, de manera deliberals, my iadas sus aplicaciones sues de progamaciGn, Sn, i SEoBia pee geno cnt en deat, No hy or tm al ee ata ao wr ynbucn programa hace fata insligencia,gstoy pac encia, No espee el Leto ha ie bien la pritera,expeimente ['} Coardo eestor progama. Solucién de algun probiems. Hay que ‘esas ideas lo mas directamente posible nc cans en [a] 5 pusde pensar en algo como una ide independ ente, convert ese «aly rea una representaciGn concreta de sus ideas para la fue ja estructura del programa refleje {b] No use funciones globales. a 13.1 Referencias ‘Aunxue en el texto hay unas cusntas referenciss irectas, sha reunide aguf una breve re lacidn de libros y otras publicaciones mencionacas, directa o indireetamente 2 Recorrido por C++ Antes de nada, matemos «todos los abogados del lenguaje. Enrique VI. parte Il Qué es C++ — paradigms de programacir — programacidn por procedimic tos — prozramacién modular — compilaciin indepenaiiente — marejo de ex- cepciones — abstracciée de dato: — tipos definidos por el usuario— tipos cca- cretos — tipos abstracios — fusciones virtales — programacién orientada a ‘objetes — programacién genérica — contenedores — algoritmos — lenguaye ¥ programaci6n — consejos 2 Qué es C++ Cot.es un enguaje de programacién Je uso general con un sesgo hacia la programacisn de sistemas que = es un C majorado, = soporta abwtraccin de datos, ~ soporia programacién orientada a objetos y ~ soporta programacién genérica, El presente capitulo explica lo que significa este sin entrar en los detalles més suiles de la definicién de: lenguaje. Su finalidal es ofrecer al lector un panorama general de CH y las ecnicas clave para usalc, no proporcionarle la informacidn detalads necesaria para ‘comenza a progeamar en C++ Sie lector encuentra passes dificiis de seguir debe saltirselos y segur leyenco. Todo ‘se emplca con cetalle en capitulos posteriores. Sn embargo, si omite alguna parte de este capitulo, debe hacerse sf mismo el favor de vo ver sobre ella ms adelante El conocimiento detallado de las saracteristcas del lenguaje —aunque sea de todas cllas~ no compensa la fata de una vision de cenjunto del lenguaje y las téenicas funda ‘mentales para usar. 2.2 Paradigmas de programaciin La proramacié venta ojos esa tcc para prima un pragma pare eri programas sbunosx pre un connto de oblemar 8. a denomnne Se seesace de proramacon eta «objeto ica lpn ha de eeise sun lenae te tramion que popotcons mecansmos que septa tien cl eno de popasaoa oriertada a oben. : " : ve Hay agui una cisincin imponant, Se dice qe un lene soporta un estilo do. tranacion i properiona rectnos qe lagan coed araanenent ch aeeroy sient) sar te elo, Un lenguje no spota una nica! tace alas ees ona habikdd excecinal para ese ale programay; simplemente perme ease dena sGenea AS por empo es posible exc progranas estuouato arsine tna erentaos a chjtos en C.fro es nescaramete ie haces pone no es taj ue sopoen de manera neta ea ties soporte paraun paradigm adopts ro so la-orma ede de recurso del ena {ue prmitan elas det dl paradigm a oma Mss de cone baci en temps de ejecuidn fo en tompo de compilcignparsJeecar desi inntensionada det miso. La cemprobacdn de tiene el ere mis eid tree se trandtecin dea ambigbedad ycomprobacunes en lenge de Scion pon oe Dla soporte linseed on praigngs. ReewwoncxealmUition cone ke Bot tees y los enon de proracin pueden aunetar el spe els parigoas Us inguaj noes necesaramente mer que co pau poscans cans ue «lot 0 tee. Hay mucho ejanpos do Contato La pate ss son ate ese raceisicas qu psen un lengeae, como que ea earaceraat sea sulin fos ‘oporar fos esilosde pogramacondesaos en tes de slic dren U1 Tos as canterstcas eben esti y egos negra eng, (2) abe ser pose usar as eracterscas en mbna ura lop solelone og, caro mow, ein cxraterscas independiente acon (81 Eehe hater an pocas caters expe spar es epeticots como sea posible (41 mpemenacin de ua caractestica no debe pone ose ext imports los prograns que no laces, {5} usuarocebenecestar conocer slo el sabonjumo cel engaje vido exp tamente prs rion programa Bt prime rinaipioss un ama a ei yf pc, Lo os sigue son expe sin dl ideal dt animals, Londo hinos poet resimins ene cones oe Te ques seas no haga dann Che died pre Soporte absrasin de dos proganacin orienta oes » programacin gerétca, adem de cna tadkionales de Coons tevon, Nee Pecens qu inpuea un exo deprogumaccnconereto als isso En os arias siguientes se sudan algunos estore peace e mecens- sno he del lng gue los sopra. Le pesenscin vanes porns eine ens Ae vn Sede pogramacin por roced mento e sods eu ca a Programaion orien ada + ebjetony pograacionpenzrica nel soo de Pasi Cada paradzna se constye soe los le loan prcelda aie algo nscvoal nent de herramenta del propor Cy teks un paneamieno oe dca denuninde La presentac on de las caracteristias del leaguaje no es exhaustiva, Se hace mis hin- cap en los plateamientos de disefioy as formas de organizar los pregramas que en los ‘Gaalfes det lenguaje. En esta etapa esmucho mas importante formarse uns idea de lo que Se puede hacer asando C+ cue comprender exaetamente como se puede lograr 23 Programacién por procedimientos El paradigma original de programaci¢a es: Decidir qué procediniewios se desean; usar [os mejores algpritmos qu? Se pusdan encontrar. El centro de atexcin esté enel procesamiento: e algoriimo necesario pars realizar et cal culo deseado. Las lenguajes soportan este paradigma proporeionando recersos para pasar frgu-nentos las funciones y devolviendo valeres de las furciones. Lo publicado en rela cidn con esta forma de pensamiento et repleto de andlsis sobre formas de pasar Ios at= ‘gumentos, formas de distingur dferertes tipos d> argumentos, diferentes tipos de funcio- res (procedimientos,rutinas y macros), eteétera ‘Un ejemplo pico de «buen estilo» es una funzidn de rafs.cuadrada (sqrt), Dado un ar _gemento en coma flotante de doble pecisi6n, produce un resultado, Paraello, realiza un teflculo matemstico bien conocido. double sqrt double arg) fi MW eédigo para calewlar una ref: cuadrac void f double root y 1 Las laves expresan agrupamento en C++. En exe caso indican el comienzo y el final de los cuerpos de las funciones. La doble bara inclinada abre un comentario que eg hasta elfiral dela linea, La palabra clave vaid indica que una uncién no devaelve ningur valor. Desde el punto de vista de la organizacidn del frograma, las funciones se usan para crear ‘orden en un laberinto de algcritmos. Los propios alzoriimos se escriben tsando Hamada 2 funcidn y ots recursos cel lengnaje Fn los aitapartados siguientes s© presenta una ver- sin reducida de los recursos fundamentales de C++ para expresar cdeules sqrt (2); 23. Variables y aritmética ‘Todos los nombres y todas as expresiones tieren un tipo que determina las operaciones {que se pueden realizar con ellos. Por ejemplo, la declar int inch; specifica que iach es de tipo int; es cecit, inch 2s una variable entera Una declaracidn es una sentencia que introduce un nome en et programa. Especitica un tio para ese nombre. Un sipo define el uso adecuado de un nombre o una expres, C+ offec> una serie de tipos fundamentales, que se co-responden directamente con Fecusos del harSware. Por ejemplo: boot 1 so0leano, tos valores posibles sox verdaderey falso char If ardcter, por ejemplo, ‘e',"c' y 7 int 11 entero, por ejemplo, 1, 2, y 1216 double 1/ximero en coma flotante de doble precisida, nor ejemple, 3.14 y 289793.0) Una variable char es del tamao natural para cortener un carécter n wia méquins deter ‘minoda (ipicamznte, un byte) y una variable int 2s del tamafio natural nara aritmetia de enters en una méquina determinada (tificamente, una patra). ‘Sepueden usar los operedores aritméticos pars cualquier :ombiraci¢n de estos tips + Yds, tanto monario como binario = Y menos, tanto monario como binario + rubtipticar 6 peividir % resto ‘Lo msmo ocurre con los operadores de comparacisn igual W dstinto W menor que MW mayor que HW menor o igual que Wrrayor o igual que ions y enas operaciones aitméticas C++ realisa toda las conversionss.que tienen sentido ene los tipos bisicos, de forma que se puecer mezciar Hibremente, ‘oid una fencion’) i funcidn que no devuelve ringuin valor double d = 2.2; Winiciatcar nimero en coms flotaite int i= 7; Winicialzar entero dads; Masignar suma ad i-dn Wasignar producto a i Comoen C, = 25 el operador de asignacién y == comprucba b igualdad, 2.3.2 Pruebas y rucles C++ proporciona in con.unto convencional de sentencias pata expresarse'eccién y backs. ‘Veamss, por ejerplo, una funcién seneil a que dé un mensae al usuario y devuelve un booleaso que indi bool accept) ‘cout << "Desea cominuar (s 0 n) ?\n* Meseritr la preginua chor answer = 0 if vansver =) tun tae fet fae ) 1) se asa emo oper de aid cout es jo des x operat << (poner en) xs como oper ge th epercdor o> Ccbtener dex) asa cor opera de ena; cn ese ajo Se (af ena El po del eran de a detecha de => termina qu nada ap cre elder da opencion denrada El carder "mal nal de a cadens de 8 ode fae He eps un : ae TE jemplo anterior se px mejonsHigerametetesenco en cuems ues bool cep 2) ‘ cout > answer Meer ta respuesta retwen false defaute ‘cout << "Tomo su respuesta como us no.\n etwen false; Una sentencia-switch contraga un Valor con un conjunto de constantes, Las constantes de los easos deben ser distntasy, si el valor prokado no conceerda con ringuna de das, se elige default. No es necesario que el programador proporcione un default ‘Son pocos les programas que se escriben sin tucles. En este caso, nos zustarfafailitar usuario tnos cuantos intertos boo! cecept3\) intiry =; while cry <4 cout << "Desea continuar (5.0m) 2m" + describ la pregunta char answer = 0: ein >> answer; Meer la respuesta ‘witeh (answer) return true’ return false default ‘cout << “Perdon, no lo entiendo,\n* try = try ol; , cout << * Tomo su respuesta como un no. \n* return false 1 La sentencia-wPile se ejecuta basta que su condicion se hace false 23.3 Punteros y arrays Un array se puede declarar dela forma siguiente: char v 10); arrayde 10 caracieres De forma sinilar, un punter se puede declarar as: ‘char* p: 1! puntero a ur cardcier En ls declaraciones, (significa «anay de» y * significa spuntero a» Todos los axays tienen 0 comp limite inferior, por lo que v tiene ciez elemen os. »{0}..»{9]. Una varia bie pantero puede contener la direccida de un objeto del ipc adecuado. P= G913}; Mp apuma al euarto elemento de v El signo & monario ese] oferador sdiresciGn de» CCensideremos la copia de dizz elementos de un array aot: void otra_juncion ( int v1 10) ; int 9210); Us Sor Vint {-0; 10; +48) vi (i)-¥24); Esta sentencia-for se puede lee: como «poner i a cero, mientras # sea menor que 10.60 Piar el iésimo elemento ¢ icrementar is. Cuande se aplici a una variable eaters elope rador de incremento ++ simplemente afade 1 2.4 Programacién modular | A lolargo de los aos, en dsefo de programas el énfasis 22 ha desphzado del disco 4¢ los procedimients ala orgunizaciéa de los datos, Esto refleja, ene otras conte um ‘umerto en el ama de ox programas. Un conjuto de procsimientosalines junto com Jos dos que maniputan se denomina a menudo mdula. El paradigma de programscion Decide gut miu deseans [L_ Barrel programa de modo que 1s datos queden ceutosen los madalon. ‘Eats paradigm se conoce también ccmo principio de ocultacidn de datos. Cuando no hay Zeripamiento de los procedinientos :on los dos relacionados, el estilo de progranacin porprocedimients es sufciente, Las tcnicas para dietar «buenos provedimiewtos» se Mojcan akora ambién a cada uno de los procedimientos de un médulo. El ejemplo mas ffecocnte de rrédulo es la dafinicidnde una fila. Los principales problemas que hay que reselver son II] Proporcionar wna interfaz de wsvorio par In pita Fanciones pusk (1 y pop) BB} Asezurarse de que sdlo se puala acceder a la representacion de I pila (por ejem. plo, un array de elementos) pcr medio de esta interfaz de usuario, JB) Asegurarse de que la pla sea iicializada antes de ser usada por primera ve. Ce peoporcicna un mecanismo part agrupar datos, funciones,etcétra, relaciorados en cios de nombres independientes. Por ejempla la interfaz de usuario Je an médulb Stack pocria declararse y usarse asi namespace Stack {| /Vinerfaz void push (char) ; ‘char pop () ) void f) Stack: :push ('e") : if (Stack: :pop () = 'e") eror imposible La nalificacidn Stack: = indica que push () y pop () son los del espacio de nombres Stack, No intrferirén ai causardn confusige otros usos de esos nombres 1a definicin de Stack se puede proporcionar en una parte del programa que secon be parte: namespace Stack { 1 implementacin ‘const int max_size » 200; char v(max_size) int top = 0; vaid pash char e) (/* conprobar que no hay desbordamiento y meter */ char pop) (/* comprobarque no hay subdesbordamiento vextraer */ EI punto clave de este médulo Stack es que el eidigo de usuario esté astado de la represen luckin de Is dstos de Stack por el céalgo que implementa Stack: push) y Stack::pop() El asuariono necesita saber que Stack se implerienta usando un array y se puede cambiar ‘a inplementaciGn sin que ello afect al c6digo de usuario. Debidoa que los datos son slo uta de las scsas que se podria desear wocultar» la no- 6a de ocultacidn de datos utlizadade forma poco cuidadosa, abarcala Je oculacion de ‘nfcrmacisn; es decir, también los nombres de las funciones, 10s tipos, etcétera, se pueden hacer locales de un médulo. En consscuencia, C++ pernite que cualquier declaraion sea ‘olecada en ur espacio de mombres (8.2). Este médule Stack es uns forma d represextar una pila. En los apatados siguientes se il zan diversas pilas para lustrar ditintos estos de prog:amacion 241 Compilacién separada (C++ soport la nocidn de C de compilacién sepe-ada, que se puede usa: pata organ Programa en ur conjunto de fragmentes semiindependientes Habitualmente colocamos las dectericiones que espec:fican la interfiz para un medulo {nun archivo con un nombre que indica su Uso prevsto. Ad, namespace Stack Winterfas void push (char chat pop ) se colocaria en un archivo stacksh y bs usuarios incluintn de cabecera, de la forma s guiente: include *stackh* 28e archive, Hamado archivo obener ta interfaz void f() ‘ ‘Stack: :push 'c"); (Stack: :pop ) 1c" error impostble®); ) Para ayudar sl compilador« garantizar la coberensia, el arhivo meniacién del mdulo Seaet includ tambisn la interfaz: ‘include *stackh* ——// obtener ta interfaz namespace Stack { ‘que proporciona la iemple char v (max_size| ; int 9 ~ 0; ) void Stack: spush (char €) { /* conprobar gue no hay desbordamiento * meter ¢*/ ‘thar Stack :pop\) (/* somprobar que ne hay sublesbordamienio y sacar */ El cidigo de asuario va en an ter arcivo, por semplo, were. El esdigo de sere y stack compare ja informacién de intefaz de pitas presentada en stack.h. peto los dos archivos son por lo demés independientes y pueden ser compilidos por separalo. Los fag. ‘mentos del programa se pueden represenar grficemente si: stich; J) imeteeStaae ee Winctte sack” | siete tack [usar pita | definir pita ‘La cor pilacion sesaradaes un problemea todos los programa reales. Noes simplemente unapreocupackin en progranas que rresentan emo médulos recursos como una Slack. El aad compilasion eparada no cs ensentido estricto, un problema del enguaje; es un pro tema de e6mo aprovechar mejor un implementacidn concreta del Ienguaje. Sin embar oven grt importanca pictica La mejor forma de escvero es raximizando a mo JW randad, cepresentando esi modularidad légicamente por medio de caacteristcas del [bngusje y aprovechando enfoncesfiscamente le modularidad por medio de archivos para tnacompilacicn separada efectiva (cpitulos 8 ¥ 9) 1.42. Manejo de excepeiones CCuzndo un programa esd disehado cono un cosjunto de méculos, el manejo de excenciones fabs consderarse teniendo en cuentaesos mules, ,Qué médulo es esponsable del ma- feje de qué errores? A menudo el mélo que detecta un error no sabe qué aecién smpren- fer La aceidn de recuperacisn depende mas del médulo que ha invocato la operacién que ‘delmédulo que ha encontraco el err: mientras intentaba realizarla. A medida que os pro- ‘gramas crecen,y especialmente cuamo se hace un amplio uso de la bibiotecas, adquie: ‘en imporancia los estindares para nanejar los errores (0, ms en genera, tas «circuns- tancias excepcionales») ‘Yolvamos al ejemplo de Stack. ;Qué habria que hacer cuando intentamos aplicar ‘push () a demisiados caracteres? Quen ha escrito el médulo Stack ne sabe qué elo que ‘estar le gustaria que se hiciera en ese caso, y el usuario no puede deectar el proble mma de manera continuads (3 pudiera no se produciria desbordamiento), La soluciin esti en que el programador de Stack detcte el desbordamientc y se lo comunique al usuario {de:conocido), El usuario podri entonces emprender la accién apropiada, Por ejemplo: namespace Stack { HV iterfaz void push (char) ; char pop () class Overflow ( ): rio que representa las excepciones dedesboriamiento A Jetectar un desbordammierto, Stack: :push () puede invecar el cédigo de manejo de &x- cepsiones; es deci, «lanzar una excepcidn Overflow: void Stack: :push (char e) if (top == max_size) throw Overflow ( meter ¢ ) Elahrow transfiere el control un manejador ce las exczpeiones de tipo Stack: : Overflow ‘en alguna funcién que direca o indiectamente ha llamado Stack: :pash(). Paraello, la implemensacion desenredar: la pila ce Mamadss de funcién para volver context de esa lanada. Asi pues, throw acta come un return multin vel. Por ejemplo: void f() ”. ly (1 excepciones tratadas par el manejador definido mas adelante while (true) Stack: :push \e") ; ) catch (Stack: : Overflow) { 1 vaya: desbordamiento de ke pila: emprender ta cccién adecuada ) u ) El buck while intentaré iterarindefinidamente, Pos tanto, se itroduciré la eléusuta eateh {gue proporcione un manejador para Stack: Overflow despus de que alguta lama le ‘Stack: :push |) cause un throw. El uio de mecanismos de manejo de excepciones puede hacer el manejo de errores mis regulary legible. Véase §8.3 y el capitulo 14 para an andlisis mas pormenoniado, 2.5 Abstraccién de datos La mocularidad es un aspecto fundamertal de todos los bueeos progeamas grandes. Se ‘mantiere como centro de ateacién en toéos los comentarios sabre diseio tealizador a lo largo de este libro. Sin embargo, los médulos, tal como se han descrito anteriorments, no Son suficientes para expresar cor limpieza sistemas complejos. Voy a presentar ahora Ina form de usar los médulos que froporciona una fer‘na de ipo: definidos por el usuario ‘8 contnuacién mostraré cémo superar algunos problemas de ese planteamieato definive, do ditecament tipos definidos por el usiaro, 2.8.1 Médulos de definicin de tipos {La programacién con médulos conduce a una centralizaciéa detodos los dates de un {po ‘ajo e control de un médulo gestor de es tipo. Si por ejempl>, quisigramos muchas pi as —en ugar de Io nica que proporciota el médulo Stack an-erior— podriamos detnit lun gestor de pilas con una interfaz como Ia siguiente: nazespace Stack ( struct Rep, W defnicién de ta estructare de ta pila en otro lug ‘ypedef Repistack; ack create) ; MW hacer wna nea pita Youd destroy stacks); Mf borsars push (sacks, chare!; i meter cen s shar pop stacks); Wf sacar de s La dectaacién siract Rep: ize que Rep esel mmbre de un ip, pe de la ence dltipo para dsp (87) La declanacién: a nt ‘ypedef Reps. stack de nomive stack na tferencia« Rep» (detalles n 55), La ies esque une ia se aes fen por su Slack sarkyqueton dens tale exanoclton pata os sarion vn Sigch sack aca en gran wedi comm uot varase de wn Upe pede struct Ba pop) void : Stack : :stack sI = Stack : :e-eate () ; MW kacer una nueve pila Swot tack 2 = Stack: ceate(); hace oma nev il Stock: :puch 1.2) Sick push (22.05 (Suck: pop st I (Stack: pop (2 Stack: destroys) Stack: sderay 32; ‘e") throw Bad_pop () = ‘k" throw Bad pop) mos impementar esta Stack de diversas femas. Es importante qu los ution no aster co ace Sore ue mane ameter i ees a thuro no Te afeta que misotos dcidamos eimplenenar Stack : 2 mplementconpodia pensar memoria pas unt oanaseresetaciones de play deja quack creae()dienanaefenin aa colada Se deiroy) Foie marcr enone una epresenacign «nc utzadse de modo gi Stack: create peer reicaa amespce Steck ( M repreentacin const int mas. sice = 200; struct Pep | har ¥ max see > inp: Unimero mésximo de plas Urepresertasiones de pila preasignadas used (i) es verdalerosi stacks 1) esd en wo const int max = 16 Rep stacks max. bool used {max} : , void Stack: :push (stack s, cher €) { /* comprobe desbordaniento de sy meter ev char Stack: :pop stack 5) { /+ comprovar subdesbo-damiento de s y sacar */ ) Stack: :stack Stack :sereate ) fi Welegir Rep no sade, marcarh como wiada, inicalizerla y devolver referencia aella void Stack: :destroy (tacks) -/* marcir s como nousada */ ) {Lo que hemos hecho es envolver un conjunto de funciones Je interfaz.en toro al tipo de |e remesentaciée, Cmo se comport el «tipo de la pilz» resultante deperderi en parte de ‘cémno Jefinamos esas funciones de intefaz, en parte de <6mo presentemos el tip de la ‘epresentacicn a fos usuarios de Stacks y en parte del disefio el tipo de la tepresenac dn ‘A menudo lo anterior esti Iejos de sz dine Un problema importante es que la pre- Sentaci6n al usuario de stipes falsos» como el descrto fuede Vatiar considerablements pesh 0. "Cuande el objet sale de su dmbito dea de exist: es entonces culo se Hama al destruct, detost) atone als misma reps en cuanto nombre, mbit, signin, do- fe tipo Stack se 93 mb ona eller que un tipo predfind como Hn 0 ohar i eetacote, las funconesticmoro push ¥ pop () deben estar también cfinidas cn gin I: void Sack: :push (char €) : if (top == max_size) throw Overflow ; 000 ewer pa rer ; ce “fos, en contraste con los tipos 1 ge como comple Sct se deominas iat coco, en court srenans enor que ls wterae ash ms completamente wari de ls deta dela implementacn, 25.4 Tipos abstractos Bn la transci6y de Stack como «tipo Falso» implementado por un médulo (§2.5.1) a tipo corecto (82.5.3) se ha perdido una propiedad. La implementacin no asté desacoplada de Ic iaterfaz de usvaio, ino que forma parte de le que se incluiria en un fragmento de pro- ‘gama que usara Stacks, La representacion es privada y, pr tanto, accesible s6loa través 42 fas funciones miembro, peo ests presente. Sicambia deforma sigrificativa, el usuario tendri que volver a compar, Este es precio que se page por tener tipas concntos que Se comporten exactamente igual que tipos precefinidas, En especial, no poderras tener ‘var ables locales auténticas de un tipo sin conocer el tamaf de la representacign del tipo Para tins cue no cambian a menado, y cuado las variables locales proporcionan la rcesara clariad y eficiencia, lo anterior es ac»ptable y a menudo idéneo. Sin embargo. sieseames aislar completamente alos usuaro: de una pia de los cambios en st imple: rmeatacién. esta dltima Stack es insuficiente La solucién 2sté entonces en desacoplar Ia itterfaz de la represemtacién y renunciar a las variables locales auténtiess. En primer lugar, definimos la interfaz lass Stack ( public class Cnderflow Mwsada como escepion less Overflow 1 wsada como excepcién virtuai void push \char €) 0; virtuai char pop () = 0; La palabra virtual signifi igifiea «que pucie ser reéetin vadade ésta» en Simula y C+. Una ease taci6a para in interfaz Stack, La cuiosa sintaxis ‘oid f ‘Stacks s ref) ‘ Srefpush ('') ; W (s-refpop |)! "ey throw bad. stack) ; bari etn como usaf) I inte Stak en comp cimlemeniacion, Ura cae que proprciona I ntsn so it menu po pein 0 ert de expt, a plement podria const de Stack ve ha quid fuera dea iter Sacks? 086M tse cone cas Array stack ‘char’ p int matic; inttay; pibie Array. Stok int) “Array stack) void push char e) thar pop); , ipnorancia de los deal as diversas clases se eno- mublie Stack | 1 Arzay_ stack implementa Stack Aqui, «:publie» puede leerse como «s is deriva des, simplemeatan yes un sbtip des sg am nn come)" St rnd campo cea dk inp Igunaoira funcon haga un objeto sobre cea na vod g() Array stack a (200) Pnesto que fo sabe nada d Array_stacks, sino que slo coroce a interfa Stack, fen- Sualmente bien para una implementacion diferente de ana Stack. Por ejempls lacs List stack + public Stack { 1) List stacd implementa Stack Btccher ole a in ss ‘Mista de caracteres(bélioteca estindar) ($373) Hist_stack () ( void push (char ©) ( lepush frome) ; | char pop ( he char List stack: :pop () MW obtensr primer elemento Welininar priner rlemento ‘char x = lefront(): le.pop front); returns ) [Aguila representacin es una lista deearacteres l_push front (e) aftade e como primer einento de le, la llamada fe pop_frort() elimina el primer elemento y Infront() deno- tacel primer elerient de Fe {Una funcién puece crear una List_gack y hacer que f() la use void ‘ List_stack ts; fils) > 55 Funciones virtuales {én se resueve la Hamada s_setpyp () en +) para la definicién de funcién sdecua- 440? Cuando f) es Hamada desde h debe ser llamade List stack pop). Cuando f ts lemada desde g(), debe se lamach Array_stack:: pop () Para lograr esta resclucidn, un oxjeto Stack dete contener inforracidn que indique la “unci6n que debe ser llamada cen empo de ejecucién, Una écnica de implemenkacién habi ual es que el zompilador con- vert [a Hamada de una funciGn virteal en un indice ce ura tabla de punteros a funcio. nes. Esa tabla 2 denoming habitualnente «tabla de funcioxes virtuales» 0, sencillamen- te, nb. Cada wa de las clases con furciones virtuales tiene una vib! propia que identifica ss funciones virtuales. Se puede representa gréficamente asi Objet Arey stack: il | =[ Airey stack “pak | p — —— mar sce Ms Arey stack pon) oo “ Objeto List stack: a >| dist_stack : :push () eS ee [it stack 909) Las ‘unciones de ab pemiten aul obj sea sad sree an cand trata dsibcin des dato an desomoido are autor lama, Todo leque ete necesita connce ela losin dea len a Stack y adie ro para cudafincion vitual Este mcaninmo de laa vats! eye hac eenllent tan fete como emecansme de =llanada de unin no. Su eos en cuanto espe 0 un puten en cata objeto den clase con FncnesWituales mds wna WE para cada de as ines 2.6 Programacién orientada a objetos {is abitraccida ds datos es fundamental para el teen disefo y se mantendt’ como centro de ateacin del cise ao largo del presente lib. Sin emarg, los tipos defini por ¢1 usnnrio no sor en si mismos suficientemente flexibles pana atender nuesras necenin des. En este apantad se va a plantear primero ur problema con tipos de datos sencling Aefinidos por el usuario y continuacién se va a mestrar eémcresolverlo usando jerununy de cl 2.6.1 Problemas de los tipos coneretes ‘Un tipo conereto como un stipe falso» definido por medio d+ un médul, es una especie de cae negra. Ura vez definida esa caja negra, r0 interaclia realmente con el rete del Programa. No hay manera de aduptaria nuevos Lios sino es modificando au definisin {gamnos por el morrento que ese sistema tiene que seportarcircelos,iringulos y cuadaden Supongamos tumién que tenemrs tass Punto /* .. */ ) lass Color /* .. */ ) /* y *fespecificas,respectivamente, el comienzo y el final de un comentario, Esta nota ci6n se puede usar para comentarios de varias liness y para comentarios que lermingn sn tes del inal de uns linea odr‘amos defi una forma ast ‘eum Variedsd { circulo, triangulo, cuadredo }; 1 enumeracién ($4.8) less Forma ( Varieded ¥ Punto censo; Color cot; 7 publi void dit () ‘oid girar\int) ; y ) El scampo del tpo> k es necesario para permitic que operaciones como dibwjar () y gl ‘rar determinen d: qué forma setrata (ea an lenguse serene a Pascal, hebria que ve lun registo variante con etiqueta A). La funcién dibwar () se definiria asi void Forma: -dibujar |) MW canpo del tipo W dibaian un efrculo break: case rongalo: Mibu un igo freak: uadrado: case Maja wn cua break: ) : los tipos de xo sn bolo Func como dar) sen ae sone asn Ws Hs de 2s qe hay, En conserve, el eg par lui Funcin seman se cada dy wad? una nueva forma al sistema. S: definimos una forms Seip i" que Trisinary (posblemente) modifica das Tas oeracienes con las forms. No pademos cat (ema nace stn sistema menos gu tenga cso a 0 ‘ons rs sas operaciones. D it rafla «tocar el eddigo de to- jones, Dado es aad una forms nev ap eonpengeree eytiye eeineio eat cee rp et sducin potencies ene digo gue mane ax dems formas (anges). Las posit de pesmi ema cs sn ie yea po ee Sad de us (al menos pate de) su epresentacin ence en Ia estou Se tanato jo ue presenta deste n dt tne gener forma 2162 Jeraruis de clases sums blens et en que no distin ent is propiedad generals eta is for pcs dec umn forma ine on cola, pede Shere esters popes en i pce forma an sel a fone ie ee a, ado yoru Ahn diode eww, er). La expen eet incon apres too hu dene ama ns tn Low nn co ait Cints ue permite expreary unr eta Gstneidnseportanprogranacién oad Obj Lon dems lengua nl sport - el |mecanisma de herencia (tomade por C++ ce Simula) proporciona una ae a prim: aga, eapeciicames una clase que defn: las propisdades greats de da fos class Forma Pusto centro: Color eat; u public: Punto donde) (return cenvo void mever (Punto hacia) | centro - hacia; !* . */ dibujar() o: iar int angulo\ ‘Come en el :ipo abstracto Stack de §25.4 las funciones paca las que se puede defini la interfiz de mada —pero 2n as que a implementaciGn no puede ser definda today ia son wrtual. En particular, ls funciones dibujar() y girar( "se pueden defini se para Formas especificas, por lo que son declradas virtua Data esta definicién, podemos escribir funciones generals que manipulen vecicres @ punteros a fermas wid girar_todo(vector« v, intengulo) ¥ girar los elementos dev ‘ingulo grados Sor (ints = 0; icvsizes) 7 +4) v1) ~ >girarangulo) ; Para defini una forma concreta, debemcs decir qu2 es una foamy especificar sus rropie merelas (incluidas ls funciones vitals) lass Cireulo : public Forma ( 1 int radio; public: void dibugjar() (1. *f) void girar int) () 1 i le funcidn aula h En Ct se dice que la clase Cizeulo es devivada de la clase Forma y se dics que la clase Formas une base dela clase Cireulo. Una terminologta alernativa lama a Circulo y Forma subclase y superclase, respectivimente, Se dice que b clase derivata herede lox ‘miembros de su clase base, por io que eluso de clases base y cerivadas se denomina hubi tualmeate herencia El puradigma de programecion es: [Beeld aut clases te desean | Proporcionar un conjunto completo de operaciones vara cada clase: Lhacer explicitos los aspect de la herencia. | (Cuan no existem aspectos comunes es suficiente a abstraccin de datos. La canta de ‘aspectos comunes entre os tipos que se pasde aprorechar usande la herenciaylasfunccnes Virtucles es la prueda defintiva de la apliabilidad san problema de la programaciGn ene {ada a cbjetos. En éreas como los grficos interativos existe :laramente un enorme itn bite Far la programacién orientada a objetos. En ctras, como los tiposaritmeticos elish £08 y Ics célculos basados en ellos, aparentemente class Stack 1 Tp: int max_sice int op: public ‘class Underflow |) class Overfiow ( ) Stack int |; consirusor Stack’); fi destrucor void push (P) ; T pop): hy 1 prefijo template class T> hace deT un parimetro de Iadectaracién ala que sirve de Peffo. : [Lis functones miembro se podefandefinir de forma similar femplate void Stack: :push\T ¢) {Yop == max sie) throw Overflow () : (tap) =e: {op = top +1 } ‘emplate T Stack pop \) (op top = top ~ return ¥ (top) ; 0) throw Underflow () : Dads estas definiciones, pedemos usa pilas como las siguientes Stack-se ; U pila e caracieres 1 pila de nimeras compejos 1 pila de lista de entero: sepush (e") ; ¥ (sepop() ‘= ‘e’) throw Bed pop) Sseplx push (complex (1,2) ) : 1 isetepen = complex 1.2) throw Bad pop: De mao similar podemos defi ists, vectors, mapas es dee, ays ascites elec como plantas. Una case qe contine ara cles de elements de agua tng se denomina habtalmente late contendoro strpemetecomtncton spats son un mecaismo en tempo de compl por lo US no po ine coste de tiempo de ejecucién en relacién con el «cédigo escrito a mano». - 2.72 Algoritmos genéricos Laoteca estndar C++ roporciona divers conenedres ls usarcs pueden es eros say (cates 31718). pes. nex encomans son sue paren i cate paadigma cela progmacion gxiia un vermis po parame sleorines Por comenetrsQuerersox por eepin lsc copia} tanta seer tate sinter qe eri uncones set) ,eapy()) sare) prscacotenode Ale {empo, no quremes conver aun estictra de datos erect scepads pr ue tee ca fanein de dasiiaton. fn consecuni, tenemos eu enon one frees pene za dedfininocstrosconenedores a 0s perma mips une de le Sa acute es tpo de conten e Un panteamino, el adopado para ln conteneores ys lgoritmos no cumércos ea la iieca endar Crs (318 capt 18) cams et cone ea la wea dese uenciny manpularecsencas por meta deers \Veamos una representaciGn gréficade la nocicn de secue ia ymienz0 es lle ae ac] ed ‘Una wecuencia tene un comienzo y ut final. Un erador se refiee a un elemento y pro wr ona operaién que hace que literader ze refera& siguiente slemento de la se- rec ald ona Secuencia em fradce ques flee 4 un element situado mis Steet dltimo de Ta secuencia, La repesentacin fisica det Final» puede ser un elemen- ADeentnela, pero no tiene por qué sez, En residad, lo importante es que esta nociGn de ‘eencia cubre una ampli sariedad ce represenaciones, incluidas lists y arrays. Neecsitamosalgina notacn estinlar para operaciones como waceader a un elemento por nedio deur iterador» y shacer que el iterador se refers al elemento siguiente», Las Fisitiidades obvias (una vez que se t2ne la dea son war el operador Je desrefeencia * Para ndicar accede: a un elemento par medio de un iterdor>y el operader de incremento pura inicarshacer que el iteradorse refien al elementa siguiente» -Feiendo en cuenta lo anterior, pocemos escribir e6igo sh template da al zompitador la insteveeidn de que incluva tas declare ciotes de los recursos estindar de EJS que se encuentran en fostream. Sin esas desleracio- tes, la expresién std: :cout << “Hola, mundo! \e" no tendria sentido. El operador << («poner en») escribe su segundo argumento some st Primer argumento, En este caso, se esribe el literal de cadena “Hola, mando !\" cn el ‘jo de sala estindar std: scout, Un literal de cadena es una secuencia de caraciers ro {eida por comillas dobles. Er un literal de cadera, el carécter de barra invertda \seguido de ctro caricter denota un nico caricter especial. En este e880, \es el cardcter de salto de Tinea, de modo que los catacteres escritos son Hola, mundo’, seguidos de ur salto de Ynea i 3.3 El espacio de nombres de la biblioteca estindar Labibliotees estindar esta definida eu un espacio de nombres (§2.4, §82) llamade sid. Es or esta razén por Ia que he escrito std: -cowe, er lugar de s6lo cout. He indicado expi lamente que se use standard cout, y to otra cout Todos los recursos de biblioteca e:tindar sor proporcionados por medic de alguta c bbecera estardar semejante a ciastreem >. Por siemplo: ee de programa del libro, el Tetor debe inc las cabecerasadecuadas(enuteradas 34 Salida La biblioteca de lujos de erteada y salida define la sada para todos Tos tipos predeint os, Ademas, es facil deinir la sala de un tipo definido por el usuario. Por defecto, los valores de sada & cout son convertilos en una secuencia de caracteres. Por ejemelo, void f() cout << 10; ‘olocard el earicier F seguido por el caricter 9 en el flajo de salida estindar. También to Ici void (g) inti =10; ) Se puede combinar salida de tipos diferentes de fa forma evidemte void hint i) ‘ cout << "el valor de ies *; cout << Wn"; 1 Si tiene el valor 20, ta sida ser el vaior de ies 10 Une constante de caricteres un caréctr encerrado entre comillas sencilla. Observe el ec {cr gue una constant de caricter se aresenta en la slida como un cardeter y no como en valcr numérice. Por ejemplo, void k() cout << cout << 'b dard como salica abe. ‘La gente se cansa en seguida de reptir el nombre dl lo de salida evando dig ale ‘aida elementos relacionados entre si Por suerte, el resultado de una expeesidn ce sada puece ser ullizado para sada posterores. Por ejemplo: void hint #) cout << “el valor dei es * > dete-mis ‘ceptada y cules el destino de la operacin de entrada, Por ejemple. void $09 in cin >i; tee un emtero.ai doxbke d; cin >*d;—// lee un nimero en coms flotanie de doble precision ad ) een némero tal camo 1234, de Ia enrada estindar a le variable entera iy un nimero en ‘con Motante tal como 32.345, a la variable en coma feante de dedte precision d. “Zeamos an ejemplo que realiz conversione’ de pillgadas a cenimeteos y de centime {tos a pulgadai. El lector introduce un nero seguido po" un caricter que indica 'a unis dad de medida centimetres o pulgadas. El programa da el valor correspondiente on la otra nia: int main{ t const oat factor =2.54; 111 pulgcda es iguasa 2.54 em Sloat x, in, em; char es =O; out << “introducirlongitud cin >>; ler un mimero en coma flotante cin eh; fh leer un sufje siteh (eh) case "1's pug em = factor: break; cae te: on in = xlfactor break: defait in = em break; cout << in << ine "cam << * ema; ) ch contrasts un var con un cajunto de constants, Pca sar el sen- aera un sentences Pevk Lis cobtantesdecaso debe se asi te Char conasado mo cone Son ninguna de ls, slip: fal Noes neestio gue ae or proporcione un default. oe sum roan decatte, Ua forma choad sees bela 8 ust sing. Por cemplo: nt main ( c string st; cout << *Por favor, introduzea su nosibre vn”; eat << "Hola," << str << Si elector teclea Ia sexpuesa es Hole, Erie! Se puede leer una linea completa usando ta func getline). Por ejemplo steing str: ‘cout << "Por favor, introduzea su nonbrevw cin-getine \cin, sr) cout << "Hola, * << str << "s\n"; , Can este programa, la entrada Eric Bloodaxe Ja sada deseada Hole, Eric Bloodaxe: 4s cade stndar ine a bon propia de expand par come loge pon ‘amos enellas, de modo que si intreducimos un par de megabytes de puntos y eomas, el Programa mos devolverd plginas y péginas de puntos y coms, a menos que a nesta mi ‘uina 0 sistema operativo se ke agote antes algin recurso esencial 3.7 Contenedores ‘La computa:i6nsuele entrafar Ia crea: n de colzciones de distntas formas de obsios y {a posterior maripulacién de esas colecciones, Leer caracteres a una cadena e imprini ly «eadeaa es un ejemplo sencillo. Una clese cuya fnalidad pr ncipal es contener objeux se conoze cominmente como cortenedor. Proporcicnar los cortenedores :decuaddos pats ung tarea determinaca y soportarlos con operaciones fundamentals itiles sor pasos imporanta, ‘en la construccisn de cualquier programa Para ilustar os contenedores mas tiles de I: biblioteca esténdar, veanos un progr ‘ma sencillo pare guardar nombres y nimeros de teléfonc. Fs el tipo de pregrama para el cual hay difeenes planteamiextos que arecen¥) : vector v2 oer ” , Aigner on veewr implica copa ss eements. Ast pss, 9 ining ditenf icy? conten aa copa deca no de os eenents Baty ete Ince Cianb mn ectorcontene nachos shen, xt argnacenes iat. teen aparani cen, pion cine ane cons pohibnes iene a a co shone book pia na sen deseahle deen wi 3.2 Comprotacién de rango El vector ¢e la biblioteca estindar no proporciena conprabacién de rargo por defecto (§1€.3.). Por emp: void J, ‘ inti = phone book \1001 | number; // 100! esi fuera de rango u ) Es probable qué la inicializacién coloque alg valor aleatcrio en fen lugar de da: error Como esto no es deseable. voy a usar una aaptacidn de ecmprobacidy de rango sencilla 4 veetor, deno ninada Vee, en los captulos siguientes. Un Vee es como un veetor, salvo Dengue lanza ura excepeidn de tipo out_of rang? si un subindice ests fuera de rango. {Las técnicas para implementa tipos como Vee y para user eficazmente las excepciones seanalizanen §11.12, §8.3 yel capitulo 14. Sinenbargo, esa definicibn es suficieme para Tos ejemples de! fibro: femplate-lass T> class Vee + public ve public: Vee\) : vector!) < } Vec(in's) + veetor's) T>{ Te opesator| | (int) « return at\i): } HTeomprotado el rango ‘const Ts eperator() (inti) const ( retwra at(i);) M7 comprobado el rango {Ls operacién af() es una operacign de subindecaciGn de vector que lanza una exo-pein depo out.of range si su argumento esté fuera del rango le vector (§ 16.3.3), Volviendo a problema de eémo guar los nombres y simeros de telefono, sora po dems usar un Vee para asezurarnos 4e que se capturan les accesos fuera de tage, Poy ejerplo: Vec phone_book (1000: ; void print entry inti) /74so simple, exactame te como para vector c cout <= phone book|t).name << * * << phonebook (i).number << tn; Ur scceso fueraderango lanzaré una excepei6n que puede capturarel usuario. Por ccm void fi) ty for (inti = 0; '<10000; > catch (>ut_of range) cout << “error de rango\n' ? +) print entry (i); L apres sed lanzada, y capturadi, cuando se intents piome_book {i} con i 1000, * el usuerio no captura ese tipo de excepcién, el programa terminari de uns husera bien defini, er lugar de seguir adelumte 0 fallr de una manera no definida, Un. mena de teducir a mitimo las sopresas procedentes de las excepciones es usar un mai | com un blague-try come cuerpo: . ‘nt main nt MW oblige del lector atch (out of range) ( err << “error de rango\n" ; (atch... | ‘err << “lanzada exeepcion devconocida\n ; Este roprcions mannose exesones rr def, se mod que umes captrr ana excepein se ipime tn tena oe eor en lode os diagnéstico de errores cerr (§21.2.1). . 373 sist a isc y tbo case els se abil a tat cilla. For ejemplo ee ae tay phone book nde somos vn tn edemos 2.10 accede os cemenosesands le subinderacidn Cuan oon bituamens para Tor vectors. En lugar deel, exonraramos a Uist cc clement com on Yale dado para cul apovecaroy el hecho de ie Une Pra unsecmncia, oro se desc: eb 83.8 voi print. etry (const string) ypede tty: cons erator Ld Jer tti = phone bookbegis() st (= ohone Boakend() : st) | Enoyies ls rferncia use como abrevanra 7 (ess emame) cout ccemame ca" cc ecnumber <0"; , Latsisqueda des comienza al principia de la Tita sigue avanzando hasta que se encuentra «5 egaal final, Todos los contenlores de a biblioteca estindar propereionan la fun- tones begin |) y end () que devuelven un iteradorhasts los elementos primero y siguiente limo, respestivamente ($ 6.3.2). Dado un iterador el elzmento siguiente es ++i. Dado Un iterador , el elemento al que se reere es %. No es necescrio que el usuario corozca el tipo exac:o de iterador para un contenedor cestindar. Ese tipo de iterador forma parte de Ic cefinicién del contenedory es posible re ferirse &€1 por el nombre. Cuando nonecesitamcs modificar un elemento del contenedor. ‘eens iterator «sel tipo que queremes. En caso zontrato, usamos el (po simple iterator 163.0. Es fil afadér elementos x una lst trys, lst + iterator i) void add entry i hone bookpush front(e) ; // afedv al principio phone book push back e} > // adv al final Phone bookinsert(i,e); — //aicdw antes del elemento cl que se refere 374 map Escribir e6digo para buscar un nombre en una lit de pares (nombre,nimero) es realmen: Tetetioso. Ademis, una bisqueda lineal es bastante poe eficiente pare listas que no sean ‘uy cortas. Oras estructuras de datos soportan drectamrente insercién, berrado y busque «de asados en valores, En especial, la libioteca estindar proporcions el ipe map (17.4.1) Un map es un contenedor de pares de valores. Por ejemplo: ‘map phone book; En aos contexios son conoxidos los map com arrays asociativos 0 dicionaros ‘Cuando est indexado por un valor de su primer ipo (Jewominado clave) un map de ‘ache el valor corespondiente del sequndo igo idenominado valor 0 upe mapeado). Pot plo: oid print_entry (const strings 5 i If int = phone book(s) cout << scx °° ‘Vector de tamatin variable ¢§16.3) list T> Lista doblementeenlazads +§17.2.2) ‘queve Cola 1§17.3.2) stack-T> Pila(§173.1) dequecT> Cole de dos extrenos ($172.3) priorly queve Cola clasficada por valor (517.3.31 seteT= Conjunto ($17.43) . mutiset Conjunto en el que un valor puede aparecer muchas veees ($17.44 maptey ,val> Array asaciativo ($17.4.1) ‘mutinap key, val> Mapa en el que wn valor puede aparecer muchas veces ($17.42) Los centenecores estindar se presentan en $16.2, $16.3 y el capitulo 17. Los contsaedo resse Jefinen en al espacio de rombres.tdy se presentan en Im cabecers . ist “mep>, etcéera ($16.2), os contenedresestinder y sus opeacionesbisieas est dseiados para que san si miles dood el punto de vista notacionul Adem, lon sgnifeados de las ope eioncs cequivdentes en los distntos contenedows. En gencrl, las operaciones bisica son plc besa indos los tipos de contnedores. Pr cjemplpush_Aack puede vars con ri eficesci) para sir elemenos al final de un vector. xf eomo de na ft y toes 1 comeredores tienen una funcién miembo size (} que devul-e su amero de eleneatos Fst uniformiiad notacionel y semintica permite a 1s frogramadores propere onary nuevos tipos de contenedores que se pueden user de formas ny semejantes a fos estén dar. Eemplo de ello es el vector de rargo comprobado Vee (3.7.2). En el captulc |7 rocsta emo se puede aadira la estrctura un hash, map. 2 uniformidal de la ine {faces de contenedor nos permite asimimo espesificaralzoritmos con inlependencia de los tioos individuals de contenedores 38 Algoritmos Una structura de dis, come una lstco un vectos, no es muy: itl por sf misma. Parausarla, rcoitamor operacianes para acceso Fsico tales como afk y suprimir elementos. Ade- nds, rara vez nos limitamos a almacerar objet>s en un contenedor. Los clasificamos, fos jnprmimos, extaemos subconjuntos, suprimimes elementos, buscames ebjetos, eicétera, En ennsecuenci, la biblioteca estinds” proporcioza los lgoimos mis 2onunes para con tenecores ademis de proporcionar lostipos de contenedores més frecuentes. Lo siguiente. “4 una copia de cada uno de Ios elementos tinicos por gemplo, clsifica un vector y col e vector on uns list: void fvector-Enary>s ve, list-Entry>s le ‘ sort (ve begin |) ,veend () unique copy (ve-begin |). veend |) .le.begin | ) Las slgortmos estindar se describen e1 el capituls 18, Se exoresan en tenminos de secuen, cas Je elementos (42.7.2), Una Secuencia estérepresertada por un par d iteradores que cexpecfican los elerrentos primero y siguiente al tltime. Er el ejemplo, zort() csitica Tn se-uencia devle ve.begim |) hasta -e.end () cue castalrente son todos los elementos de un vector. 1s hora de escribir, séio hay que especiiear 2 primer elemento a escribir, S.seescribe mis deun elemento, todes los elementos que sizan a ese inical sern sobres- Sidesesbames afadir los elemento: nuevos a final de un contenedo:, podfamos haber void fvector-Entry>s ve, list-Entry>é le) sort (vebegin() ,veend () ‘unique copy (ve.bepin () , vend) , back inserter (le); /adjumtar ate Un back inserter() aftade elementos a final de un comtenedor, amplianso éste pura ha catles hueco ($19.24). Los frogramacores de C agradezerda que los contenedores estin- Ahr més back inserter() eliminen ta wecesidad ce utilizar lz eesti6n de memoria explici: ta deestilo C. propensa a erores, usindo reailae () (16.3.5). Olvidarse de util ‘back inserter) al bora de adjuntar puede comucit a errcres. Por ejemplo: oid flist-Eniry>& ve, vector-Entry>s le Merry: le no es ua iterador Mal: eseribe rds allé del final 1 W sobrescribir elemenios copy ‘vedbegin () vecend ) le): copy \vebegin () ,veend () lend ()) : copy ‘vebegin (),veend |) ,lebegin 3.81 Uso de os iter ‘Cuando se encuentra por primera vez un conteredor se puden obtener unos cUntos ite ‘adores que haven reierercia a elementos utiles. begim(” y end) son los mejons cir, plo: de ello. Ademés, muchos algoritmos devuelven iteradres. Asi por ejemplo e) alge ritmo estindar find busca un valor deniro de una secuencic y dewelv> un iterador al ele. ‘meato encontrado. Usando find podem escribic una funcicn que cuen e el nimern de pas rieiynes de un careter en un siring: int count\const strings $, char ¢) string :const_ierator i-find s.begin) ,send\ tc) : intn =0; while ‘i 1= send()) ( (EA, send) 6); return n: ) El egoritmo find dewelve un iterador a la prinera apaiic én de un salor dentro dé una secuencia o el terador siguiente al final. Consideremos lo cue ocurre con una simple tla smaci de count: void f() string m = “Maria tenia un cordero® ; int a-count = count (m,'a"); ) La pimera llamada afind() encuentra la primera ‘a de Maria, As pcs, el iterador spun ta ase carécter y no x s.end () por lo que entramos en el bucle. En‘, comenzirti la ‘busqueda en I++; es decir, empezamos un cardcter después ce donde hemos enconirato la "a". Luego seguimos en el bucle hasta encontrar las otras Jos ‘a. Kecho esto, find () alearza el final y devvelve s.end (), por lo que la condiciée i =s.end ) no se cumple y salinos del buce. Li llamada d count () podria representarsegrificamente de la forma siguiente: Las flechas indiean los valores inicial,irtermedies y final del iterador & ‘Naturalmeate el algoritmo find funcignars de modo equicalente en odos los conte doresestinda:. En conseeuencia, podriamos generaizar Ia fancién count) de lam forma: ftemplatecclass C, class T>int count (const C5. v, T val) 1 mst iterator’ find wwbegin() , wend) ,val) > /ver8C.13.S bypencme C: in n= 05; while (i t= mend 0) ( lhe M/saltar después del elemnto que acabamos de encontrar 1 find (i, nend\ al; ) Esto funciona, por lo que podemos deci: void f listcompler>+ le, veeior« le, vecior-string>s ve, string s) int it ~ count (lebegin | ,eend |) ,comples (13 int i2 ~ count (ve.brgin ()e.end () “Diogenes ): int 3 = count s.begin |) Send), *°) 1 aso de ana secuencia nos permite usar count para un aay predefinido y también para ‘contar partes ce un contenedor. Por cjemplo: void ¢ (char es), imi sz) kes|st) 2); seta: del array 14 Weta de la prinera mitad del array: inti = count (ses\0 int 2 ~ count (ses\0) , ces sus), 182 Tips de iteradores {Q3€ son en realidad los iteradores? Cualquie itrador conereto es un abjeto de alain tipo ay, sin embargo, muchos tips diferentes de iteradores porque un iteador tiene cue eon- {ener Ia informacién necesaria para hacer Su rcbajo para an tipo de contenedor determi- ‘co. Estos tipos de iteradores pueden ser tan ferentes camo los contenedores las ne {2sidades especializadas que atienden. Asi por sjemplo, ur iterador de veefor es con toda rabsbilidad un puntero ordinario, porque un pantero es ua forma bsstente Fazenable de "eferie a un elemento de un vector: iterador: P a Piject vector Hie i [a| Alterrativamente, un iterador veetor pee:faimplementarse ccmo un puntero al vector iterador: (comienzo=-p, posiciin=-3) eco [P[iTe [t] [HJe PJa] El usade un teraor as hari posible ia comprobucié de rango ($19.3) 1 Uniterador de ist seria algo més cemplicade que un spe punto aun cle nemo porgue un elemento de una ista en general no save dGnde et el siguiente elements de esa lisa. Asf pues, un iterador de lista podria ser in puntero a un enlace: iterator 7 Hsu: [ena] Teatce}[eaace}“[eises]” Gee te Lo ques conn todos fos itesdre su sein nombre de ts operas Asipe ejemplo. al pear» elgoer tease obtens an fern gi he tencio sigue lament. Defra nian." clement se eee dor. realidad, uluir ee qu cimpla uni cuanto Seels so te bn tredor (69.21. le Vout ara vee nocesianonosr al pd ie dor exetfio: cal conteneor sconce sts de trae ls hace sees Ios names conencioses testo y ent serao. Por eno fat-Enty trata es el to de teralor general parm ft-mry Ra vor eno qo peccar fe Selle sobre soo se eine enti "I 3.8.3 Leradores » E/S Los iteradores son un concepto general y Util para tratar con secuencias de elementos cconterédores. Sin embargo, los contenedores no son el dice lugar donde encontao secuercias de elementos, Por ejemplo. un flujo de entrada produce una secuencia de sto es y esribimos una secuencia de valores en un Tijo de salida. En consecuencia. kx 10+ cid de iteradores se puede aplicar ala enrada y sclida Parahacer un ostream erator, hemes de especificar que f1j0 se va a usar y el tipo sotjebs esctitos en él, Poderos defiit, por ejemolo, un terador que se refiera a fj de Sali estmlar, cout: ‘ostream iteratorstring>00 (cost) efecto de la esignacién a *00 es essribir el vaor asignads en cout, Por ejemplo: int mein () “Hola, *; //signifea couce"Hola.” mundo; sign cutce’mndo’” fees oe mais uit nna at en E09 aie papain prs una ea tan sea pero lil de ta awa com un cow Mecor des csrtura rsd en mga event, sn oes Ds foma sean. ream, irator es algo que nos permit ra un ij de en anda como un conenedo de slo leurs, Nuevimnte deems expeifcar el Tj gue tee wary clipe de vaons previo iran iterator cin); Cone os ieradores deena sparc semen pares qe representan una seen Shen potion en inne erat para near el inal ela ead, EL np erator percctecoes istrean iterator-string-e0s Podriamos shors ler Hola, mundo’ desde la entrada y escibirlo de nuevo asf int mein ( string st = “ii; Mw cout ces} cc > from >> 0; obtener vombres de los archivos fuente y destino ream is frome sr\));——/Tingut steams): véose $3.5) istrcam iteratorhistogrem ; " La ecion evdente a realizar pura que cada cadena regsre su fecucncia ex wid record (strings. 5 histograms) +«; Una ver ef entrada, nos psa etre os dats gue hes copia, El ap { 4 registrar la frecuencia de “s ‘compone de una secuencia de pares (sting , int). En consecxencia, nos gustaria llamar rid print (pairstring, ints. r) ) pparacala elemento del mapa (el primer elemento de un par se lama frst y el sepundocle- mento second). El primer clemento del pur es unt const sing porquc todas las claves de ‘map sen consiantes. Asi pues, el programa prineiyal se vonviere eh pfitst << ** << rsecend << '\n"; int main() istream_terator ii (cin; ‘stream ierator-siring-eos; for eoch sit, os record) ; ‘Sor_ecch chistogram begin) ,histogramend () prt) ; } AA sefialar que no es necesario clesificar el map para obtener sal da en orden. Un map wane a | Ec ordenadossuselomentas de moo que na eras lo atraviesa ey eden erviente) fe coreg enees ar el eee eines a slgnuceralgoa eata uno dels elenentos, Af, por ejemplo, el algortiv find ($185.2) Ss riona una forma cémoda de brscarun ior espectivo. Una veriante més general Fe nvma idea bsca un eemento coe cumple un reuisits especie. Por ejemolo. po Sfaanos querer buscar cn un map el rimer valor mayor que 42. Un mep 25 una secucecia diate (elavesvaler, por lo que buv-amos en esa lists un paircconst string, int> donde Gham sea mayor que @2: ool gt42poirconst string it 7 ‘ revurn rsecond-82: void fmap-string int>s m typedef map-string int ML > find if imbegin () u i Como alternativa, podriamos contar d mimero de palabras son frecuencia superior a 42: ‘const_iterator MI: rnd () 1-42) void g (const mapstring int: m: t int 42 ~ count_if m.begin ) mend), @t_#2) : y ‘Una funcién como gr_42() .que se wa para controlar el algortm, se denomina predica- ‘o, Para cada elemento se Hama a un predicado 7 éste devuelve un valor booleane que es twad> por el algoritmo para realizar Is accion prevista. Por ejemplo, find.if() busca has- lu que su predicado devuelve trae paca indicar que se ha enzontrado un elemento de inte ris. De forma semejante, count_ift) >uenta el nimero de vaces que su predicado 2s true Li biblioteceestindar proporciona unos cuantos prediealos tiles y algunas plantillas ‘que srven para creer mis (§18.4.2) ABE Algoritmas que usan funciones miembro Nichos algoritnos aplican uaa funcign a los elementos de na secuentia, Por ejemplo, en Bsa for each ii, «0s, record) ; Mama a record () para las esdenas lelias de Ia ewrada, Amenudo trabajamos con contenecores de punteros y no: gustaria Imar a una funcién ‘nienbro del ofjeto apuntado en luge: de a una Tunci6a glcbal sobre el puntero. Ast, por emplo, podrfamos querer lamar a h funcisr miembro shape : sdraw () para cada ele Ren ode una litshape'* >. Para marsjr este sjemplo cone eto, sencil amente escribimos tna “uncién no miembro que invogue a la funci¢n miembra. Por ejemplo: void draw (Shape* p) c po>drew 6); ) void f(list-Shape*>s sh) i foreach shbegin ) ,shend() , draw): ) Genzratizando esta técnica, podemos escribir asf et ejemplor void g \ist-shape* > sh) ‘ foreach sh.begin ) ,shend\\ ,mem fun (Shape: :draw |) La plantlla mera fun) ($18.4.4.2) de la biblioteca esténder toma un puntero & una fun ign niembro ($15.5) como argumento y produce algo que peede ser llamado para an pun {ero Ia clase de! miembro. El resultado de mem fun (shape: :draw) tna un arguments shape* y devae'e lo que devuelva shape : :draw. Elmecanisme mem_fum () es importnte porque hace posible que Ios algoritmos estén dar sean usados para contesedores de objetos poliméicor. 3.8.6 Algoritmes de la biblioteca esténdar 2Quées un algositmo? Una definicién general de algoritme dice que es «un conjun fini to dereglas que da una secuencia de operaciones para resolver un conjunto especie de Problmas [y] tisne cinco caracteristicas importantes: Finitid... Defin ein. Enrata Salis... Efectividad» [Knuh, 1968, §1.1]. En el contexto de la biblioteca estinda: C+, 1un alzoritmo es an conunto de plantillas que operan sobre secuencias ds elementos Labiblioteca estandar proporciona muchos algeritmos, que se defines en el espccto de nombres std y sepresentan zn la cabecera : algunos son especial mente ities: Algunos algoritmos estandar Jor ech ( —Invocar Ta fancién para cada elemento 183.1) Find Encontar la primera aparici6n de los argunventos (18.5.2) Jind) Encontar Ia primera concordancia del presicado ($18.32) count) Contar las epariciones de un elemento ($18.53) count if) Contar las concordancias del predicado ($185.3) replace() _Sustituir un elemento por un valor nuevo ($18.6.4) replace if) Susttuir elemento que coscuerda con predicalo por valo: nuevo ($186.4) copy |) Copiar elementos ($186.1) ‘unique copy () Copiat elercentos que no son duplicados (§18.6.1) sort Clasificar elementos (§18.7.1) equal range () Encontiartcdos los elementos cor valores equivalentes ‘$18.7.2) merge() __ Fusionar secvencias clasifcadas (318.73) tmchos mis (vol capil 18), se pueden api elements de os gris, y cos (vse lc a rings 9 ara rein 3.9 Matematicas : neue en el eee numtio. Sia gu que C, C+ n0 8 dic persandopnerdamene ene A el Case hace gam ead de tata numer coy Ta bitlteca estar e ee eal 49.1 Néimeres complejos nilia de t pos de ndineros complejos que sigue las La biblioteca estindar soporta una familia de t pos d rh Teas del clase complex descritaen2.5.2, Para soportarnieros complejo en lo que los cecalares son de precisién sencilla, nimeros en coma flotante (floats. nimeros ce doble reisiGn (doubles), etcétera, la clase complex de la bisTio eca estindar es una p antilla template : template clas C, class T> complex <, int) void fcomplerfloat-t, complex ld = flesqrt to fos; Sl pow (Uifl.2) 5 ” Fara mas detalles, véase 8225. 392 Aritmética de vectores BL reetor dese-ito en 3.7.1 estaba disetado pore ser un me:anismo general para zontener valores, ser flexible y encajer en la arquitectua de contenelores, iteradores y algoritmos. Sin embargo, no soporta operaciones matemiitcas de vecteres. Afadit eas operaciones & tetor sera fei, pero su generalidad y Mlexiti dad impos bilita optinizaciones zue sue len ser consideradas esenciales para el trabajo numérico sevio. En consecuencia, la biblio tees estancar proporciona ua vector. Ikimado velarray. que es menos general ¥ més sus ‘epkible de optimizacidn pata eileule numérico template class salarray ( w. Te operator |) (size); u dM El tip size_t tipo entero sin signo que usa In implemertacin para incices de ray Lai operaciones aritméticas habituaes y las finciones metematicas mas frecuentes 2, in soportadas per valarray. Por ejemplo Yfuncién ae valor absoluo estandar de : . semplate valarray abs (const valarray< >‘) ; oid f(valerray < al, valarray a = al*+3.14,42/al ; 2 +2 al"3.14; = abs (2); doubled = a2(7) ; Ws ) Para rs detalles véase §22.4 3.9.3 Soporte numérico basic Naturaimente, la siblioteca esténdar comtiene las funciones natemsticas mis comunes como fg. pow) y cos). para tipos en coma flotante; vease §22 3. Adem, v¢ pro Porcicran clases que describen las propedades dels ties fredefinidos, eemo cl expo nente maximo de an float; véase §22.2. 3.10 Recursos de la bil {Los rezarsos que froporciona la biblioteca estindat pueden clsificarse as 1 11] Soporte bisizo del lenguaje en tiempo de ejesucién (pars asignacidn e informaciia sobre tipos en tiempo de ejecucién) véase §16.1.3, (21 La biblioteca C esténdar (com modiicaciones muy poco importantes para redwcir tinimo ls nfracciones del sistema de tipos': véase §16.1.2, [3] Cadenas y flyjos de B/S (con soporte para juegos de caracteres internacionales lo talizacida); véanse los capitulos 20 y 21 [4] Una estractra de contenedores (como vectar. list y map) y algoritmos que wsan entenedores (como transversales generales, elasificasioves y fusiones), ven ws czpitulos 16,17, 18 y 19. (5) Seporte Faracélculo numérico (nimeros complejos me vectores con operaciies stitméticss,porciones BLAS y generalizadas.y seméatica disehiada pars facility la ‘ptimizaciOm: véase el capitulo 22 El eriteo principat para incluir uaa clase en Ia biblioteca fur que la usaran cas) tok ls joteca estindar cpintescompexperas, ve piers proporcionse en amaderes de C+ (art prineipian pertes), que ps rion ek ma general que No supesiera coses signiTicativos adic onales con respeto a im er ‘in nds sencilla del mism) recurso, y que los uss simples fueran ficiles de apres: ao = Ja biblioteca estiindar C++ preporciona les cotrvturas de datos furdamentales ma a critmos fundameniaks recs, junto con Tos alrite — ‘fd lgoosfuconan cor todos fos sontensdores in sar conversions. ean deominaacorsaconalnte ST Sep. 1984] extesble ne en ar os utr cen propos lms cnenedre: lors ae se ropoionads core patel estar hae ue fanclone etamene con fos cantenelores y algoritmos estan. 4 Tipos y declaraciones No aceptes naa que no sea la perfocién. ‘Arénimo La perfeccién sélo slogra al borde del edapso. CN, Paskinson ‘Tipos — tipos fandameniales — hooleanos — caracteres — iterates de carée ter — enteros — literalesenteros — tipos en coma flotaate — lierales en coma fFotante — tamaitos — veld — enameracicnes — dzclaxaciones — nombres — ‘anbito — inicializacién — objetes — typedef — consejos — eercicio. 4.1 Tipos Cossiceremos sey) Pan que esto tenga sentido x un programa C4, os nonbre:x.y yf deben estar sdecua damemce declarados. Es deci. el programador debs espeifiar que las entidades lamadas 2.3 Fexisteny son de tips para Tos cuales = (signacién} + (Suma y () (Ulamada de funci6n, respectivamente,tenen sent. Tago nombre (idenificadon de un programa C++ uene us upo asociago a él. Exe po deterina qué operaciones © pueden aplicar al nombre (es cect la ent dad referencia- 48 porel nombre) y cémo se interpreta tales ope-aciones. Pye ejemplo, les declarasiones Sfoat x; x eS ura variable en coma fbtante iy =7, y e5 ura variable entera con valor inicial 7 oat f\int) ; 1/f es wna funcién que toma un argumenio de tipo int y 1 devuelve un minero en som flotase haran que el ejemplo tuviers sentido. Como se declra qu 3 es un int puede serssigma- 4a, usada en expresiones aritéticas, etcétera, Per otra parte, se declara que f es uns tune ida que toma un int como argumento, por lo que se la puele Hamar cado un argurwony adecuado, En este cept se presentan los tipos fundamentales (84.11) y las declaraciones (4.9) Los ejemplos se limitan a demostrar caracteristieas del enguaje: no se pretende qu he gan rade it. Los ejemplos més amplios y realstas se hun eservado para capitulos pos terioes, cuando ie haya descrito mais de C++, El presente captulo proporciona simpleneone los elementos mis elementales a partir de los que se consruyen programas C++. El lect debs conocer esos elementos, ms la texminolugia y la sintexis senilla que 10s compa fa, para poder llsvar a cabo un proyectc real en C++ y especialmente pura leer cig entre "i y *j") 0 que todos los caracteres usados para escribir Cr+ estén dis- Ponibles algunos juegos de cavacteres nacionales no cuentancos ( ), { }, 1; €C3.1) Siem [re que sea posible debemos evitar hacer hipdtesis sobre la repesentacion de objetos Esta ‘norma general se aplica incluso & los carscteres, Caca constante de carter tiene un valor entero. Por ejemplo, el valor de “b' es 98 co el juego de caracteres ASCII. Veamos un pequefo programa cue le dics al Ietor cl valor entero d+ cualquier carécter que introduzca a cout<< "el valor de" <<€ << ** es int(e) << \n La noticion int(e) del valer enero para un cariter ¢. La osibilidad de convert ait ‘char en entero suscit la pregunta de si un ehar tiene signo.o mo lo tiene, Los 256 vckres represeniados por un byte de & bits puedes intepretarse como los valores qu van de 08 255 0 como los valores que van de ~127 4 127. Por desgtacia la opcion toma pass char sin més es: definida por la mplementacién (3C.1, §C3.2). C++ proporsiona di i Pos para los cules esté defini la respuesta: signed char, que puede conte ‘imo los valores que van de -127 a 128, y unsigned char, que puede conte Afortunadamente, la diferencia importa sto pura los valores que van de # 3255. ti ian nes estn dentro de yo coves sufciente pars contener el mayor jucgo de aracteres sopotado por eliocale 431 Literales de cardcter Un literal de cardeter, denominado a menudo constante de caricter, es sn caricter ence rrado entre comillis sencilla; por ejemplo, “@* y °0". El tipo de un Titeal de carder es ‘har. Los lterales de cardcter son en realidad comstantes simblicas para el valor entero te los zaracteres del juego de caracteres de la miquina en la que se va.a ejecutar el pro- rama C++, Si, por ejemplo, el lector esté en una niiquina que usa el jwego de carsteres [ASCII el valor de “0" es 4. El uso de literals de cardcter en lugar de la notacidn deci ‘mal hace que los programas sean mas portables. Unos cuanios caracteres tienen alemis ida y el zardeter de escape, Por ejemplo, \n es J. Véase en §C.3.2 los detalles sobre los rombres estindar que usan Is barra inv tun salto de linea y \F es una tabulacién horizor caraieres de escape. Los literales de caricter extendidos ‘ienen la ferma L'ab' ,estandoel mimero de ca: racteres entrecomillados y su s gnficado definidos por la implementacion para convordar conel ipo wehar ¢. Un literal de cardcier extendido tiene el tipo wehar 44 Tipos enteros A igual que car, cada tipo entero pusde tener ves formas: int simple», signed int y lnsiened int. Adcinis os enleros pueden tener testamaos: short int, nt simple» y long int Aun long intes posible reiertse simplemente como long. De form: semejante short 5 siniimo de short int, unsigned de unsigned ity signed designed int Los tipos de encros unsigaed son idéneos para tsos en los que se tata almacenamien to como un array de bits, Cesi nunca es buena idca usar un unsigned en lugar de un int one! fin de ganar un bit mis para representar enteros postivos. Los itentos de garant- 2ar que algunos valores sean psitivos dectarandovariabes ansigned sein desbaratados habitualmente por las regs de conversion implica (§C6.1, §C.62.1. A diferencia de los char smps, losin simple tienen siempre signo. Los tpos iat con Siem ton sencillamentesinénmos mis explicites Je sus equ valentes it simples. 4.44. Literales enteros Lo lterales en eros se presentan de seatro formas: decimiles, octaes, hexadecimales y litereles de carter. Los Titerales decimales son los que se asan mas habitealmentey tc, nem el aspecto cue seria de esperar: © 1234 976 12345678901238567890 El compilador debe advert sobre los lterales demasiado lrgos para ser representados Un literal que comienza por cero segeido de x t0r) es un ximero hexadecimal (base 16) Un literal que comienza por cero segudo de ur digito es un admero acta (base 8). Por ejemplo: decimel: 0 2 a octal: 00 92 77 ona hexadecimal: Ox0 x2 Oxf 0:53 Las letras a,b, €,d,¢ y f. 0 sts equivalentes en mayuisculas. se usan para representit 10 11, 12, 13, 14 y 15, respectivamente. Los notacicnes octil y hexadecimal son de mncxima utilidad para expresar patrones de bits El uso de estas notaciones para expresar ninneros uténticos puede provocar sorpresas. Asi por ejemplo, en una maquina sn la que Un int se epresente comoun entero de 16 bits de complemento a dos Oxffff es el ntmero decimal “I. Si se hubieran usado mas bts para representar un entero, habria sido 65535, El sufijo U se puede usar para escripr explicitamente lite ales unsigned. De forms se- Imejante, se puede usar el sufijoL para seribir exalicitaniate iterates fang. AS Por elem plo, 3 es un int, 3U es un unsigned inty 3L es un long int $i no se preporciona suf. e] ompitador da aun literal entero un tip» adecuaze de aeverto con su valor y con los tae ‘mafos de enero; de la implerentacisn (§C 4) Es buena ideatimitar el uso de consntes no obvias a nes pocos iniializadores cont (85.4; o enumeredor ($4.8) bien comentados, 4.5 Tipos en coma flotante Los tipos en coms flotante representar nimeros en coma flctante. Al gual que los ente” 10s, les tipos en coma flotante pueden tener tres tsmalios: float (precisin sencilla). double (presisign dosle)y Jong double (precisén extenc:da) El sentido exarto de precisién «sencilla», wdoble» y sextendidar viene definido por lt {mplementacin, Elegir la precisin adecuada para un preblema en el gue laeleccitn de la previsin es irpportante requiere uncs conocimizntos eonselerables de edlculo de coma Alotane. Si el lector carece de esos corocimientox, busque censejo, ded que tiempo 4 ad- uiritlos © use deuble y espere que ocurta lo mejer. 4.5.1 Literales en coma Mlotarte Por dete, ere mafia esp double Tani en een, to pilador debe adver sobre literals en coma Mlotente que sor demasiado Targox pars sed representados: Vamos algunos literate en coma totam ; rccr pay 22 023 10 L200 hades 241 eco que no puede haber sco ex mao ce un Net en some Rta Por Ota gad 27 noes tele oma func sin caro comenentes Hx i eta canoer deat) sae 21 sine evn el en coma tant dep tp ini sandal stn fo F SUM26 20) 2997025 46 Tamaiios sunos aspect de Ios tipos fundamentales de C+, como el tamale de un in, vienen Aarti pra mplementaciin (§C.2). Suelo sefular ess dependencits yrecomenéar que seevten oe temen medidas para reduc impacto, ,Por qué preocaparse? Las perso serine programan en dverses sistemas o san cversos co-npiladores se preacupen mt Tho porque sim lo hacen, se ven oblgadas a perder tempo buscande y subsanando 0s uot defecion. as personas que afin no preacuparse J fa portabildad abitualmen- tener la scttud de que wel enguaje es ‘usan un nico sistema y pueden permitisse Ibgce i conpiadorinplcmenty- Poo eto deta exec de mre npradeea. i elprograms del ectr es un éxito, protablemene se leverés otcos sistemas, y alguien ten {x1 que buscar + resolver Tos problems relacionados ecn caracteristcas cependientes de Iainplemenaciin, Ademis, a menudo-es necessro comrilar los programas con otros com piladores pra ctmismo sistema, inclso es posite que na version Futura de nuestro com Pilacor prefeido haga las cosas de un modo algo Jstntoal setual Es mucho ms fécil co hover ylimitar el impacto de las deperdencias de Ia implemntacién cuanco se eseribe un programa, que itentar deshacer el embrollo mis adelante Es relativamente facil limita el impacto de las earacerfsticas del lenguaje dependien terde la implenentacidn Limitar el impacto de los recursos de biblioteca dependientes 4d sistema es riucho mis dificil, Un planteamiento es usar los recursos de la biblioteca esindar siempe: que sea posble. LL razén par proporcioner mas de un tipo ertero, mas de un tipo sin signo y més de untipo en coma flotante es permitir que el programador estéen et rango de flag ‘fez 4 = fag 99) ; 11 n> defini: 99 noestd en el sango de fig - “Lai aigncin mies por qué no hy conve sion mpl de un enero um ae” mera: la mayor arte de lo alors extros neti representa en Une eh eee a arn dertgo de valores pra una enumercin der de la ncin de ent cin en fain lenges Peal Sincmbage Tos ejempsde manipulacion de 6 ue reaeren valores stad cr del cnjunto de enumencoes pata ear ie dos denna gs histo en Cy C2 lato de un enumeacon eo ste de algun ipo ital que pueda comene rango 40 8 yg scent enos quean evamerdor so pur se epee tad coro ino coro unsigned in. Por ho sefel) pola er Tal ero mf span coor a ot efecto, es nuerecones se concen a exros pralas operaciones rt (862) Loa enumewsin ex un to defn por el usta, pr fo que los tsaros pi den defi sus pias operaciones como r+? <= pant ena ener 112g 4.9 Declaraciones Para que se pueda war un nombre (idemtficador) en un prog-ana C++ es necesario desl rarlo antes, Es deci’, debe especificarse su tipo pats informar al compilador sobre « gv€ i ntidad se referee nombre, Veamos unos ejemplos que isan la divesidad de 38 le elaracicnes char ch; sting 8: int count = 2: ‘canst double pi = 3.1415926535897932385: ‘eatern int ercor_number; ehar* name ~ *Njal™: ‘Ghar® season|) = { "spring™, “summer*, “fall’, “winter ) struct Date (int dy m,¥i 35 int day (Date* p) |< retumn peod; deuble sqrt touble) : tenplate-class ToT abs Ta) (return aD? -a:a: typedef complexshort> Point; struct User: erum Beer Carlsber, Tuborg, Uhor > namespace NS ( int a; ‘Como se puede ver en estos ejemplos, una dectaracién puede hacer més que asocia sim plemene un tipo con un nombre. La mayor parte de las decta aciones anteriores son tam bien deiniciones; 2s decir, definen tambign una entidad para el nombre al cue se retieren. Para eh, esa entided es Ia cartidad adecuada de memoria 4 usar como variable: se asigna- réesa memoria, Fara day, es la funci6n especifieada. Para la constante pi, es e valor 3.1415426538897732385. Para Date, \s entidad es un tipo mevo. Para point, es el tipo ‘ompler, de modo que point se convierteen sinérime de eomplex-short>. De las decleraciones anteriores, slo deuble sqrt (Louble) ‘extern int er-or_number stuct User fo sen ambign de‘iniciones: es deci, Inentidad 1 a que se refieren tiene que ser definida en oto lugar. Fl codigo (cuerpo) para la funci6n 1grt debe ser especificado por algun otra eclaraci6n, la memoria para ly variable int error_mumber debe ser asignada por alguna oa deslaracion de error_number y alguna otra éeelaracién del tipo User debe defini qué aspectatiene el tigo, Por ejemplo: double sqrt double d) (1%. * int error nunber = 1; seuct User 4/1 En un programa C++ tiene que haber exactamente una defin cién para caca nombre. Si embargo, puede haber muchas Jeclaraciones. Todas las decleraciones ds una entidad de- ben coinciir ene! tipo de enticad a que se refieren, Por tant, el fragmento siguiente tie- Ie dos srores: int court; int coum’; // error: redefiniciin neem tat ror number; tier short eror number; /Leror: wcongrueeia de io 1 Eten ene sigan (pra el wi de exer, véne $92) oer int erorpumber carn nt error ruber ‘Algunas defnicion:s epeifican an «alo para lis ential: que defn, Por jem strict Date (int, m, y3 inpdef comer short>potet; ineday Datep) (rern->d: ) Comat double 9h» 3.,515924895897092385, ara tps, plans, fuciones y constanes el «Jor» es permanente Par os po datos noconstarte el valor iii puede ver cambado més adlant, Por empl voit) int count = 1; char* name Don vount = ) De las éefiniciones s6lo ‘Bjarne™, Marian; cher ch steng. no espectican valores. Véanse en $4.95 y $10.42 explicacioms sobre eimo y cindo signa a ana variabb un Valor por defecto, Toda decaracion qu: especifia un valores una defines, 4.9.1 Estructura de las declaraciones Una deckracién se compone de cuatro partes: un eespecificadbr» opcional, un tipo bse, un declarador y un inicializador opcional. Salvo lasdefiniciones de funcin y espacio de nombres, las declaraciones terminan con punto y cama. Por ejemplo: - cchar* reyes = ( *Antigono”, *Seleuco". “Ptolomeo* } ; ‘Aqui el :po base es char, el declarador es *reyes (| el iniciclizador es ~ ‘Un especificador es una palabra clave inicial, ccmo virtual (§2.5.5, 12.2.6) y exten ($9.2), gue especifica algin atribulo no de tipo de lo que es de:larado, Un deslarador censta de un nomabre y, opcionalente, de algunos operadores de ded rador. Les operadorss de dectarador mis frecuentes son (§A7.1) . . purtero prefiio “const purtero constante prefiio & referencic prefio th amay fio o funcion sufijo uw eta sencillo si todos fueran prefs o sion. Sinembargo.*. | 3.) fen di Su spur so especulr er les expresiones ($62), Axi pues * es prefio.y 1 1) son cre Tox opracores de delarador sus sinculan mds que ls pes. En conssuen- ie est lex un vector de puterosaalgo y tenemos ue usar paresis para enpresar seas teinn spate a fancidn: years ejemplos en 5.1. Pac todos los dels, conse Tiree la grumatca del Apéndie A r Fra que scalar que el tipo a0 se puede dejar fuera de una declracin, Por ejemplo: ecnste=72—— Merrorsno hay tipo igelint a int) ( rewn (a>b) 2a: b; uasigned wiz // bien. ‘unsigned! es el ipo ‘unsigned int long ti: 1 bien. ‘lang’ es el tipo Tong int’ Werror: no hay tipo devuelte. En estael esténdar C+ difiere de versiones anteriores de C » C++ que permitéan les dos primeres ejemplos al considerar que int era el tipo cuardo 10 se especificaba ninguno (8.2) Esta regla Jel dnt impl'cito» ers una fuente de errores y confusion 492 Leclaracién de miltiples nombres Es posinle decara: varios nombres en una sola deelaracién, La declaraciér contiene sen- cillanete uns list de dectaradores sepzrados per eomas, Pos ejemplo, podemos declarar asf dos enteros: intx, 9; inex: my: Observ el lector cue los operadores se aplican individualmen e a cada nombre, no a nom bres contiguos de a misma declaraciGn. Por ejemplo: in p, 3: Minc* ps int ys NO ine* ix, *4) ims: int qi int (10), sp; Mim v{ 10]: ine pes Consircciones cone éstas restan legibiidad a les programas y deben ser evitadas, 493 Nombres Un mre (identicador se compone de un seven de ees ydigtos El primer ea- eter debe ser era. El caricter de subrayado _se considera una lta, CH no mpo- fe lint al nimere de caacteres de un nombre. Sin embargo. hay partes dels impkmen cine: (en especial enlazidor) que no estin taj el contr de quien escribe el comp: lado yesas partes, por desgacia,imporen a veses limites, algunos enomos de tempo de ejecacidn hacer asimismo necesario ampliar o restringir el sonjunto de caracteres acep- Lado enn identifiador. Las amplacions (por ejemplo, rermtirel eter § en ur no bee 4a lugar a paogramas no portables Las paliras clave ce C+ (Apéndice A), como {in ono. no pueden ser usadss como nombre de ana emia dfinida porelussaro. Ejem- Blos de nombres son hola este_nonbre_es_extraordinariamente largo DEFINDG foO bar uname — HorseSense vard varl CLASE clase [Bjempios de secu:ncias de caracteres que no pueden ser usadhs como identficadore> son on un loco Sys class Svar paydue — foo-bar nombre if Los nombres que 2omienzan con un guisn de subreyado estin reservados para recur es pecisles de ls implementacién y el enterno de ejeeucisn, por lo que no deben set tradey en programas de aplicaciones, ‘A Teer un srog'ama el compilador busca siempre la cadene més larga de caracteres que Podria componer an nombre, Por tanto, varf0 es un solo romore, no el nombre var segui do del nimero 10° Igualmente, elseif esun solo nombre, 20 la palabra clave else sesuidd de Ia palabra slave if Les letras mayésculas y minisculas son distites, por lo qie Count y count son tom bres diferentes, pero no es aconsejable clegir nombres qte dfieran s6lo en el uso d: las ‘aytsculas, En general, es mejor evitarlos nombres que presentan sélo pequeliasdiferen and seccida de e6digo Imitada por un par { ) dee un nombre en un bogue pued: ocultar uaa declarac6n en el blogue que lo inchu- fiead> anterior. Por ejemplo int 1+ slobal void 0) "inex: 17+ local outa a x glotal reli Wasignar a.xlocal intx; calla primera toa ; 322; Masignar a le segunda : local a3; asignar a te primera 3 tocal } ints p= sx; omar ta dveccion de lax gloat Esineitable ocultar nombres cuando sescriben jrogranis grandes, Sin embargo, ut lector humeno puede ficilmente ro darse cuenta de que un nombre ha sido ocultado. Como son ‘eoresreativamente raros. pueden se" muy dificiles de encontrar. En consecuen-ia, hay ‘ue ninimizar Ia ocultacién de nombres. Usar nombres como iy x para variables globa: Jes o para variables locales er una furciGn grande es un» forma de buscane problemas _glebal oculio usande el operador de resoluci6n de im Esposible referive a un n bio +, Por ejemplo inex: void f2\) t intx=1; ocular x gobat sn=2; Masignar a xglobal } No hy forma de ussr un nombre local oculto, El mbito de un sombre comienca 2n el puste donde se declara es devi, después del ‘declarador completo y antes del inicializador. Eso implica que un nombve se puede usar 0 para especificar su propio valer inicial. Por ejemplo- intx =x: 7 perverso:inicializar econ su prepio valor (no inicializado) ben compilader advert si se No strata de algo ilegl, sno simplenente esi n S919). ‘st ma variable antes de haber sido fjada ¢véase tam Esposible usir un solo nombre pars referrse 4 dos objets diferen Utlizar el operador : +. Por ejemplo: intx = 11: void f4() U perverse: int y = usar x global: y = 11 int’s = 22; yan W usar x local: y = 22 ) Los mmbres de argument de nce consicran delrdos en te mis esa cad Jen deinen de a fui, po fo que voi 5 (nt) ins: error es unemor ge defi dos vce en el mismo mbit Hacer que ex sexu ne] peri capturar una equvocacn stl y basta frecueate 4.9 Inicializacion a Si se especifica tn iniializador para un objeto, ex iniciaizador determina el vaorivcial del objeto. Si nose especifica inicalizador, un opjeto estitico local (§7.12, $10.24), de espace de nombves (8.2) 0 global ($49.4) (demminadosctetivamente aber nig os) s+ inicaliza a 0 del tipo apropiado, Por ejemalo ita; W significa “int a= 0" doubled; // significa “double d = 0.02" 1 Las veriables lociles (denominadas a veces objetcs automiti‘os) y los abjetos ereedes en la zon de memoria libre (a veces denominados abjetos dindnicos u objetes de monticu: 10) no se inicializan por defecto, Por ejemplo: void f) intx; —//-xno tiene un valer bien defiido y. Los miembros de arrays y estructuras son inicialsados 0 no por defecto dependicids de siel aay o estructura es estitico. Los tipos defir dos por el usuario pueden tener {da inicalizacisn sor defecto ($104.2), [Losobjetos ms complicados requieren mas de an valor como iniializador, Esty es mie ‘nejads por lista de inicializadores delimitadas pot { y } para la inicializacisn al eatlo C de arteys (§5.2.11y estructuras ($5.7). Pura tipos cefinides por el usutio con cousir¥o- res se ian lisias ie argumentos al estilo de las fimciones ($25.2, §10.2.3), Oberve el cor que un paréxtesis vicio () enuna declarscidn significa siempre cin» #§7.1). Por ejemplo: intal} = (1,2)1 Minicializador de crmay Pointz(1. 2); Minicialicador de enti funcién (nicializacion por constructor) int fi Wéeclaracion de fineion 49.6 Objecos y valores-1 pademos asignar y usar «variables» que no tienes nombre, y también es posible aignar a txpesiones de especto extra (por emplo, *p a=10)=7]. En consecuencia, es neces tte nombre para «algo que esti en la memoria». Esta es la nocién mas sencilla y fun. ‘Jomental de objeto, Es decit, un objeto es una zona de almacenamiento contigua, un va- antes unaexpresion que se refiere a en objeto El érmino valor. se acuf6 originalmente tun dl significado de «algo qte puedeesta a I iquierea de una asignaciSn». Sin emba- fer ap todos ls valores! se pueden usr ala izquisrda de una asignaci un valor-1se pu erderir auna 2onstamte ($55), Un valorl que ro ha sido declarado eomst se densmina a imsnido vaior-! modificable Esta nocién de objeto, sercilla y de bajo nivel, no dzbe ser cenfindida con la nociGn ce objeto de clase y otjeto de tipe polimértico ($154.3, ‘A menos que el prograniador especifique oira cosa (§7.1.2, §10.4.8), un objets decta- radon una funci6n se erea cuando se encuentra su definicién y se éestruye cuando su rome sale del dmbito ($10.4.4). Tales objetos se denominan abjetos automiticos. Los dbjets declarados en smbito global ¢ de espacio de nembres, y los state declarados en fine ones oclarcs. son ereadbs ¢ inicalizados ura vez ‘aéla) y wvivens Fasta que ol pro- ‘gira termina ($104.9, Tales objetes se denorrinan objetos estticos. Las miembros no ‘estcos de una estructura, array o clase tiener s1 duraci6n determinada por el objeto del aque son miembeos Usando los operadores new y deletr se puedes erear objetos cuya daracign sea contro: lala directamente ($6.2.6) 4 opedef ‘Una declaccidn con la palabra typedef como prefjo declara un nombre avevo parsel tipo, ef Iipar de una variable nueva del tip» dado. Po ejemglo: ‘ypedef char* Pchar; Pehar pl, p2: char* p3 = pl; Un rombre detinido as, habiualmente denominado «typedef», puede ser una abreviatura ‘moda para un tipo con un nombre joco marepible. Por ejemplo, unsigned char es de~ ‘Masindo largo para usarlo muy a menulo, por le que podrianws detinir un sinénimo,uchar: ‘9pedef unsigned char vehar; Orouso deun typedef es pars limitar aun lugar Ic referenciadirecta aun tipo, Poreemplo ‘ypedef ins int32; Dpedef short intI6; pl y p2 som char* "En pls, alu, de left inguieda)y value (val). (N.de os F.) Si hora usamns int22 siempre que necesitemos un entero potencialmente largo, peckemor trailadar nuesto programa a una maquina en laque sizeoflint) sea Predefiniendo la uni ‘ca sparicion de int en nussio cédigo typedef ong int32; Pam bien y para mal los typedef son sinénimos de otros tpos y n> tipos distintos. En con seatencia, se nezclen libremente con los tipos para los qe son sin¢nimos. Quienes de. ‘sean tener tipo distintos con semnticao representacin idéaica debersvolver Ia vista hacia Tasenumeracienes ($4.8) 0 las clases (capitulo 10), 4.0) Consejos L1}Haga que bbs dmitos scan pequetos:§4.9. [2]No use el mismo nombre en wn émbito y enel émbity que To contene: 49.4 {3]Declare (slo) un nombre por decleracicn; $4.9. [4] Haga que Ios nombres frecuentes y locales sean corts,y los nomtres poco ieee ¥ mo locales mis largos:§49.3 {5} vite los mombres de aspecto parecido; $49.3. [6] Mantenga ia cohrencia en el estilo de los nombres: $49.3. {7} Bij cuidatosamente los nombres para que reflejen mis el signif'eado que fx imple rmentaciga: $49.3, 18] Use un gpedef para defini un nombre que tenga sent fo para un tipo predefiido en los casosen que el tipo predefinido usado para reperentar an valor pueda sambian 497 ‘ypede; para define sindnimos He ls tips; use enumeracione:y clases pra def- rir tipes iwevos, §4.9:7 {1O}Recuerce que toa declaracin debe especifcar un tipo (no hay «ntimpliciton: $4.91 [11 Evite suposiciones innecesarias sobre el valor numé'ico de los carateres, $43.1, 5C.621 (121 Evite supesiciones innecesarias sobre el tanafo de os enteres; $4.6. {13} Evite supcsicionesinnecesarias sobre el rargo de lost pos en coma lotante: $46 (14}Prefiea ur int sia ms aun short int oun long ints 546 (15)Prefiera ur double aun float o un long double: $4.5 (16, Prefiera los char sin més a los signed char o unsigned char: C4 {17 Evite hice: suposiciones innecesaris Sobre el tamano de los objeos: $46 8] Evite Ia artmética sin signo. $44 [19|Desconffe fe las convsiones de signed a unsigned yd: unsigned signed; sC.5.24 [20] Desconffe de las conversiones de coma flounte a even. $6.6 [21 Descontie de las consersiones a un tipo mis pequete. como ce it a char: 6.6.26 3 4.11 Ejercicios 1, 12) Haga que se jecute el program: "Hola, mundo!” (3.2). Si no sompila como est Ee (+1) Hega lp siguiente para cada una de las declaraciones de §4.9: si Ia declaracién no) es una defiicion,eseribe una definicidn paz ella. Si la declaraci6n es una defnicin, tscrba una declaracion para ella que no sca tambien ura definicién, (1,5) Escriba un programa que imprima les amaiios delos tipos fundamentals, unos fants tips de puntero y unas ciantas eruneraciones de su electidn. Use el operi- dor sizeof. (1,5) Escriba un prograns que imprima valoresenteros. Haga lo mismo para otros aracteresimp-imibles. Repita lo mismo pero tsando la potacién hexadecimal (2) gCulles son, en su sistema, los valores mayores y menores de ls tipos siguien- tes: ehar, wort, int, long, float, double, long double y ansigned, (1) Cail es el nombre Iacal mis largo que puede usar en un programa C++ ensu si tema? ;Cudl es el nombr: externe mais larga que puede usar en un programa C+ en su sistema? cHay resricciones a los caraceres que puece usar en vn nombre’ {#2) Dinuje un grafico de Tos tips entero y tundamentdes en el que un tipo spunte a dro tipo si todos los valores de primero pusden ser resresentados como valices del segundo en todas las imlementaciones confarmes al estindar. Dibujs el mismo gr Fico pu los tipos en su implemertacién pre‘erida i etras“e". 2" y los digits °0. 9" y sus Punteros, arrays y estructuras Lo sublime y lo riicalo estin a menudo tan estrechamen’e relacionados que es dficil separarlos. Tom Paine Punteros — cero — arrays — il es de cudena — punteros a arrays — cons antes — punteros y constantes — referencias —yoid> —estrucuras de daos ‘consejos — ejericis. 5. Punteros Paraun tipo T, 7+ es el tipo «puntero aT». Es cecir, una variable de ipo T* puede con- tenes la direcccin de un objeto de tipo T. Por ejemplo: char e = a char’ p= se; //p contenela direccain de ¢ ©. gxificamente: Por desgracia, Jos punteros a arrays y ios punters a funciones necesitan un comlicade int pis UW punteroa int char** ppe; 1 punteroa punters char int epilS);——Varray de 1S punterss a ins int (fp) (ehar*) ; /panteroa funcida ue toma argumento cha: devvelve int lint* fichar*);— 1/funcién que tome érgumento char* ; desuelve puntero a int ‘Véase en §4.9.1 una explicasién de la sintaxis de declaracién y en el Apéndice A la grae imaica completa La eperacin Findamental de un punsro es desseferenciar.es deci, refeit al obo a ‘que apunta el puntero. Esta operacion se denomsna también indreccién. El operadr dq desreferenciacisn es el * menario (prefijo). Por ejemplo: char ¢ = *a° char p= se! Z pcontiene la direccsin de © char €2 = =p La varable ala que apuntap ese y el vilor almacenado e1 ¢ ¢ *pasignado 3 €2 es Es posible realizar algunss operaciones aritmétcas cox punteros a clementos de eray ($5.2). Los punteros a funciones pueden ser de extremada utidad; se estudian en $7.7, ‘La implementacién de los punteros tine la fia iad de mpear directamente a ls me- anistros de direccionamien:o de la macuina en la que se eje-uta el programa, La mayor parte de las mquinas pueden direccionar un byte. Las que nc pueden, suelen tener Hard ware que extra Ins bytes de la palabras. Por el contrario, hey pocas maguinas que pe dan diteccionar directamente un bit incividual. En consecuctcia, el objeto mis poyse {que purde ser asignado de forma independiente y al que se peede apuntar usando un tipo de puncero predefnido es un char. Observe el lecicr que un eo! ocupa al menos tart es- pacio como un char ($4.6), 2ara almacenar valores menores de manera mis compara se pueder usar eperaciones ligicas (§6.2.4) 0 campos de bits en estructuras (88.1) por lo que el vslor dé SALA Cero El xr san Debi hs convo etindar C23 pede ar Bono Comsat lrg al) deca ta, pony Se pons lento lipo ec tsa deem pel conte El cee epee Aba pero scans pore pr de is tc el mano apps Nuss mignon feds tsa stacey inno qc un pro sere aun es onsheppul df unm MULE pra eset el mes Debut aaa eta campeon depen Creda Ven de uae GOEL pda meas pobemas Sel ctr gc ee gue ein NULL comin NCL posi na WULL done sect vn cosane 1 5.2 Arrays Paraus tipo 7, T size} es e tipo «array de size ‘tamato) elenentos de tipo To. Lesele> rmentosse indexar de @ a size-1. Por ejemplo: Poat v3) + A array de ts float: s901, v1) v2} ‘ehar® a{32); array de32 punteros a char: cf}. a 31 Et mimero de elementos de un array, Iimite de! array, debe ser una expresin constante EC) Sel ecorrecesita mites viable, we un reor'$371, $182). Por ejemplo: void fint i) [ 5 int v1 i): Hero: el ama de arrasno es una expresion cantante rectorsint=¥2(10); bien Los arrays multidimensionales se repssentan como arrays ce arrays. Por ejemplo: int d2(10| (20); #d2 esun array de 10 arrays de 20 enteros {Gsarla notacién de coma como se usapara los Ifnites de antay en algunos otros lenguajes Gu liga a eroresentiempo de compilicin porqus la coma (,) es un operador de se2uencia J nocesta permiido en las expresiones constanies (SC.5), Per ejemplo, pcbe el lector lo sguente: int bad 5, 2) Los arrays mulidimensionals se desriben er §C-7. Es mejor evitarls fuera del eddigo & ajo nivel ‘error: ex una espresin constente no estd permitida a coma 2.1 Inicializadores de array Un aray puede serinicializcdlo por una lista de valores, Po: ejemplo: intvd() = (1.2.3.4 char 2{) = 1a", "br, 84, 00: CCuardo se declira un array sin un tamatio espeefico pero ean una lists de inicializadores, ‘eile el tamano contando los elementos de la lista de niializadores. En consecuen: da, 1 y¥2 sonde tipo int (4) y char 4) respectivamente. 51 se especifica expliciamente ‘an timafio, es un erfor dar elementos de més en una lista de inicializadores. Por ejemplo” char ¥3 (2) drerror: denasiados inicializadores char v3) = ( °a bien Sic inicializador my proporciona tocos los elementos, se presupone 0 par los elementos ‘eetrrestantes. Por ejemplo: inty5(8) = (1,2,3,4 ss equivatente a int v5) = (1, 2,3,4,0,0,0,0) Obsrve elector que no hay asignac dn de aray que conexerde con Ia iniializacin void f) fi Metre, a0 ) Cuando el lectcr necesite asignacionesasi,debe usar un vector ($16.3) snvalarray ($22.4). Werror- ro hay asiguaciin de erray 77 Un aay de carectereso puede nivialirradecusdamente liter de cadena (85.224 5.22 Literales decadena Un liter de cadera es una secuencia de caracteres encerraca entre comillas dobies: ‘oto es una caddenc* Un literal de cadena contiene un cardcter mis de los que aparexta es finalizado por el ricter nelo "\0" co el valor 0, Por ejemplo: sizvof( ~Bole" ) =-5 El tipo de un Titeral de cacena.es el «array del fanto, *Bohr* es ds tipo const char (5) Un literal de cacena puede ser asignado a un ehar*. Esto se permite porque en defiic cones arteriores de C y C++ el tipo de un literal de cadena era char. Permitir la si cin de m literal de cadena a un ehar* garantiza que millones de lineas de C y C++ si guen siendo valida, Sin embargo, es un eror intentar modificar un Iteral de cadena por ‘medio de un puntem semejante: : voi 0) ime"o adecuado de caracteres const: por thar* p = ‘Platon" ; aid] error: asignacién a const: el resultado es no definido Esta forma de erroren general no puede ser capturaca hasta el tiempo de ejecucién y hay diferencias entre las implerentaciones en cuanto la aplicacicn de esta norma. Hacer cons antes los literales de cadena no es s6lo obvio, sino que adems permite que las implemer- faciones tagan optinizaciones signficativas en la forma en que se almacenan los liters ‘es de caiena y se accede a ellos, Si queremos una cadena con la que tengamos Ia garantia de que vamos 4 poder modifi: carla, dekemos copia los caracteres en un aray voit f() har |) p= "Zenon"; 710) = Un literal de cadena es asignado estiticamente de modo que sea seguro devolvetlo deste tuna funcisn. Por ejemplo: 1p es un array de 6 chac 1 bien comt char* mensaje, de_error inti i “ riturn “error de renga" ; La memieia que contiene error de rango no desaparecers después de tna Hamada d mensaje de_error\\ ‘memoria como uno soloes algo ee dos teres de carter ides sean alga det prin mplementcin (SC. Por senpo cont char p= *Heralio” fons ehareq = "Heratto” void a0) 4 Wp 2g) cout co uno 0 ) ose trae «i “ eC ‘resulta cefinido por laimplementacién compara las direcciones (valores de puntero) cvando se aplica a ip soot bar 1) "Lstomeni dea ara tins rie pe rena mr Wz puede ost ann coo om eae, Et ace pol repre a com Ie otter €> el cart: de encps bare inna vere (\) en ne eadena Es tal de eocewaveeses,Son mah eerste esa dees," "Por emo cout "tono aude al final de! mensaea\n* eer —~—~”—S—C a Wes ple ee un ato dein steals er na ear a Sap erie Las aden lara e pueden interrupt con espacio en lnc pars terms limpio chet dl poana, Por empl char eal} = *abedefghitinaoparstevonye= "ABCD GIIREMNDLORSTUVWXYZ> ; rr Fr r——r——=C cialisar alfa cor una sola cadena: bedfhiimnopastaswxyeABCDEFGHIJKLMNOPORSTUVANYZ" eer rr—*=“*#RE petra gy craters despues ce Por epnplo, ae *JeneOO0Munk” er eta comm "ent por fnctones dla beans ome sry (¥en 15 vee $2041 a rrrC—s~s~se=S (662.439), suposed wehars 11 ces una eadena de caracteres extendidos 5.3 Punteros en arrays Puntsros y arars estin estrechamente relacionados en C++, Se puede usar el nombre de ‘unatray como puntero a sv elemento inicial, For ejemplo: im yt) = (1,2, 3,4)5 int pl =; UZ punteroal element inicial (conversion impliciza) ies p2 int* p3 ©, grifamente: E¥(01; —/puntero al elemento inicial &x(4]:—/puntero al slemento siguiente al ditimo tp npn > GREET ‘Tomar un puntero-al elemento siguiente al dltimo de un srray esté garantizado que fun ciona. Esto es importante pars muchos algoritmos (§2.7.2, 18.3). Sin embargo, come un ppunteroasf no apunta en realidad a ningin element» del array,no se puede sat pars eer © escrtir. El resultado de tomar la direccién del elemento anterior al elemento inci es no definido y debe ser evitado, En algunis arquitecturas de méuina los arrays se asignan ‘@ menufo en los limites de direscionamiento de la méquina, por lo que «elemento atte. rior al inicial»carece simplemente de sentido, Lacenversién implicta de un nombre de array en puntero al elemento inicial del ray ‘se usa empliaments en lamacas de funciin en eddizo de estile C. Por ejemplo: extern "C* int strlen const char*); if de 7 En alganos casos el compilador puede oftimizar » descartar ana referencia de moco que ‘no hay objeto que la representeen tiempo de ejenicisn, La nicializacien de un referencia es tivial cuundo el iniializador en un valor! (un ‘objeto cuya direccién podemos tomar; vise $4.9.6, El valoe para un T «simple debe ser tun vakr-l de tipo 7S. Noes necesaric que el iniciaizador para un com Ts sean valor siquiera de "| T. En tales casos, [1] se aplica primero conversin imp tcita de tio a T si es necesario (véase §C.6%: [2] se coloca a zontinuacién e valor resultante en una variable temporal de tipo T:¥. [3] por dltimo, se usa esa variable temporal coro valor de inicilizador Considsremos: daubles dr <1; Merron: es necessro valor-l const doubles. edr = 1; // bien La inte-pretacion de esta ultima inicializacion serés daeuble temp = double 1); //ereer primero una temporal con el valor adec ‘const doubles edr = temp; / usar luego latemporal como inicializador para Una temporal creada para conte Aimbito de su referencia, ‘un inicializador de referencia persiste hasta el Final Las referencia variables y las refwencias a eonstantes se distinguen porque 1a inteo- uicisn de una temporal en cl caso dela variable 2s muy propensa a error; una asigxacis eiPrariable se convertifa en una asignacién a la —temprana en desaparecer—temporal fae problema no existe paras referexcias a corsantes las cuales son a menudo impor- fbates como argumentos de funcidn (8.1.6) Se puede usar una referercia para especficar in argumen‘o de funcién de mode que ta foreian pueda cambiar el valer de un ebjeto que 2 le pase. Por ejemplo void increment (ints aa\ {aa void f\ ints = 1 increment |x) : lx =2 ) La sendntica de! paso de argimentos 2st definica por ln de Ia inicialzaci6n, por lo que. ‘euancoes llamaco, el argunesto aa deincremeat se convierte en otro nombre para. Para ‘mantener Ialegibilidad del programa s menudo e: mejor evita las funcioaes que nodifi- ‘can sis argumentos. En lugarde ello © puede devolver un valor explicitamente desde la funcin o requerir un argurmento de puntero: int next (int p) (return p+1 void iner\int™ p) ( (4p) +47) void g\) ‘ ints = increment x) : fx =2 x emextix) x3 inert); x4 Lanctacin increment (x) no da a quizn lee el cédigo una pista de que el valor de x esti siend> modificado de la misma forma que la di s=next(t) ¢ iner (5x). En consecuen: cia, sSlo se deben usar angumentos de referencia «simples» cuando el nombre de a fun cién proporions un fuerte ndicio de cue se modifica el argumento de la-eferenc a [Las referencias se usan también pam defini funciones que se pueden utilizar into en ¢1 lado izquierde-como en el derecho de una asignacién Muchos de los usos mas intere- sante: de esto se dan en eld seo de tiprs no tevises definidos por el usuario. Coma ejem- Plo, samos a definir un ary asociativn simple. Definimos primero la estructura Pair struct Pair ( string name; double val; Laisa bisica esque un string tiene us valor en >oma flotante asociad> a €l Es fil de fr anafurcién, value), que manterga una 2stuctura de datos consistent en un Pair Psa cada cadene diferente que se le haya prescatcdo. Para abreviar la presentaci6n, se usa ‘un inplementacin muy sencilla (¢iteficiente vee pairs ; doubles value (const string’: 5) ‘mantener un conjunto de Pairs: buscar s, devolver su valor si se encuentre fen caso contrario, hacer un cir nuevo ¥ devolver el valor por defecto 0 ' Pr (inti = 0; tepairssize () ; Uf (s == pairs Pair p = (5,0; ‘pairs.push back \p); —// ahadir Pair a! final ($3.73) return pairs \pairssize() -1}.val; } Esta funcién se puede entender como un array de valores en coma flotante indexaci por ‘cadenas de caracteres, Para una cadena de argumentos dada, ralwe () encuentra el vbjeto en coma Mlotante correspondiente (no e: valor del objeto en coma flotante corresponcien te); devuelve entonces una referencia a ¢l. Por ejemplo: a) name return pairs i).val: int main() 11 contar el nimero de apariciones de cada palabra en la enteala buf) value (buf) ++ for (rector :const_iterctor p-peirs.begin |}, p'=pairs.end\) , +p) coutnamece* : "<< p ->valen" \n" , Cada vez, el bucle while lee une palabre de la cadena de entrada estindar ein a buf 63.6) ¥ actuliza el contador asociado con él. Por dltim, se imgritne la tabla resutante cor las diferemes palabras de la entrada, cada una con su nimero de apariciones. Por ejemplo cada laenreda 18 bb bb aa aa Bb aa 0a programa produciré Es fil pereccionar lo anterice yconvertitlo en un tigo de aay asoeiativo adecuado usando ‘una clase de plantilla con el operador de selecci6n |) sobrecargado ($11.8). Es incluso més ficilasar simplemente la bibliotwea estindar map ($17.4. 5.6 Puntero a void . ‘Se puede asignar un puntero de cualquier tipo de objeto a uns variable de tipo void®, puede asignar un void a otro void. se pueden hacer comparaciones de igualdad y ese ‘gualdad entre voids y se puede convertr explictamente un vaid* en otro tips, Otraspe= raciones serfan poco seguras porque el compilador no puede saber a qu tipo de ajcte Se sta realmente. En conscienca, bs demds operaciones da lugar erres en tempo spimplaién. Pan usar un Polls debemos converidoeapictamert en un pte 4 tn tpo especifco, Por ejemplo: voi nt t void" hin: comers implica inten void “py oe W error: no se puede desreferenciar void* (Teron mas puede denerent vod tpi = tie catsine-—pr|; Weomernin ep de mac ais double pal = pe: double pt = iverwr ddouble* pd} = static east-diuble*> (pr) ; iT inseguro En general, no es sezuro usar un puntiro que hi sido converido («molde=) a un tipo life rente del tipo del objeto apuatado. Pe: ejemple, una méquira podria suponer que a todos Tos double se les asigna un limite de Sytes. En ese casa, se produciria un zomportamiento cetrafo si pi apuntara a un int que no nubiera sido asigrado asf, Esta forma de conversicn esplicita de tipo es intrinsecamente nsegura y peligresa. En consecuencia, la notacién wad, statie_eas, se diseH para que fuera peligcosa El uso primavio de void” os pasar punteros a funciores a las que ne les est peemitido hacer hipstesis sobre el tipo de objeto devolver desde las funciones objetes no tipitcados, Para utilizar un objeto asi devemos usar conversion explicita de tipos. abitualmente las Funciones que ussn punteros void tienen existencia st nivel mas bajo {el sistema, donde se manipulan recusos reales de hareware, Por ejemplo: void" my alloe (size tm) + //1signar x bytes de mi monticulo especial La aparicién de void* en i dicador probable de errores de disefc. Cuando se usa para optimizacion, void” se puede cur tras una interfaz segura con respecto al tipo (813.5, 424.42) Nose puedenasignar a void* punters a funciones (877) n- punteros a miembros ($15.5). es supe'iores del sistema debe considerarse sospechosa,in- 87 Estructuras Un aay es un agregado de elementos del mismo tipo, Una struet es un

También podría gustarte