You are on page 1of 301
IddekTHBHOe Mcnosb30BaHKe C++ 55 BepHbIx COBETOB yNy4LuUTb STPYKTYpY KOs, BOLUNX NPOFDGMM =| mo) {e} o (9) a fe) SS fe) Ba fe} =] Lo a fo} Ps] 8 Cott Mavepc ae F ° = Da (or, (ou 2 [e) =, i 3 a :)} 4 Tpetbe u3qqaHne 4 a Or3biBbi O TpeTbel peAakuHn Idexrnsuoro ucnonb3oBanna C++ Kintra Cxorta Meiiepca «Idrpexmuenoe ucnore30vanue C++», mpemva pedaxyua - OTO KOHUCHTpali4a ONbITa MporpaMMUpowaHHa — TOPO ONbITa, KoTOpbIit Ges Hee NocTam- ca Obi BaM Aoporoii ueHOH. Ota KWMra - BeANKO.1eMIBIi MCTOUHUK, KOLOpEIit 4 PeKO- MeHAYIo BCeM, KTO MMMIeT Ha C++ nporbeccHona.rbHO. Tlumep yaunoo, ME, unwenep, edosanuti NAVSYSCOM, Aecmpaaun nodpasdenenue oyeweu u ucei Tperba pemaxuna ocractcs syaniei KnHroii, MOCcBANeHHOll OMY, KaK C102%KHTD BMeC- re nce gact C++ :Lis cognannta adbbek rnBHBIX H BAYTPEITe HectOCTHDIx porpasm. Eom Bi MpereityeTe Ha 10, 4TO6L1 OLITs nporpammucrom C++, ro LOJVKHBI ec POUT Lath. Spur Haeaep, xoncyzomanm, npenodasamess u asmop «Mayan C++> Tlepras peaaknna atoll Knit 6eL1a sO! U3 HCGosDUTOTO (BecbMa HCGOADUIOFO) uHCla KHHY, G1arozapA KOTOpEIM 4 OLLYTHMO NOLBICHA CBO! ypoBeHb Kak HPOteccHo- Hasbuoro paspaoTuvika NporpaMMuoro oGecneyelna. Kak u Apyrue KUHTH H3 aTOrO Pala, OHA OKasaTaCh TpakTH HO! 1 WerKoit JWI U TCI, HO pH OTOM CoseprKasa MUO- 2KCCTLO BAKHBIX COBeTOR. yKasaTenb o6bekTa, BbIZeNeHHOrO C NOMOLbIO New, Nyywe pacnonaratb B OTAENbHOM NpeANOxeHNMK - 85 [nasa 4. Mpoextuposanne nporpamo u O6paBenns| ............ 87 Mpasuno 18: Npoextupyiite untepdeiicn Tak, YTO ux Nerko 6bINo UCNONb3OBAaTb NPABUNbHO UM TPYAHO — HENPaBMNbHO........... seeseesenees 87 Npasuno 19: PaccmatpuBaiite npoexTupoBanue Knacca kak npoekTupoBaHue Tuna seeeeeee 92 Npasuno 20: Npegnouwraiire nepegayy no ccbinke Ha const Nepegaye no 3Ha4yeHuo -94 Npasuno 21: He nbitaiitecb BepHyre counky, Kora OMKHbI BePHYTb OObEKT ... Mpasuno 22: OGuaanaiire AaHHbIe-4NeHbI SakpErrsinit Npasuno 23: Npegnowntaite pdyHKuMAM-4neHaM PyHkuNN, He ABNAIOUMeCA HY YNeHaMi, HY ApysbaMu Kacca . Npasuno 24: O6basnalite pyHKunn, He ABNAIOWNeCA YNeHAaMY, korga npeo6pasoBanve TUNOB DOMKHO GbITb RpHMeHHAMO KO BCeM napamerTpan .. «109 Npasuno 25: Mloaymaiire ° noanepKe syn ‘swap, He Bo36yxAaloLen ucKMO4eHA 112 [nasa 5. Peannsayna . seeeeeeenee we . 119 Npasuno 26: OrknappiBaiite onpeneneHue mepeMeHHbnx HACKONIbKO BOSMOXHO .. 119 Npasuno 27: He anoynorpeGnaiire nempenennem Tunos . +» 122 Npasuno 28: Vs6eraiite BosBpaleHna «feckpunTopos» BHYTPEHHUX MaHHbIX : Npasuno 29: Crpemutecp, 4TO6b! nporpamma 6bina GesonacHa OTHOCUTENbHO UCKMIONeHUA ..... Npasuno 30: TwatenbHo o6AymbiBaiite ucnonb3oBaHue BCTPOCHHbIX yHKUNA Npasuno 31: YMeHbwaiiTe 3aBucuMocTH caiinoB: npv komnvnaunn . Conepxanne 128 132 139 144 [nasa 6. Hacnegosanne 4 o6peKTHO-opHeHTMpoBaHHoe npoextnposauve . Npasuno 32: Vcnonb3yite oTKpbiToe HacnegoBaHue 153 ANA MODeENUpOBAHNA OTHOWEHMA «ABIACTCH? .... 153 Npasuno 33: He cxpbipaiite yuacnefoBaHHble UMeHa.... ». 159 Npasuno 34: Pasnuyaite HacnegoBanne unTepdenica Ww Hacnefosanve peanusauun .... .. 164 Npaguno 35: Paccmortpute anbTepHaTuBbl BUPTyaNbHbIM @yHKuMso ... 171 Peanuszauna nattepxa «LWa6noHHbli MeTOg» C NOMOLAbIO MAKOMbI HeBUpTyaNnbHOrO UHTepdeiica .. Peanu3zauna nattepHa «CTpaterua» nocpe”cTsom ykasaTeneii Ha PYHKUMN..... Peanv3auua natrepHa «CTpaterua» nocpeAcTsom knacca tr::function «Knaccuyecknii» natTepH «Ctpaterus» . Pesiome Npasuno 36: Hukorga He Nepeonpefenaitte Hacnenyembie HeBUpTyanbHble PyHKUMU Npasuno 37: Huxorga He Nepeonpegensitte HacneAyemoe 3Ha4eHNe apryMeHTa PyHKUMN MO yMONYaHUN ...... Npasuno 38: Mogenupyiite oTHOwWeHVe «CogepxUT» “nn «peamusyeTCA NOCPEACTBOM> C NOMOLUbIO KOMNOSULUUY .... Npasuno 39: Npozympisaiite nopxog kK ucnoNb3soBaHUIO 172 -173 .175 .177 -178 -179 181 185 3aKpbITOrO HaCneAOBaHnA .... .. 188 Npasuno 40: Npogympisaiite nopxog, k ucnonbsoBaHUO MHOX@CTBEHHOFO HaCNeAOBAaHyE .... 193 [nasa 7. WaGnonbi n oGoGujenHoe NporpammupoBaHre ..... 200 Npasuno 41: Pas6eputecb B TOM, 4TO TakOe HEABHbIC uHTepdelicpi uv nonumopdusn Ha BTaNe KOMNUNAUU .... .. 200 Npasuno 42: Ycaoite o6a sHayeHun Kmo4eBOro CnoBa typename ... 204 Npasuno 43: Heo6xogumo 3HaTb, kak o6paujaTbca K uMeHaM B WAGNOHHbIX 6as0BbIx KNACcaX .. Mpasuno 44: Pasmeuwjaite HesaBUCcUMbI OT NapaMeTpOB KOA, BHe Wa6NOHO. .. Npasuno 45: Paspabarbiaalire waGnoxti yHKunii- 4WJIGHOB TaK, 4TOG6bI OH MPUHUMAsIN «BCE COBMECTUMBIE TUNbI» ...........4+ Npasuno 46: Onpegensiite BuyTpu wa6noHoB PyHKUNN, He ABNAIOWMeCA YNeHaM, Kora KeNaTenbHbI NPeobpasoBaHuA TUMA ve sesseee Npasuno 47: Vcnonb3yitte Knaccbi-xapakTepUCcTUKU ANA NpegoctasneHna unpopmMauunu o TuNax ve Npasuno 48: Vsyyute MetanporpammupoBanve WaGnoHoB Conepxanne Tnasa 8. Hactpoixa new u delete........ Npasuno 49: Pas6eputecb B noBegeHun O6pa6oTunka new.......... Npasuno 50: Koraa umeet CMbICn 3ameHATb New u delete ........... Npasuno 51: eee Npunareix cornaweHui npu Hanncanuu new u delete .. Npasuno 52: Ecnw sbi Hanucann ‘oneparop newc paameujennem, Hanuwute uv CooTBeTCTByIOLUMK OnepaTop delete. [napa 9. Pasnoe .. atneasenassenrsaassarseieysseysseses 2OO Npasuno 53: Oop uisire: BHUMaHnve Ha npegynpexaeHna KOMNUNATOPA........ oe Npasuno 54: (OshakombTece co crangapTHo 6uGnvoTeKon, BKmoyan TR1 . Npasnno 55: MosnaKomerece c Boost .. Npunoxeune A. 3a npegenamn «IpcextuBHoro ucnonb3soRanna C++» Npunoxenne B. CootsetcTaue npasun BO BTOPOM u TpeTbeM W3paHUAX ... BnarojapHocm Kunra «ScpdexTusxoe ncnosb30BaHHe C++» cyutectByet yxe 15 mer, a n3yyaTh C++ A Hata MpHMepHo 3a 5 eT 0 TOTO, Kak Hamucai ee. TakHM O6pa3oM, paGoTa Hat STHM MpOeKTOM BeyeTCa OKONO 20 neT. 3a 9TO BPeMA A NONyYa MO*KeTAaHHA, 3aMeyaHHa, HcipapseHHa, a HHOrAa HM OMeNOMAAIONIMe HaG.mOLeHHA OT cOTeH (THICAY?) mMozelt. Kaxkypuit m3 Hux MoMor pasBriTHio Ke OTKAsasICA OT NOMBITOK 3aMOMHHTD, re M YeMy A Hay4MICA CaM, HO OHH HCTOYHHK He MOry He YNOMAHYTb, MOCKOABKY MO.ASYIOCb HM NOCTOAHHO. ITO rpynnsi Hosocteit Usenet, 8 oco6enxoctn comp.lang.ct+.moderated n compstd.ct+. Muorne Mpapriza, IpHBexeHnHble B aTOM KHMTe (BO3MO2KHO, GOMDIKHCTBO), NOABHINCh Kak pesyAbTAaT OCMBICAeHHA TeEXHHYeCKHX Hel, O6cy>KMABLIMXCA B STHX Fpynmax. B or6ope HOBoro MaTepHala, BOWeEAWErO B TpeTbe H3AaHMe KHHTH, Mie TOMO- ran Crus J[poxapet (Steve Dewhurst). B npapyte 11 zea peanusaunn onepato- Pa operator= nyTem KonMposaHHa uv o6Mena noyepmuyta 43 3ametox Tep6a Carrepa (Herb Sutter), a nmenno “3 3anaun 13 ero kHuru «Exceptional C++» (Addison-Wesley, 2000)'. Mea o 3axsaTe pecypca kak MHMUMarn3auHH (mpapito 13) 3aMMcTBOBaHa M3 KHHTH («Best practices») wa caitte «Boost shared_ptr> (http:// boost.org/libs/ smart_ptr/shared_ptr.htm#BestPractices) 1 yrounena Ha ocHoBe MaTepHaa 3anaun 24 ua xaurn Herb Sutter «More exceptional C++» (Addison-Wesley, 2002). Ha mpa- BHO 29 MeHaA BAOXHOBHO pasBepHyToe HcCMeqOBaHKe STON TeMbI, MpeqNpHHATOE Tep6om Carrepom, p sagayax 8-19 u3 KHMTH «Exceptional C++», a Takxe B aaayax 17-23 m3 «More exceptional C++» m samayax 11-13 us ero xe kuurm Exceptional C++ Styles (Addison-Wesley, 2005). [asa A6paxamc (David Abrahams) nomor Mue JyYile NOHATD TPH MpHHUHMa rapaHTHpoBaHHa GesonacHocTH HckmoueHHit. Aqnoma HeBUpTyanbHoro HHTepielica (NVI) 5 npasnne 35 naata ua KONONKH Tep6a Carrepa ¢BuptyabHoctb» (Virtuality) p cexta6ppckom HoMepe 2001 r. »xypHana «C/C++ Users Journal». Ynomanythie B TOM %e NpaBiisie NattepHbI Mpoextuposanua <[La610nHbIt metog> (Template Method) u «Crpaterua> s3aTbi M3 KHHrn «Design Patterns»? (Addison-Wesley, 1995) Spuxa [amma (Erich Gamma), Payapaa Xenma (Richard Helm), Paneepa Jpkoncona (Ralf Johnson) u Jona Banccuaeca (John Vlissides). Viaew npuMenenna navombi NVI 5 npasnae 37 nogckasan Xenapux Io6ep (Hend- ' Wimeetca pycckuii nepenon: Cammep Fep6. Pewenne caoxstix sanas ua C++, Manarens- ckiii 10M «Bustbamc>, 2002 (IIpum. Hays. pel). 2 Vimeerca pycckuit nepenon: Martepist npoektuponatias. CII6.: Murep (IIpum. nays, pen). EA BnarogapxHoctn rik Schober). Bxnax Josuaa Cmann6epra (David Smallberg) — peanusaina muoxect- Ba, ONUCaHHaa B mpaBute 38. CrezanHoe B ripaBune 39 Ha6moAeHHe 0 TOM, ¥TO On- THMU3alMA NycToro Gas0Boro KNaCca B MPUHUMNe HeBOSMOXKHa pH MHOXKECTBEHHOM HacaeOBaHMH, 3aMMcTBOBaHO M3 KHHTH /lopuaa Bangesypare (David Vandevoorde) u Huxonaa M. J>xoccytuca (Nickolai M. Josuttis) «Templates C++» («Ia6.10HbI pastixe C++») (Addison-Wesley, 2003). Hianoxxennoe 8 npasie 42 Moe nepponauanb- HO€ NPeACTaBJIEHHE 0 TOM, AA YerO HY2XHO KMOYeBOE CI1OBO typename, OCHOBaHO Ha MoxyMente «Yacro sazapaembie Bonpoctr o C++ u Cs («C++ and C FAQ») (http:// www.comeaucomputing.com/techtalk/#typename), koroptiit nomep»xuaet Tper Komo (Greg Comeau), a JIeop 301man (Leor Zolman) nomor Mue oco3HaTb, YTO 3TO Npey- cTaBsIeHHe OWMG60uHO (Mod BHHa, a He pera). Tema npapuna 46 BosHUKsa 43 pew Zoua Caxca (Dan Saks) «Kak 3an0auTb Hosbix Apyseii>. BrickasaiHaa B KOHUe Mpa- Bla 52 Hes O TOM, YTO ECM BEI OODABIAETe OLHY BepcHilo ONepaTopa New, TO NOmK- Hb OODABATH HM BCE OCTATbHBIe, H3N02%KEeHa B 3aqaue 22 Kuuru «Exceptional C++» Tep6a Catrepa. Moe nonumanne npouecca peensuposanua Boost (cymMuposanHoe B npaBune 55) 6u10 yrouneno JlsBuaom AGpaxamcom. Bce ppriieckazaHHoe kacaeTCa TOTO, Te H OT KOTO YeEMY-TO HAYUMJICA HMeHHO 51, He- 8aBHCHMO OT TOTO, KTO NepBbIM OMyGJMKOBa MaTepHas! Ha COOTBETCTBYIOLLY!O TEMY. B Monx 3ameTKax TakxKe Cka3aHO, ITO sf HCTIONb3OBaI HHCPOpMaIIMW, Mony4eHHy10 or Cruspa Knememxa (Steve Clamage), Antoua Tpaxca (Antoine Trux), Tumotu Kuox- ca (Timothy Knox) 4 Maiixa Koon6anura (Mike Kaelbling), xora, k coxkanennio, He yTouHAerca — rae H Kak. UepHosuku nepsoro u3qaHHa mpocMatpuBanu Tom Kapaxunn (Tom Cargill), Taeun Kapoaa (Glenn Caroll), Ton Jasuc (Tony Davis), Bpaii Kepuuran (Brian Kernigan), Kax Kupman (Jak Kirman), [lyr Jiu (Doug Lea), Mouceit Jlextep (Moises Lejter), IOmxun Cantoc ma. (Eugene Santos, Jr), Qxxon Mesuyx (John Shewchuk), Jaxon Cracko (John Stasko), Bepx Crpayctpyn (Bjarne Stroustrup), Bap6apa Tuan (Barbara Tilly) u Haxcu JI. Yp6ano (Nancy L. Urbano). Kpoe Toro, NOXKeaHHA OTHOCHTETbHO yiyuWenHii, KoTOpbie 6bINM BKMOYeHI B 6oee NOsAHHE nepev3aaxua, sbickasbipann Hoxcn JI. Yp6axo, Kpuc Tpeituen (Chris Treichel), /ls- ua Kop6un (David Corbin), To Tu6cou (Paul Gibson), Crus Bunockn (Steve Vinoski), Tom Kapaxkusin (Tom Cargill), Heiin Pogec (Neil Rhodes), Tosua Bepu (David Bern), Pacc Bunbamc (Russ Williams), Po6epr Bpasun (Robert Brazile), Ayr Mopran (Doug Morgan), Yse Llreitmionnep (Uwe Steinmuller), Mapx Comep (Mark Somer), [yr Myp (Doug Moore), Jasuq CmananGepr, Ceiir Menbtuep (Seith Meltzer), Oxer Irettn6yx (Oleg Steinbuk), Hasua Manypr (David Papurt), Touu Xoucen (Tony Hansen), Murep Max-Kaycxu (Peter McCluskey), Crecbau Kyxnuuc (Stefan Kuhlins), Hosua Bpayxerr (David Braunegg), Moms Yucxonm (Paul Chisholm), Anam 3enn (Adam Zell), Knosuc Touao, Maiix Koan6anur, Harpax Kuunu (Natraj Kini), Jlapc Htoman (Lars Numan), Tper Jlyru (Greg Lutz), Tum Zpxoucon, Jou JIaxoc (John Lakos), Poaxep Cxort (Roger Scott), Ckorr Dpoman (Scott Frohman), Anan Pyxc (Alan Rooks), Po6epr Ilyp (Robert Poor), 3pux Ha- raep (Eric Nagler), Auton Tpaxc, Kaa Poyxc (Cade Roux), Uanapuxa Poxya (Chandrika Gokul), PoHau Manro6a (Randy Mangoba) u Ineun Teitrenb6aym (Glenn Teitelbaum). ee YeprHoBuKu BToOporo H3qaHHa mpopepsau: Jlepex Bocx (Derek Bosch), Tum Jbxoucou (Tim Johnson), Bpaita Kepxuran, IOxmum Kumypa (Junichi Kimura), Cxorr Jlepangoncxu (Scott Lewandowski), Jlaypa Muxaenc (Laura Michaels), Jlo- Buy Cmanaéepr (David Smallberg), Kaosuc Toxago (Clovis Tonado), Kpuc Bax Bux (Chris Van Wyk) “ Oner 3a6nyaa (Oleg Zabluda). Bonee nosaHne THpaxkH BLIUTpasH or KomMextapues Jlonuena Ureitn6epra (Daniel Steinberg), Apynpacaa Mapare (Arunprasad Marathe), Jyra Cranna (Doug Stapp), Podepra Xara (Robert Hall), Uepurna Deprioccona (Cheryl Ferguson), Tapx Bapraerra (Gary Bartlett), Maiixna Tamma (Michael Tamm), Keraanaa Bumatia (Kendall Beaman), Spuxa Harnzepa, Maxca Xaiimepuua (Max Hailperin), xo Torrmana (Joe Gottman), Puyapaa Buxca (Richard Weeks), Balextana Bonnapaa (Valentin Bonnard), 1Ou Xu (Jun He), Tuma Kunra (Tim King), Jona Maiinepa (Don Mailer), Tega Xuana (Ted Hill), Mapxa Xappucona (Marc Harrison), Maiixaa Py6unurreiiva (Michael Rubinstein), Mapxa Poaskepca (Marc Rodgers), osuaa To (David Goh), Bpextona Kynepa (Brenton Cooper), Suan Tomaca-Kpamepa (Andy Thomas-Cramer), Antowa Tpaxca, JIxkona Basra (John Walt), Bpaiiava [apo (Brian Sharon), JIMam Durunarpux (Liam Fitzpatric), Bepria Mopa (Bernd Mohr), Tappu Mu (Gary Yee), Axona O’Xanan (John O'Hanley), Bpenu Tarpecona (Brady Paterson), Kpucrodepa Ierepcona (Christopher Peterson), Denuxca Knysuaxa (Feliks Kluzniak, Usu Januery (Isi Dunetz), Kpucrobepa Kpeytun (Christopher Creutzi), Aa Kynepa (lan Cooper), Kapaa Xappuca (Carl Harris), Mapxa Cruxena (Marc Stickel), Knea Byanna (Clay Budin), Manaitotuca Maunnonyzoca (Panayotis Matsinopulos), J[osuna Cmann6ep- ta, Xep6a Carrepa, Maxo Mucaernesnya (Pajo Misljencevic), J>kynuo Arocrunu (Giulio Agostini), Dpeaepuxa Bnomxsucra (Fredrik Blonqvist), Jxummu Cuatigepa Gimmy Snyder), Bupuan Jixeucen (Byrial Jensen), Burorbaa KysbmuncKoro (Witold Kuzminski), Kasyxo6y Kypuama (Kazunobu Kuriyama), Maitxa Kpucren- cena (Michael Christensen), Mopra Auesa Tepyena ( Jorge Yanez Teruel), Mapxa J[3- suca (Mark Davis), Mapru Pa6uHosuua (Marty Rabinowitz), Apec JIara (Ares Lagae) wu Anexcanapa Megsenesa. Panuue vacTu4Hble YepHOBUKH HacTOAMero H34aHuA MpocmaTpuBasu: Bpaiian Kepuuran, Anxkenuxa Jlanmxep, Axeccu JIaunu, Pozxep IT. TMenepcen, Kpuc Ban Bux, Huxonac Crpaycrpyn u Xenapux I[o6ep. Ipocmorp nosxoro Texcta yepHo- Bika ocymecTB1amn: Jleop 301Man, Maiix Tcao, Ipux Harnep, Keune [ytuux, Jasna A6paxamc, Tepxapa Kpeysep, J[pococ Koyponnc, Bpaitan Kepnuran, Suapwo Kpumc, Baaor Maa, Suman Jjxarnxap, Esrenuit Kanenkosiu, Matix Pos, Supuxo Kappapa, Benaxamen Bepx, Jxex Puss, Crus Wupunna, Maprun Danencteat, Tumoru Kuoxc, 10x Bau, Matixn JIanuetta, Duzun J>xanept, J>xyno Bapromyyun, Matin Tonux, Axed MWepneasru, Kpuc Haypot, Huwant Murtan, [xed Commepc, Xan Mopotxp, Buxcent Manuc, Bpennon Yar, [per Jiu, Joxum Muxan, Anan Tennep, Cuaaxaprxa Cuurx, Com JIu, Cacan JauituHexkaa, Anexc Mapruu, Crus Kan, Tomac @pyurepman, Kopu Xuxc, Jasuq Cmann6epr, Tynapapgzan Kaxynanaru, Jamun Pa6- 6ann, Jxeiix Koxen, Xenapux Iy6ep, Mako Bunnana, fnenu Kenneau, Jxedpu Zl. Ongxam, Huxonac Crpaycrpyn, Marpio Busscon, Anapeit Anexcanapecky, Tum Zbxoucon, Jleon Motnioc, Tutep Aynumos u Kesnun Xennu. Ueprosuxn Hexoropsix oT- JexbuBIX Tlaparpacbos, Kpome Toro, npocmarpubam Xep6 Carrep u Atrua D. Dexep. BnarogapHoctn EI Bnarongapxoctn Tlpocmorp cbipoit (4, BosMo2xHO, HerlomHoil) pykonucu — 9TO TpyaHad pabora, a HamH4He HKECTKUX CPOKOB TONbKO AesaeT ee ele TpyAHee. A 6narovapeH BCeM, KTO BBIPaSHJI %KeNaHHe MOMOYb MHE B 9TOM. Tlpocmotp pykonucn Tem Gouee TpyzeH, eC BEI He UMeeTe MpeACTaBeEHHA O Ma- TepHate, HO He 1OJ2KHbI MponycTHuTb xu OdHoM HeTOUHOCTH, KOTOpad Morya 6bI BKpacTb- cab texct, MopasHTembHo, YTO HaXONATCA JNOAM, COrMacHble PeakTHPOBATb TeKCTBI. Kpucra Megoy6pyx 6bi1a pemakTopoM STO KHHTH H CyYMeua BbIABHTb HEMaJO OLIH- 60k, KoTOpbie MponycTHIM Bce OCTaTbHBIe. Jleop 3o1mak B xoxe peeH3HpoBaHUA PyKONMCH MpoBepH Bce NpHMeps! KoJa Ha PasIHYHbIX KOMMMAATOpAX, a 3aTeM Clea ITO elle pas, MocAe Toro Kak | BHEC H3Me- venus. Ecnu kakue-T0 OWIMOKH OCTaJIMCb, 3a HUX Hecy OTBeTCTBEHHOCTE A, a He JIeop. Kapa Burepe 4 oco6erno Tum Jxoncon Hanicas KparKuil, Ho noresHbIit TeKcT UIA O6102%KKH. Zxou Boiit, peaaxtop nepabix AByx H32aHHii STO! KHUTH, HEOCMOTPHTEAbHO CO- racusica cHoBa nopabotarp B dTOM KayecTBe. Ero nomomunua, enu3 Muxenpcen, HeHSMeHHo OTBeYaa NPHATHO! yxbIGKOH Ha MOH YacTHre H AOKY4MBEIe SameyaHHA (no Kpaiiveli Mepe, MHe Tak KaokeTCA, XOTA AMUHO A HUKOra c Heli He BcTpeyarca). JDxy- ama Haxia kon Dyaiiep (ee HatatbHUX) u Mapru Pa6unosuy (ero Ha4amHHuA) TaloKe IpHHHMas HemocpescTBeHHoe yuacTHe B Mpomecce nogroToB- KH H3gaHHa. OcbuanbHbie o6azatHocTH Baneccbt Myp 3akmo4aJMcb B MaKeTHPOBaHHH KHMH B mporpamme FrameMaker # cosnanuu texcta B cbopmare PDF, Ho ova no caoeit HHMUMaTHBe BHeCIa AOGaBreHHa B IIpumoxenve B u oropmaTuponasa ero A14 neyaTH Ha BHYTpeHHeii cropoue 06.10%kKH. Compseiir XbiorzaHy nomorsa c COcTaBJIEHHeM yKa- s3aTema. Canapa Ipoiegep u Uytu Ipacepuut orseyanu 3a an3aitH o6n0xKKn. MmMeno UytTH npuxoxusocb nepexenpibatb O610%xKKY BeAKHit pas, KaK A ToBopu «Kak HacueT Toro, YTOSEI NOMECTUT STY coTorpatpmio, HO c NomOcKOll Apyroro wBeTa?». Yanna Jlepu- KoyTH copepuleHHo BbIMOTasIacb, 3aHMMaACb MapKeTHHTOM KHHTH. B TeyeHve HeCKONbKHX MECANEB, MOKa 4 pa6oTast Hal PyKOMMCbio, TeNeBU3HOHHBIit cepuan «Badu — y6uiia paMnupos> momoras MHe CHATS cTpecc B kone 4HA. Tlorpe- Gopasoch HeMa0 YcHIMit, YTO6bI H3THaTb roBopoK Badu co crpaHviy STO! KHHTH. Karu Pug yunaa Mensa mporpammuposanu B 1971 rogy, 4 4 pad, YTO MBI OcTaeM- ca apysbamn no ceit aeHtb. Jlonanba Dpe4 Harisa Meria u Mouces Jlextepa ana pas- pa6orkn yueOHEIx MarepHasion io C++ B 1989 romy (uTo 3acTaBHaio Mena eiicmeumenono u3yynTp C++), a B 1991 romy oH MpuBreK MeHA K NpeseHTaNHH UX Ha KOMMbIOTepe Stratus. Torga cTyAeHTbI NOABHIIM MeHA HallHcaTb TO, YTO BIOCIeACTBHH CTasIo nep- Bo pegakqueli ato KHUTH. JloH Takxe NosHakomus Mena c JI>KoHOM Baiitom, KoTo- pbtit cornacunca ony6uKopatb ee. Mos xena, Hoxcn JI. Yp6aHo, nposos%KaeT NOOMpATS Moe MHcaTenbCTBO, 1axKe mocye CeMM H32aHHbIX KHHT, aqalrauMu ux aia CD u auccepranmu. Ona o6nanaet HeBEpOATHBIM Teprennem. Bes Hee 4 Obi HUKOTJa He CMOF CeNaTb TO, YTO CeNaN. Or Havana 20 KoHua Hala co6aKa Tlepcedpoxa 6bima MOHM 6eCKOpbICTHbIM KOM- naxbouom. K coxkanenmio, B Gorbmeli 4acTH MpoeKTa Ona y4acTBOBama, YK Haxo- AsACb B MorpeGarbHoli ypue. Ham ee oven He xBaTaeT. Mpengncnosne A wanucaa nepabiit papwant KHMrn «IdcpexTuBHOe HcnoAB30BaHHe C++> B 1991 r. Korga B 1997 r. Hactao BpeMa AJA BTOporo H31aHHA, A CyLMeCTBEHHO O6HOBUI MaTe- pHa , Ho, He %Kesad CMYTHTS YHTaTesei, 3HAKOMBIX C HepBbIM H31aHHeM, MOcTapavica cO- XpaHHT cymectByroutyio crpyKtypy: 48 u3 opurnHanbHbrx 50 mpaBuam ocTanicb 10 CYTH HeH3MeHHbIMu. Ec1M CpaBHHBaTb KHHTY C JOMOM, TO BTOpoe H3JaHHe 6bI10 Mo- xoxKe Ha KOCMeTHYECKHII peMOHT — nepexselixy o60en, oKpacky B Apyrue UBeTa 3a- MeHY OCBETHTEbHBIX MpHOopos. B rpeTbem u3qaHHu A pelluaca Ha ropasfo Gombulee. (Bbit MOMeHT, Kora xoTe- Jocb NlepectpouTs saHono Bce, HaYMtas c (byHmaMenta.) Sabi C++ c 1991 roma wame- HUJICA O4CHb CHABHO, H [eAH STO! KHUPH — BbIABHTS BCe HanGonee BaxHOE H Npeacta- BUTb B BU KOMMaKTHOTO COopHuKa pexoMeHganit — yoke He oTBeya HaGopy mpaBua, ccbopmysuponannnix 15 ner nasa. B 1991 rony 68110 pesonvo npegnonarats, aro Ha a3bix C++ nepexogaT mporpaMMUcTHI, MMeIOMHe OMIT padorsi c C. Tenepb ake K HHM ¢ paBHOii BepOATHOCTHIO MOAHO OTHECTH H TeX, KTO paHbille NMcast Ha asbIKAX Java WIA C#. B 1991 roay Hacneqonanne v1 O6bekKTHO-opHeHTHpoBaHHoe nporpaMmMupoBaHne 6b YeM-TO HOBBIM Aud OoABUIMHCTBa NporpaMMucTos. Tenepb xe 9TO — XOPoMIO M3BeCTHHIE KOHMENLHH, a O61aCTAMM, B PasbACHEHMM KOTOPBIX JIOAM HYAAIOTCA 3 Gonbureit crenenm, cTamH HcKmoueHHa, WAa610HBI H O6OSmeEHHOe MporpaMMupopa- Hue Temu. B 1991 roay HHKTO He CubIllal O MaTrepHax MpoexTHpoBanna. Tenepb 6e3 UX YNOMHMHaHHA BOObINe TpyMHO O6cyxK1aTb NporpaMMHble cuicrembI. B 1991 rogy pa- 6ora Ham (popmasbHEIM craHnapTom C++ ToAbKO HaYHHadacb, Tellepb TOMY CTaHap- Ty yxxe 8 et, u BegeTca paGota Haq crezyiomeli Bepcneli. Yro6nr yuecTs Bce STH HAMeHeHHA, pel HayaTD c YHCTOTO AMCTa H cnpocuA ce6a: «Kakue copeTbi CTOUT JaTb MpakTHKyIOMIHM NporpaMMuctam C++ B 2005 roay?> B peayastate 1 nosBusica HaG6op mpaBH, BKOYeHHBIX B HOBOe M3aHHe. Sta KHUTa BKJI0UaeT HOBbIe T1aBbI Mo NPOrpaMMUpoBaHHiO C MPUMeHeHHeM Wa6AOHOB HM ynpaB- sleHMIO pecypcamu. DakTH4eckH Wa6OHbI KpacHOil HHTbIO MpOXOAAT Yepes BeCTb TEKCT, NOCKOJbKY Maio YTO B CoBpemeHHoM C++ o6xoautca 6e3 Hux. B KHHTY BKILO- ueH Takxe MaTepHa M0 NporpaMMMpoBaHMio NpH HaAM4HM HcKMOYeHHit, NaTTepHaM MPOeKTHPOBAHHA H HOBLIM OHGRHOTeYHEIM CpeACTBAM, ONHCAHHBIM B AOKYMeHTe «Technical Report 1» (TR1) (stot okymeHT paccmatpusaetca B npapnate 54). Ipu- BHaeTCA TaKxKe TOT (bakT, YTO NOAXOH! H METOLBI, KOTOPbIe XOpoUIO paboraloT B OLHO- MOTOYHEIX CHCTeMaX, MOTYT 6EITb HempHMeHHMbI K MHOTONOTOUHEIM. Boubile MONOBMHBE MaTepHalOB 9TOTO H31aHHA — HOBbIe TeMbI. OaHaKo 3HauMTebHas YaCTb OCHOBOTIONA- raroulelt HHqopMaluH M3 Broporo U3qaHUA OCTaeTCA aKTYaNbHO!, MOITOMY A Hallet cnoco6 8 Toi uM MHOi cbopMe NoBTOpHTs ee (COOTBETCTBHe MeEXKAy NpaBMlaMH BTO- poro H TpeTbero H32aHHit BbI HaiizeTe B npunoxXeHHH B). IR Npeancnosne SA crapasica 0 Mepe CH ClenaTb 3TY KHHTY MaKCHMAaJIbHO NoesHOH, HO, KOHEYHO, He CuHTato ee GesynpeuHoii. Ec1H BaM MokaxKeTCA, YTO Kakve-TO M3 MPpHBEAeHHBIX Mpa- BIJ HENb3A CHHTATb YHABEPCaJIbHO MpHMCHHMBIMH, 4TO ECT AYYLINit Coco pewHTS ccbopmyMpoBaHuyio sanayy 1H60 4To O6cy2kdeHHe HEKOTOPbIX TEXHMYECKHX BOMpO- COB HeQOcTaTOYHO ACHO, HEMOMHO, MO>%KeT BBECTH B 3a6.1yKLEHHe, NoxKanyiicta, coo6- mute Mue. Ecnu Bt o6HapyxuTe oulM6Ku s1060ro poma — TeXHHYeCKHe, rTpaMMaTHye- ckHe, THNorpadcxue, — 106bie, — HaMMWMTe MHe Hi 06 atom. IIpu BbITycke cnezyiomero THpaxka A C YAOBOAbCTBHEM YIOMAHY KaxkAOrO, KTO OOpaTUT MOe BHHMAHHe Ha Kaky10- To npo61emy. Hecmorpa wa To 470 B HOBOM 131aHHM KOAMYeCTBO MpaBH yBenM4eHIO 10 55, KO- HE4HO, Hesb3A CKa3aTb, YTO paCCMOTPeHbI Bce HM Bes¥ecKHe Bonpoctl. Ho csbopmymH- poBaTb HaGop TakHx MpaBUs, KOTOPBIX CreLyeT MPHeprKUBATLCA MOYTH BO BCeX IpH- JOKEHUAX MOUTH Berna, TPYAHEe, YeM MOXeT noKasaTbca Ha Nepsbiit Barnag. Ecam Y BAC €CTb NPeANOAEHUA MO MOBOAY Toro, 4TO CTOHA10 6b BKOYHTS eULe, AC YAOBOD- CTBHeM MX paccMorpio. Haunnas c MOMeHTa BbIXOMa B CBET MepBoro H34aHHA STOH KHUTH, 4 BEN MepeyeHb H3MeHeHHii, B KOTOPOM OTpaxkeHb! HCTpaBeHHA OLIMGOK, YTOUHEHHA MH TeXHHYeCKHE o6ropnenua. Ou goctynen ua Web-crpanuue «Effective C++ Errata» no anpecy http://aristeia.com/BookErrata/ect++3e-errata html. Ecam pb xorute nomyyath yBe- AOMICHUA MPH O6HOBNEHHM 9TOFO Hepes, MpHcoeaMHAliTecb K MOeMY CIIMcKy pac- CbUIKH. A Mcrosb3ylo ero ANA TOTO, YTOGEI AenaTb OObABMEHMA, KOTOPbIe, BepoaTHO, 3aMHTepecyioT opel, cnexammMx 3a Moel mpocbeccHoHarbHoll AeaTembHOCTEN. Toz- po6tiocru cm. 1a http://aristeia.com/MailingList. Cxorr lyrnac Maiiepe http://aristeiacom/ Cracepopa, Operox, anpen» 2005 Bsenenne Oano geno — usyyaTb byHsaMenTabHble OCHOBEI A3bIKa, H COBCeM Apyroe — yHHTECA MpoeKTHposars M pearHsoBblBaTb abdpexTuBHbie nporpamMut. B ocobeHHOCTH 3TO Ka- caetca C++, usBeCTHOTO HeobLI¥AiiHO LIMPOKHMH BO3MOAHOCTAMM H BuIpAsHTeNbHO- crbio. Pa6ora Ha C++ mpv MpaBHJIbHOM ero HCMO0.1b30BaHHH CMOcobHa AOCTaBHTh YAO- BompcTBue. Cambie pa3Hble MpOeKTHI MOryT NOJYYMTh HeMocpeACTBeHHOe BEIpaKeHHe H octbexTUBHYIo peamusanmo. TilaTenbHo BbIOpaHubIit H rpaMoTHo pealHsoBaHHEtit na6op Kaaccos, byuknuit 1 wa610HOB MOMoxKeT CaenaTs MporpamMy mpocroii, muTyH- THBHO NOHATHON, apex THBHO! M MpakTHyecKH He cosepxamelt OuMGoK. IIpu Hann- ‘UMM ONpeAeCHHBIX HaBbIKOB HamucaHve acpcpeKTUBHBIX MporpaMM Ha C++ ~ copcem He TpyaHoe Zen0. OfHako MpH Hepa3syMHOM HCiob30BaHHN C++ MO2xkeT AaBaTb Hem0- HATHBI, CIOXKHbI B COMPOBOAKLEHHU M MOMpocty HenpaBHbHbIi KOZ. Len atoit KHHTH — noKkasaTb BaM, Kak NpuMenaTb C++ adpexmueno. A ucxoxy H3 TOTO, YTO BBI y2ke 3HAKOMBI C C++ KaK 230/KOM NPOZPAMMUPOGAHUA, a TAKE HMEETE HexoToppiit onbiT paGorbi c HUM, A mpeqiaraio BalleMy BHMMaHMIO peKoMeHaauMH 110 NPHMeHeHHMiO dTOFO ABBIKa, CHEOBAHHE KOTOPbIM NO3BONMT CAeNaTb BALM NporpaM- MBI MOHATHBIMH, MPOCTBIMH B CONPOBOXKAeHHH, NepeHOcHMBIMH, pacuMpaeMBIMH, a¢b- cbexTHBHbIMu H paboTalonIHMH B COOTBeTCTBHH C OX%KHAaHUAMH. Tlpeanaraembie copeTbt MO%KHO pasxeNHTb Ha ABe KaTeropHu: o6mad crparerua MpoeKTHpOBAHHA H MpakTHYECKOe ACNOMb3OBAHME OTACMBHBIX ASBIKOBBIX KOHCTPYK- unit. O6cy2kaeHHe BONPOCOB MIpoeKTHpoOBaHHA MpU3BaHO MOMOYD BaM cAeTATb BLIGOP M@KLY PasIHYHbIMH MODXOLaMH Kk pelieHmo Toi HM HHO saqa4n Ha C++. Uro BbI- 6parb: Hacneqopanne un UlaGnOHbI? OTKpbITOe HM 3aKpbITOe HacnenoBanHe? 3a- KpbiToe HacneqoBaHve HIM KoMNOsHuMI0? DyHKIHH-YeHbI HM CBOGOLHbIe (pyHK- uux? Tepegayy no sHa4enmo HH No ccbinke? BaxHo npHHaTs npaBabHoe pemenne ¢ CaMoro Ha¥ala, NOCKObKY NOcTeACTBUA HeyAayHOrO BEIGOpa MOTYT HHKaK He TIpo- ABNATBCA, MOKa HE CTaHET CMUIKOM MO3QHO, a MepemembiBaTh 6yAeT TPYAHO, AonrO UM Aoporo. Tlaxe Kora Bbi TOUHO 3HaeTe, 4TO XOTHTe CHEAT, AOOUTECH KeMAeMBIX PesyAbTA- ToB 6biBaeT Henerko. SHaYeHHe KaKOFO THNAa JOJDKEH BOSBpallaTb OnepaTop npucBali- Banna? Korga gectpyxrop 2o1xKeH 6biTs BApTyatbHBiM? Kak ce6a BegeT onepatop New, ecw He MOxKeT HaliTH ZOcTaTOUHO NamaTH? UckmounTenbHO BaxHO mpopabo- TaTb NOQOOHbIe NeTAIH, MOCKONbKY HHaYe Bhi MOUTH HaBepHAKA CTOMKHETECH C HEOKH- DaHHbIM H Maxke HeOObACHHMEIM NOBeZeHHeM MporpaMMbl. ITa KHUTa OMOXxeT BaM n36exaTb NOMOGHBIX CHTYayHit. KoneuHo, sty KHUTy COX*XHO Ha3BaTb MOHbIM PyKOBOACTBOM mio C++. Cxopee, 9TO KoIeKWHA UX 55 copeToB (HH MpaBus), Kak YYYLIMTb Bald nporpaMMB! H Mpo- extol. Kaxapiit naparpa 6omee uM MeHee He3aBHCHM OT OCTAJIbHBIX, HO B 6onbUIHH- et Beenenne cTBe ecTb flepeKpecTHble ccbiiKh. Jlyuule Bcero 4HTaTb 9TY KHHTY, Haya c TOrO MpaBu- wa, KOTOpOe Bac HaHGosee MHTepecyeT, a 3aTEM CIEMOBATS M0 CCbIIKAM, YTOObI NOCMOT- peTb, kyla OHM Bac NpuBegyT. Ota KHHTa TaloKe He ABjAeTCA BBe_eHHeM B C++. B raase 2, HanpHMep, 4 paccKa- SbIBalo O MpaBMAbHOM peaTH3aMH KOHCTPyKTOPOB, ACCTPyKTOpOS M ONepaTopos NpH- cBaHBaHHA, HO MpH STOM MpeaNomaraio, ¥TO BLI y>xe 3HaeTe, UTO 9TH (PyHKUMH JeMaIOT W Kak OnH OGpaBAMOTCA. Ha aTy Temy CymecTByeT MHOXxECTBO KHUT 110 C++. Lent smod kuurn — pbiqeauTs Te acnexTs! nporpaMMuponanua Ha C++, KoTOpbIM wacTo He yAeMOT AoMxKHOrO BHUMaHUa. B apyrux KHMTaXx ONHCHIBaIOT passM4HBIE YaCTH A3bika. Bech %*Ke pacckasbIBaeTCA, KAK MX KOMOMHUPOBaTS MEXxAY Cobol AA MomyyeHua acekTHBHEIX MporpamM. B apyrux u3aHWAX POBOPUTCA O TOM, KaK 3a- cTaBuTb mporpammy OTKOMNMAMpoBateca. A aTa KHHTa — 0 TOM, Kak H36e2%KaTb Mpo- Gnem, KOTOPLIX KOMNMAATOP He B COCTOAHUN O6HapyxUTb. B To xe BpeMA HacTOALlad KHMra OrpaHH4MBaeTca TOMbKO cmandapmuom C++. Bech McNOMBSyIOTCA AMUIb Te CpeACTBa ABbIKA, KOTOPBIe ONHCaHbI B OCpuNHaTbHOM ctanmapre. [epenocumocTb — KH04eBOli BONpOC AIA 3TO KHUIM, MOITOMY ECAH BbI mmeTe TiaTpopMeHHO-3aBHCHMbIe TPIOKH, O6paTHTecb K ApyTHM H3qaHHAM. He naiigere But B aTOH KHUre U // oOpaBnexne wab10Ha class GraphNode; // (cM. mpasuno 42 0 TOM, ¥To // taxoe “typename” 3amerTsTe, YTO A Ha3bIBalO LeM€ YHCIO X , HECMOTPA Ha TO YTO STO Ne- PeMeHHias BcTpoeHHoro Tuna. Hexoropsie s04M Noy NOHHMAIT TOKO MepeMeHHbie MOub3OBaTebCKUX THMOB, HO A He MpHHamexky K HX YucTy. Take oT- MeTHM, 4TO byHkywa numDigits() sosspamaer tun std:'size_t, TO ecrs Tun size_t us MpoctpaxicrBa Hen std. 9T0 To npoctpaHcTBO HMeH, B KOTOPOM HaXOAHTCA MOUTH BCE u3 craHqapTHolt 6u6nHoTexu C++. OgHako, nockoubky craHapTHaa 6u6aMoTeKa C (rounee rosops, C89) TakxKe Moxer 6uITb Hcrom30BaHa B porpame Ha C++, cHM- BoubI, YHacmeqoBanubre oT C (Takue Kak size_t), MOryT CyIecTBOBaTb B T106abHOM KOHTeKCTe, BHYTpH std, 160 B O60MX MecTAaX, B 3ABHCHMOCTH OT Toro, KaKHe 3arov10- BoUHbIe (aii Ob BKMOYeHDI AHpeKTHBO! #include. B sroii KHuTe 4 NpeaNonaraio, uo c nomompio #include Bkmouaiorca 3aronoBouHsie (paiimsr C++. Bor nouemy a yno- Tpe6sm std::size_t, a He mpocro size_t. Korna 1 ynOmMHHalo KOMNOHeHTSI CTaHAapTHoit 6u6HoTeKH BHe TeKcTa NporpaMMBl, TO O6bIMHO OnycKalo ccbLIKy Ha std, Novara, YTO BbI 3HaeTe, TO TakHe BEIM, Kak size_t, vector H Cout, HaxOMATCA B NpocTpaHcTBe HMeH std. B npumepax xe mporpamm 4 Bcerma BKm04al0 std, noTOMy YTO B NpOTHBHOM c1y- wae KO He CKOMNMIMpyeTca. Kcratu, size_t — 3To Bcero-HaBcero onpeserenHntit AUpexTHBOi typedef cHHOHHM (UIA HeKOTOpbIx 6e33HaKOBbIX THMOB, KOTOpbie B C++ HcnOmb3ylOTCA WIA pasHoro pona cueTuHkos (HanpuMep, KOMYeCTBa CHMBOOB B CTpoKax TuMa char*, KonMYecTBa aeMeHTOB B KOHTeitHepax STL u Tf. 1.). Ito TakxKe TUN, IPUHUMaeMbIit byHkKuHA- MK operator[] B BexTopax (vector), 2eKax (deque) H crpoxax (string). Iromy corna- WeHHI0 MbI 6yZeM CiedOBaTb H MpH ONpeneneHHM HalINx cO6cTBeHHEIX byHKuNit operator[] 8 npasute 3. B a1060m o6panneHuH cbyHKuHH yKa3bIBaeTca €€ CHTHATypa, TO eCTb THMBI Mapa- MeTPOB H BOSBpalllaemoro 3Hayenna. MoxHo cKa3aTb, YTO CHrHaTypa (PyHKWHH — 3TO ee Tun. Tak, curHatypoit bynxunn numDigits apasetca std::size_t(int), wHbiMH c10- BaMH, 9TO <(yHKUHA, IpMHHMaionad int H BosBpamaromas std::size_t». Ounnars- Hoe onlpefenenue 8 C++ He BKMIOYAeT THN BosBpanlaemoro byHKuneit 3HaYeHHA, HO B STOH KHHTe Ham 6yZeT yAOGHO CUHTATS, 4TO OH BCE 2Ke ABACTCA YACTBIO curHatypBi. Onpezenenne (definition) coo6maer komnuaatopy neta, KoToppre onyteHbt 8B OOpabnenun. Jaa o6nexta onpenemeHHe — 9TO TO MECTO, re KOMMHATOp BbiImeAeT Aaa Hero namatp. Jina cbyHKUMH HH Wla6mOHa PYHKIHH ONpeseTeEHHe comepXKUT TeIO cbynxuun. B onpezenennu kacca WH Wa6n0Ha Kacca MepeynCAAIOTCA eFO YeHEI: int x; // onpenenerne oOsexta std::size_t numDigits(ant number) // onpenenenne dyHxunm { // (97a $yHKuMA BOSBpaulaeT KonnUeCTBO std::size t digitsSoFar = 1; // necat#Hux sHaxOB B CROeM mapameTpe) EU Baenenne while((number /= 10) != 0) +#digitsSoFar; return digitsSoFar; } class Widget ( // onpenenenue xnacca public: Widget (); ~Widget ()7 template // onpenenexue wa6nona class GraphNode ( public: GraphNode () ; ~GraphNode (); Manunanusauna (initialization) — sto npouecc mpHcpanBaHua o6peKTy Hayasb- Horo sxayenua. [lia o6bekTOB NOmb3OBATeEABCKMX TUNOB MUMUMATH3aUHA BbINOTHA- eTca KOHCTpykTopamu. KouerpyKtop no ymMomuanmio (default constructor) — ato KoH- CTpyKTop, KoTOpbiii MoxeT ObITb BbIsBaH Ges apryMeHToB. Takoit KoHCTpyxTop 1160 He HME€T MapaMeTpoB BOBCe, HOO HMEeT 3HAYeHHE [10 YMOJIMAHHIO AIA KaakOrO Napa- MeTpa: class A ( public: AQ // xouctpyxrop mo yMonuanio Ve class B { public: explicit B(int x = 0; bool b = true); —// KoxcTpyxTop mo yMonwannn, Me // cM. panee oBpachenne 7/ xnoveaoro cnopa “explicit” class C { public: explicat C(int x); // 320 He KoHCTPyKTOp nO 71 yoxanmn be Konerpyxrops1 kraccos B u C o6napzentt B KmoveBbIM cOBOM explicit (aBHBIIt). Dro npesoTBpamtaeT HX McHombsOBaHHe ANA HeEABHEIX npeo6pasoBanuii TuNOB, xoTA He gampemlaeT NpHMeHeHHa, ecm mpeo6pasopanne ykasaHo ABH void doSomething(B bobject); // dyaxuna npunnmae? oStext Tuna B B bObj1: // oGvext tuna B doSomethang (bObj1) ; // sopMansHo, B nepenaetca doSomething B bObj (28); // sopMansHo, cosnaer B m3 uencro 28 // (mapamerp bool no yMonuanve true) dosomething (28); // cum®xa! doSomething npuuwmaer B, // ane int, “ He cyulectayer KeasHoro // npeo6pasonakua w3 int a B Bsegenne Im doSomething (B(28)) // sopmanbHo, ucnomesyerca KOHCTPYKTOp // B anf aBHoro Mpeobpasosanna (npwpenenua) // int BB (cM. 3 mpapune 27 undopmaunio // 0 mpunenekun tunoB) Konctpyxtopsi, o6paBenubie Kak explicit, o6pi4H0 Gonee MpeqnouTHTenbHBI, TOTOMY ¥TO NpenoTBpaMlaloT BHNOTHEHHE KOMMHAATOPAMH HEABHEIX MpeobpasoBa- vit THNa (YacTO HexenaTembHBIX). Ecru HeT OCHOBaTeMbHOM NPHYHHbl AA HCMOmb- 3OBAHHA KONCTPYKTOPOB B MeABHDIX MpeoOpasoBanHAX THNOB, 4 BCeTMa OODABIAIO HX explicit. Coperyio # Bam MpHepakMBaTHCA TOFO 2Ke NPHHWHMTA. O6patute BHuMantie, YTO B MpemmecTByiollem MpHMepe NpHBemeHHe BEILeETeHO. Su Aanbue 6yy HCNOM3OBATH TAKOe BLINEMCHHE, YTOODI MOMMEPKHYTh BaKHOCTh H3- Jlaraemoro MatepHauia. (TakxKe 4 BblenAl0 HOMepa I'1aB, HO 3TO TOKO MOTOMY, 4TO MH KaxKeTCH, 9TO BBITLALUT CHMMaTHYHO.) Konctpyxrop kommposanua (copy constructor) ucnozpayerca 11a HHMManH3a- uuu O6bekTa 3Hay¥eHHeM pyroro o6beKTa Toro Xe CaMoro THMa, a KONMpyromMit ore- paTop MpucBanBanua (copy assignment operator) npumMeHseTca 114 KONMpOBaHHA 3HayeHHA O_uOrO OGbeKTa B Apyroii — Toro xe THMA: class Widget { public: Widget (); // xowetpyxtop no yMonuaHie Wadget (const Widgeté rhs); // sokcTpYKTOP KonupoRanuA Widgets operator=(const Widgeté rhs); // Konmpyouw“k oneparop mpucBampanna he Widget wiz // 38308 KOHCTPYKTOpa MO yMonwaHHD Widget w2 (wi); // psi308 KOKCTPyKTOPa KONMpoRAHKA wl = w2; // susos onepatopa npucansanun // Konmposanneu Bymbre BHUMAaTeJIbHbI, KOIa BAAUTE KONCTPYKUHIO, NOXO*KYIO Ha MpHcBavBaHHe, MOTOMY YTO CHHTAKCHC <=> TaioKe MOET ObITb HCMONbSOBaH {IA BEIZOBA KOHCTPyK- Topa KONMpOBaHHA: Widget w3 = w2; // pu308 KOHCTPYKTOPA KonupoBaHHA! K cyactbi, KONCTpyKTOp KONMpoBalHA Terko OTAMYMTD OT NpucBanBanisa. Ecnu NOBbIii O6bEKT OMpemerAeTCA (Kak W3 B MOCIEMHEM NpeWOXKeHHH), TO AOMKEH BbISBI- BATbCA KOHCTPYKTOP, STO He MoxkeT ObITb NpHCBaMBaHHe. Ecru 2% HMKaKOTO HOBOTO o6bexta ne cosqaeTca (Kak B «:iterator, set:iterator HT. A.), aslropuTMos (to ecTt for_each, find, sort #7. a.) H Bceli CBASaHHOII C STUM CPyHKUMOHab- HocTH. B neii over uHpoKO HcnomB3yioTca OGbEeKTHI-CbyHKuHH (function objects), To ects oSpekTHI, Beye ceOa TOROOHO yukuuaM. Takue oObeKTH NpeACTaBAeHD KulaccaMH, B KOTOpbIX Neperpy2KeH Olleparop BbI30Ba Operator(). ECM BbI He 3HaKO- bi c STL, Bam noHaqo6uTca, NOMMMO HacTOAUel KHUTH, KaKoe-Hu6yab AOCTOItHOe PYKOBORCTRO, NOCBALMEHHOE STOIt Teme, Bex GuOmHoTeKa STL HactombKo yn06ua, 4TO HE BOCTOAb3ORATHCA ee NPeHMyuleCTBAMH 6b1.10 Gbt HeMpocTHTenbHO. CrouT ANU HayaTb pa6oraTb c Heil, 1 Bb CAMH 9TO MOUyBCTByeTe. Tlporpammucram, npumeamum x C++ of a3biKos spone Java uiu C#, Moxer no- Ka3aTbCA CTpaHHbIM NOHATHE Heompeferennoro nosegenna. Io pasnM4HbiM MpudH- HaM MORe/eHHe HEKOTOPbIX KOHCTpykKuHii B C++ nelicTBUTebHO He ONPEseeHO: BbI 1l€ MOxKeTe YBEpeHHO NpeACKasaTb, YTO NpOUsoiNeT BO BpeMA HcHOAHeHHA. Bot nBa mpuMepa TaKoro pola: ant *p = 0; // p ~ nyneso% yxazarens std::cout << *p; // pasimenopanue Hynenoro yKasazenn char name[] = “Darza” 7/ name — Maccus anus 6 (He sabynsTe npo 7/ sapepmanmn ayn!) char c = name(10]; // yxasauve venpasunbioro uunexca maccupa // nopoxnae? Heonpenenexuoe nopenenne Z[a6u noAYepKHYTS, ITO pesyALTATLI HeOMpemeTeHHOrO NOBECHHA HEBO3MOXHO: MIpCACKa3aTb H YTO OHH MOTYT GLITb BeCbMa HeNpHATHBI, ONBITHBIe NPOrpaMMHCTBI Ha C++ "acto ropopxT, 4TO MporpaMMbI C He€OMPeAC/CHHBIM MOBeACHHEM MoryT CTepeTb cofepxKUMOe XAECTKOFO AHCKa. JTO Npapa: Takat NpOrpaMMa mo%em CTepeTb Ball 2XKCCTKHH ACK, HO MOXeT dTOFO H HE CeNaTb. Bonee BepOATHO, YTO OHA 6yzeT BeCTH ce6x 110-pa3HOMy: HHOFa HOPMasIbHO, HHOTMa aBapHitHo 3aBepulaTbCA, a MHOTAa — MIpOCTO BblAaBaTb HelIpaBHJIbHble pesybTaTbi. Myapble nporpaMMucTbI Ha C++ npH- AeprkMBaloTCA Npapiia — us6eraTs HeonpeserenHoro noBegenus. B stoi KHUTe BO MHOFHX MeCTAX A YKa3bIBalO, Kak STO CylestaTb. Mnoit Tepmun, KoToppiii MoxeT CMYTHTb NporpaMMHCTOB, NpHeAMIMX u3 Apy- THX #3bIKOB, — 9TO MutTepéelic. B Java u .NET-cosmecrumbix a3bikax uHTepibelicbt #5- AAIOTCA YACTbIO ABbIKa, HO B C++ HuYerO NOZOGHOTO HeT, xOTA B MpaBHie 31 paccmat- puBacrca HeKoTopoe npH6ruxenne. Korga 1 ucnorb3yt TepMHH , To O6bI¥HO UMeIO B BHAY CHTHAaTypbt PyHKuMii, MOCTYNHBIE UeHBI Ksacca ( (right-hand side). Stw umena o6pruHO ynoTpebsmlOTCA B CbyHKUHAX, peasy 1OUlMx 6uxapHble oneparoppt, To ecTb operator== u operator*. Hanpumep, ecan a u b - o6neK- Thi, MpeACTaBIAIOUINe PAMOHA/IbHbIe UHC, H ec OGbeKTBI Kslacca Rational MoxHO MepeMHOXaTS C NOMOMLbIO (PyYHKWHH-HeweHa operator*() (nos06HbIit cuyyali ommcaH B mpapuse 24), To BbipaxkeHue atb SKBUBaJIeHTHO BBISOBY CbyHKWHH: operator*(a, b); B npasuae 24 1 o6naBu810 operator* creayromHM o6pasoM: const Rational operator* (const Rational& lhs, const Rationals rhs); Kax puaure, nepptit onepana — a— suytpu ynKuim Hasbipaerca ths, a npapoiii — b-—rhs. Aaa byHkunii-aenos apryMeHT B 1eBoOi YacTH ONepaTopa MpeacTaBsIeH yKa3zaTe- gem this, a equncrsennbiit ocrapuniica napamerp uHorda HaabiBar rhs. BosMoxuo, EI Baenenne Bb 3aMETHJIM 9TO B OObABAEHHH HEKOTOpbIX PyHKUMi-wWeHoB Kacca Widget B npu- Mepax Bbille. YKa3aTevleii C MOACYETOM CCbIJOK, perysAPHbIX BpIpaxkennit H Muororo Apyroro. Bce komnoventt TR1 HaxogaTca B mpoctpaH- crpe HMeH tr, KOTOpoe BsO-KeHO B MpOcTpaHcTBo HMeH std, OQ Boost — ato opranusauus u Web-caitr (http://boost.org), Ha KOTOpoM mpea- JaraloTCs NepeHOCHMBIE, TWaTeJIbHO MpoBepeHHbie 6u61HoTeKU C++ ¢ OTKpbI- TbIM HCXOAHBIM KoA0M. Bonbuiaa yactb TR1 6asupyerca Ha paGore, BbINoAHeH- no Boost, # 10 Tex nop, NoKa NOcTaBILHKU KoMNMAATOpOR He BKTIOMaT TR1 BaucTpH6yTHBb C++, Web-caiit Boost 6yzer octapatbcs asa paspaboTHHKoB TaBHbIM HCTOYHUKOM peatusaunit TR1. Boost mpexoctapnset Gombe, 4eM BKIO4eHO B TRI, ofHaKo B 060M culyaae 0 HEM MOesHO 3HaTb. Fnasa 1. Mpnyyuaitrecs x C++ Hesapvicuo or onpita nporpaMMupoBaHHA, Aa Toro YTOObI OcBOUTBCA C C++, NoTpe- 6yetTca HeKoTOpoe BpeMa. ITO MOMHBIit ASbIK C OY€HD LHPOKHM JHalla30HOM BO3MOK- HoCTeii, Ho UTOGbI HCTONb3OBATH UX SGPEKTHBHO, HYXHO HECKONBKO HSMEHUTD CBOit cnoco6 MpuiieHua. Kura Kak pas H IIpH3BaHa OMOUb BaM B 9TOM, HO KakHe-TO BONPOCbI ABAAIOTCA Gosee BAKHbIMH, KAKHE-TO — MeHEE, a 3TAa PiaBa NOCBAMLHa CAMBIM BaxkKHBIM Bella. fpasuno 1: OtHocuTecb k C++ Kak K KOHTIOMepaty A3bIKOB Tlonayany C++ 610 npocto asprKom C c 106aBeHHeM HeKOTOpbIX O6BEKTHO- opventuponantnrx cpeacts. axe nepponavanbiioe Haspanue C++ («Cc KnaccaMu>) OTpaxkaeT 3TY CBASb. Tlo Mepe Toro Kak s3bIK CTaHOBHIICA BCe Gozlee 3pesTIM, OH POC H PasBMBAJICA, B Hero BKJMOYAHCh HXeK H CTpaTerHl MporpaMMUpoBakuA, BbIXOAIMHE 3a paMKH C c KIaCc- camu. Uckmouenna notpe6onann Apyroro noaXoaa K CTpyKTypKpoBani pyHkyuit (cx. npasuio 29). [aGnone usMeHWaM Hau npexcransenua O mpoeKTHposanun mporpamM (cm. npaBuio 41), a 646.1HoTeka STL onpemeaua nogxo K pacluMpseMo- CTH, KOTOpbIii HHKTO patiee He Mor ce6e MpemcTaBUTD. Cerogia C++ — 3T0 A3bIK mpozpamMuposanua C HecKONdKUMU Napaduemamu, noAAepKUBAIOMMH NpoyemypHoe, O6beKTHO-OPHEHTHPOBaHHoe, cbyHKUHoHAaTbHOEe, o606uleHHOe H MeTaNporpaMMUpOBaHHe. ITH MOULb H THOKOCTS Aenalot C++ HecpaB- HeHHDIM HHCTPyMeHTOM, OHAKO MOTYT IpHBECTH B 3aMeulaTembcTBO. Y 106oit pe- KOMCHJal\HH MO , BK04aH KOHCTPYKTOpbI H JECTPYKTOPHI, MHKANCy.1ALHIO, HacneqoBative, noaUMOpduaM, BUPTyambHbIe ynkuMM (AUMAMMYeCKoe CBA- 3bIBAHHE) HT. A, DTO Ta yacTb C++, k KOTOpOit B HaHGoAbUelt CTeneIM NpuMe- HMMbI KylaCcHYecKHe MpaBlia OObEKTHO-OpHeHTHPOBaHHOTO MpoeKTHPOBaHHA. QO C++ cma6sonamn. Sta yactb C++ nasbipaetca O606meHHBIM NporpaMMHpo- BaHHeM, 0 Heit GombIIHHCTBO NporpaMMUCcToB 3Hal0T Mano. Ila610nbI Tenepb Tponnabipaiot C++ CHH3Y AORepxy, H MpHsHaKOM Xopourero Toa B Iporpam- MHpoBaHMM y>Ke CTaNO BKOYeHHe KOHCTPYKUMii, HEMBICAMMBIX Ges W1a6.10110B (Hanpuep, cm. mpasysio 46 0 npeo6pasoBaHHH THIOB Np BbIZoBax WabON- ubIx bynkunit), Daxtuyecku wa6n0HbI, 6narogaps cBoei MowH, Mopo”MH COBeplleHHO HOByI0 NapakurMy NporpaMMUpoBanHa: Memanpozpammupoca- nue wa6aonos (template metaprogramming - TMP). B npasuse 48 npeytcras- nex 0630p TMP, Ho ecam Bb He ABIAeTeCb YGexTeHHBIM (aHaTHKOM wa6s10- HOB, Y BAC HET NpU4HH YpesMepHto 3anyMbIBaTbCA 06 TOM. TMP He oTHeceUID K CaMbIM pacnpocTpaHleHHbIM NpHeMaM mporpaMMuposaliua Ha C++. Q STL. STL - aro, koneuno, 6u6.nHoTeKa waGn0HOR, HO ONE CHeKHaTHaHpo- pannas. IIpuaarute B Heli cornameHus OTHOCHTeBHO KoHTeiitepoB, HTepaTo- DOB, aNTOpHTMon H (YHKUMOHATDHBIX OGbeKTOB BEAHKONCHIIO CONCTAIOTC MC>K- ay co6oit, Ho ma610HbI H 6H6.1HOTeKH MOxHO CTpOHTS H NO-zpyromy. Paboran c 6uGanoTeKoit STL, Bb1 O6n3aHbI CegoBaTb ee CoraLeHHAM. Tlomuure 06 aTux veTbIpex nonbasbiKax U He yaMBaaitTecb, ecnu NonaneTe B cH TyauHio, Korna coobpaxkeHia addeKTHBHOCTH MporpaMMUpOBaHHA NoTpeGyioT OT Bac MeHATb CTpaTernio NIpH MepeKsuOUeHHH C OAHOrO NoAbAsbIKa Ha Apyroi. Hanpumep, Auf BCTpoeHHbIx THTOB (B cTHne C) nepenaya NapameTpos N10 3HayertHio B O6IeEM cayyae 6onee acbdekTuBHa, YeM Nepesaya MO CCLITKe, HO CCIM BbI MporpaMMupyere B OObeKTHO-OpHENTUPOBAHIIOM CTILe, TO H3-9a HATHA OMpeneTeHHBIX NoaOBaTe- JI@M KOHCTPYKTOPOB H AECTPyKTOPOB nepedlaya MO CCbIIKe Ha KONCTAaHTY OObIMHO CTa- HOBHTCA Gouee adbdbekTuBHOii. B ocobenHOcTH 3TO OTHOCHTCA K NOAbASBIKy «C++ ¢ ma610HamH», NOTOMY ITO TaM BbI OObIUHO Naxe He 3HaeTe 3apaHee THNAa OObCKTOR, € KOTOpBIMH HMecTe Jeno, Ho BOT BbI NepelllTH K Ucrlonb30BaHUI STL, H onsite cra- poe npasruio C 0 nepedaye No 3HadeHHWO CTAHOBUTCA aKTYaIbHbIM, MOTOMY ¥TO HTepa- TOpbt H PyHkWHOHaMbubIe OGbeKTHI CMOseMpOBaHbt Yepes yKasaTerH C. (Tlogpo6no 0 Bbi6ope cnoco6a nepesayn napaMerpos CM. NpaBHto 20.) Takum 06pa3om, C++ He ABIAETCA OAHOPOAHBIM ABbIKOM C EMHHCTBEHHBIM Ha60- POM MpaBHI. ITO — KOHTIOMepaT NOADASHIKOB, Ka%K Abi CO CBOHMH COOCTBEHHBIMH, cormamennamu. Ecau bbl 6yzeTe MOMHUTD 06 STHX NOADAIbIKAX, TO OONapy2KHTe, YTO mouaTb C++ HaMHoro npoule. Ymo cnedyem nomnume @ papuna adextusxoro nporpaMMupoBaHisa MeHAIOTCA B 3aBHCHMOCTH or dactu C++, KoTOpyio BbI HcnombayeTe. P28] [| Tih Mpnyyaitect « C++ Mpasnno 2: Mpeanountaiite const, enum u inline ucnonbsosannio #define Dro npasuno ayumre 6u110 6y HasBats «KomnussTop npegnouTuTenbHee mpe- mpoueccopa>, nockobky #define sayactyio Boobmle He OTHOCAT K A3bIKy C++. B 3ToM HW 3akuio¥aeTcA Ipobslema. PaccMorpHM MpocToit npuMep; Nonpobyiite HamucaTb 4TO- HHOyAb Bpone: #define ASPECT_RATIO 1.653 CumBosnueckoe uma ASPECT_RATIO moxer tak m ocTaTbCA HeEH3BeCTIIbIM KOMNMJATOpy WIM ObITb yAaeHO NpenpoueccopoM jo Toro, Kak KOs NocTynHT 11a 06- pa6otky komnusatopy. Ec aro npousoliger, Touma ASPECT_RATIO ne nonaget B Tasty CHMBoxOB. [losTOMy B Xoze KOMNMJIALHH BI NoyyuTe OMNHOKy (B CoobmEHHH oneii 6ynet ynomanyto aiavenue 1.653, a xe ASPECT_RATIO). 9t0 ppizonet nyTaHu- uy. Ecau uma ASPECT_RATIO 61170 onpestesteno 8 saros10B04HOM (paiiute, KoTOpbIii N= ca. He BbI, TO BbI BOOGIE He 6yeTe 3HATh, OTKyAa B3ANOCb 3HaYeHHe 1.653, H Ha IOUCKH oTBeta NOTparHte MHOrO BpeMeHH. Ta 2Ke Mpo6leMa MO2KET BOSHHKHYTD Hi TPH OTJIAAKe, TockombKy BbiGpantioe BaMH HMA OyseT OTCYTCTBOBATS B TAGIHLLE CHMBONOB. Peulenne COCTOHT B 3aMeHe MaKpoca KONCTaHTOi: const double AspectRatio = 1.653; // mena, sanvcanuue Gonbunmn GyKsamn, 7/ oOH4HO NpYMeXAOTCA Bun MaKpocoD, // nostouy mit pemmm ero usMeHnTs Byayun A3bIKOBOH KOHCTaHTO, AspectRatio BUMMa KOMIIMJATOPy H, ECTeCTBeH- HO, MoMemlaetca B TabMEy CHMBONOB. K Tomy 2%e B CyYae HCNONb30BaHUA KOIICTalI- Thi C MsaBaloulel TOUKO!i (Kak B 3TOM MIpHMepe) renepupyeTca Sosee KOMNAKTHBIit KOA, 4eM MpH Hcnosmb30BannH #define. Jeno B TOM, 4TO Npenponeccop, Cieno NoACTaBAAA BMecro Makpoca ASPECT_RATIO senuuuny 1.653, coanaet MHoxkecTuo Konmit 1.653 B OOEKTHOM Kose, B TO BpeMA KaK HCNOb3IOBAHHE KOHCTAHTbI HUKOTa He NOpOAUT 6ozee oH KonMH aTOFO 3HayeHHs. Tipu aamene #define KoncTaHTamu ily2kHO NOMHUTS O AByx ocobbIx cnyyaax. Hep- Bbiil KacaeTCa KOHCTaHTIIDIX ykasateseli. TockoabKy onpeeneHHA KOHCTAHT OObIMHO NMOMeWAalOTCA B 3aroOBOUHbIe CaiiTbl (re K HUM IO/y4aeT OCTYN MHOXKECTBO pa3- JIMYHBIX HCXOANBIX alit0B), BaxKHO, YTOObI CaM yXazameab Obi OOSABeI C KOYeBLIM cHOBOM Const, B ONOAHEHHe K O6baBeHMIO Const Toro, Ha 4¥TO ON yKasbIBaeT. Hanpu- Mep, 4T06bI OObABHTS B 3aroOBOTHOM ¢haiizte KOHCTaHTHY!O CrpoKy THma char*, c10B0 const Hy:kHO HanvcaTb deancdol: const char * const authorName = “Scott Meyers”; Bonee nogpo6xo 0 cyunoctH # mpuMeneHuit croBa const, ocobeHHo B CRA3Ke c ykasatemamn, cm. B npaprute 3. Ho yxxe cefivac CToHT HanOMHHTS, ¥TO O6BeKTHI THNA string o6bluHO npeanoyTHTeIbHee cBOMX NpapoAHTeses — crpo Tuma char *, noaTOMy authorName slyume onpeseUTb TaK: const std::string authorName("Scott Meyers”); Bropoe 3ameyaHue KacaeTCA KOHCTAHT, OGbABIAEMBIX B COCTaBe Kiacca. UTo6p! orpaHHYHTb OGaCTb AeliCTBHA KOHCTAHTHI KACCOM, HCOOXOMHMO CHemaTb ee WICHOM Mpasuno 2 (oe Kacca, H YTOObI rapaliTHpoBaT, YTO CyWLECTBY€T TOMBKO O{Ha KONHA KOHCTaHTDI, Tpe- 6yeTcA ChenaTb ee CmamuuecKUM IeHOM: class GamePlayer { private: static const int NumTurns = 5; // oOsaBnenue Koncranmu aunt scores (NumTurns) ; // ucnomss0zanue Koucrantit To, TO BbI BHAHTe Ble, — 9TO O6sxenenue NumTurns, a He ee onpeneneHue. O6sruno C++ tpeGyer, yToG6bI BbI MpeACTaB.1A.1H ONpeAeEHHE AA BCeTO, YTO MCMOJIb- ayeTe, HO OObABAeHHIe B KNacce KOHCTAHTHI, KOTOpble ABAAIOTCA CTATHYECKHMH H HMe- 1oT BcTpoeHubiit THN (TO ecTD LeNbIe, CHMBODUBIe, 6ysIeBCKHe) — 3TO HCKIO“eHHE H3 mpapu.i. JLo Tex nop moKa BbI He MbITAaeTECh NOMYIHT aApec TaKOl KOHCTAHTHI, MOXKETE O6bABATD H HCNOAb3OBATE ee 63 NpegocTaBAeHHA Onpenenenna. Ec 2Ke BAM HY>K- HO NOAYYNTb ape 160 ec Ba KOMNMIATOP HACTaMBaeT Ha HaMYHH onpenese- HUA, TO MOXETE HalMCaTb ¥TO-TO NonoGHOe: const int GamePlayer: :NumTurns? 7/ onpenenenue NumTurns; cu. sxe, // movemy He yKasuBaerca suayenne Tlomectute ator Koy 8 dali peanvsauun, a He B 3aroOBOYHBIA (aii. TockorbKy Ha'atbHoe 3Ha¥ueHHe KOHCTAaHTbI KJlacca Mpe/CTaBeHO Tam, rae OHa OObABNEHa (TO ectb NumTurns mHHimasu3uposako 3HayeHHem 5 npu O6baBeHMH), TO B TOUKe OMpe- ACHeHHA 3aqaBaTb HavabHoe 3HayeHHe He TpebyeTca. OTMeTHM, KCTATH, YTO HeT BOSMOXNOCTH OOLABUTD B Ksacce KOHCTAHTY nocpes- ctsom #define, notomy yto #define He yautbipaet o61acTH xeitcTBua. Kak TOKO MaKpoc OnpeyevieH, OH OCTaeTCA B CHE 118 BCeli OcTaBulelica YacTH KOMMHIUpyeMoro KO/la (eC TObKO Te-To HiDKe He BcTpeTHTCA #undef). Dro sHayHT, uTO AUpeKTHBA #define nenpiMeHua He TONbKO AJA OObABIEHHA KOHCTAHT B K/aCcce, HO BOOOMe He MoxeT 6bITh HCNOMb3OBaHa TIA OGecneyeHHaA KaKOit Gt TO Hu ObIIO HAKAaNCyALHH, TO €CTb NpHlaTb CMBICI BEIpaxKenuio «private #define> HenosMoaHO. B TO xe BpeMA KONCTANTHDIE AHHBIE-WeHbI MOTyT ObITb HHKANCysMPOBAHBI, NPUMepOM MOXET CZ1y- 2uTb NumTurns. Crapbie KOMNUTATOPbI MOryT He NOALep»KHBATb MOKasaHHblit BIE CHHTAKCHC, Tak Kak B Gosee paHiHXx BepCHAX ABbIKa ObLIO SaNpellleHO safaBaTb SHAYeHA CTaTH- 4eCKHX WICHOB KJacca BO Bpema OObaBacHuaA. Bovee Toro, HHHUMaIH3auHA B KJacce Aonyckanach TONbKO MIA iesbIxX THNOB MH Ants KoHCTaHT. Ecam BbilenpHpeqenHbtit culTaKcuc He paboTaeT, TO HadanbHOc 3HayeHUe ClepyeT 3a1aBaTb B ONpeseueHUU: class CostEstimate { private: static const double FudgeFactor; // oOpasnenme crarmuecko# KoncranTH // wnacca — noMewaerca 3 gavin 3aronosKa Me const double // onpenenenne crammuecko# xoneranta CostEstimate::FudgeFactor = 1.35; // Knacca — nmomemaerca B gatin peanusaumn OGsri0 Huyero GombuTe H He TpebyeTca, EAWIICTBEHHOe HCKMOYEHHE O6HApYAH- BaeTCA TOMA, KOrAa AAA KOMNMAALMH Klacca HeoOxoqMMa KoHcTanta. Hanpiep, EUR Mpnysaiitece « C++ npu o6sannenun Macca GamePlayer::scores KommusiaTopy Hy2HO 3HaTb pasMep MaccuBa. Uto6sI pabotatb c KOMNHATOpOM, OlNMGOuHO 3anpeutalollMM HHRUMAH3H- POBaTb CTATHYECKHE LeNble KOHCTAHTHI BHYTPH KJacCa, MOAHO BOCNONbIOBATHCA CIO- CO6OM, H3BeCTHBIM NOX Ha3BaHHeM .OH OCHOBaH Ha TOM, YTO MepeMeHHble MepedHCIAEMOFO THMA MO%KHO HCMOIb3OBaTb TaM, Te ORUTAOTCA 3Ha4enna Tuna int, noatTomy GamePlayer MoxkHO onpesenHTb Tak: class GamePlayer ( private: enum ( NumTurns = 5 }; // “apex c nepeuncnenuem” — yenaer us // NumTurns campon co auayennem 5 int scores({NumTurns]; // wopmansxo Me . OToT MpveM CTOHT 3HaTb MO HECKOJbKUM MpHunnamM. Bo-nepsbix, nopenenue ¢Tpi0ka C MepeyHCJIEHHEM> B HEKOTOpHIX OTHOWIEHHAX Gonee Noxoxe Ha #Hdefine, 4em Ha KOHCTaHTY, a HHOFJa 3TO Kak pa3 TO, 4TO Hy>KHO. Hanpumep, MOoKHO NOYYHTh al- pec KOHCTaHTDI, HO HEb3A NOAYYHTb apec NepewHCeHHA, KaK HEIb3A NOTYYHTS H anpec #define. Ecam Bbt XOTHTe 3aNpeTHTb MoyYaTb alpec WIM CCbLIKY Ha Kakyl0- HHOyb LeJyIo KOHCTaHTY, TO NPHMeHeHHe enum ~ xopournii cnoco6 HanOxKHTb Takoe orpannuenne. (Iloapo6uee o noamep2kke MpoeKTHEIX OrpanH4ennit c NOMOL{bIO NpH- eMOB KOLUPORAHHA MOxKHO Y3HATb U3 MpaBua 18). K ToMy xe, XoTA XOPOMIHe KOMTIH- JIATOPbI HE BBE ALOT MaMATH AIA KOHCTAHTHBIX OObEKTOB LLEJIbIX THTOB (€CIIH TOKO. BbI He CosflaeTe yKazaTelA WIM CCbLIKH Ha O6beKT), MeHee H30IpeHHbIe MOryT Tak NOCTyNaTb, a BaM 3TO, BO3MOXHO, HH K yemy. Kak nu #define, nepeyncueHHa HHKOrNa He cTaHyT npHynHolt nogo6Horo HexkeraTeIbHOTO pacnpeseleHHsA NAMATH, Bropas npuana 3HaTb o «TpioKe MepesHicreHeM> sucTo nparMatHuecKas. OH HCHONb3YETCA B OYEHD MHOFHX MporpaMMax, MOITOMY HY%KHO yMeTb pacnosHaBaTb 9TOT TPIOK, Korza BbI C HUM cTamKHBaeTecb. Boobure ronopa, ToT mpuem — dyHna- MeHTaJIbHad TeXHHika, IpHMeHAeMad IIpH MeTaNporpaMMMpoBaHMH WabnoHoB (CM. npasusio 48). Bepnemca K npenponeccopy. [pyroit vacroiit caysaii nenpasuabHoro ucriom1b30- BaHa WUpeKTHBLI #define — cosyaHHe MakpOCOB, KOTOPEIe BbITAALAT Kak PYHKUHH, HO He O6peMeneHbI HaKIaAHbIMH PaCXONOB, CBASAHHBIMH C BBI3OBOM ynKunit. HwKe MpemcTaBjieH MaKpoc, KOTOpbiit BbISbIBaeT HEKOTOpytO byHKyuio f c apryMeHTOM, paB- HIM MaKCHMaIbHOMY H3 Byx sHadeHHit: // puspate £, nepenas ev maxcumym “3 a uD fdefine CALL_WITH_MAX(a,b) £((a) > (b) ? (a) ¢ (b)) B otoli crpouke colep2xkHTCA Tak MHOFO HEAOCTATKOB, UTO ake HE COBCEM NOHAT- HO, ¢ KaKOTO HavaTb. Besxuii pas np Haniicanun Mo,o6HOro MaKpOCa BEI LOJDKHBI NOMHUTS 0 TOM, YTO BCC apryMeHTbI CJleayeT 3akmioYaTb B CKOOKH. B NpOTHBHOM Culyyae Bb pHcKyeTe CTOJIKHYTBCA C NpobseEMO!, Kora KTO-HHGY/Ab BbIZOBET €TO C BbIPAKEHHEM B KaYeCTBE apryMenta. Ho jake ecu BbI CeNaeTe BCe NPaBHAbHO, NOCMOTPHTe, Kakue CTpaHHble BEL MOTYT NpousolTH: Npasuno 3 ITE int a= 5, b= 0; CALL_WITH_MAX(++a, b)s // a yeenwunsaercs mpaxne CALL_WITH_MAX(+#a, b+10)7 // a ypemunsaercs ona pas TIpoucxogsmee BHYTPH Max 3aBHCHT OT TOTO, C 4eM OHA CpaBHUBaeTca! K cuactb0, Bbl HeT HY%/Ibl MAPHTBCA C NOBeeHHeM, TaK CHAbHO NPOTHBOpeYalHM npuBplyHolt soruKe. CyiecTByeT MeTOA, NO3BONAIOMHK ZOGUTECA TaKOHK xe acpdeK- THBHOCTH, Kak NH Hcriomb3oBaHHH Mpenponeccopa. Ho mpu atom ObecneunBaeTCA KaK TIpecKa3yeMOCTb NOBEACHHA, TAK H KOHTPO/Ib THIIOB apryMeHTOB (YTO XapakTepHO AA o6prluHDx byHKui). Dror pesyrbTatT AOcTuraeTcaA MpHMeHcHueM wia6OHa BCTpOeH- noii (inline) dbyxxunn (cM. mpasuto 30): template anline void callWithMax(const Té a, const Té b) // TlockonbKy mw He sHaen, ‘ J/ “0 ecTh T, To nepenaem fla>b?a: bi; // ero no coumke Ha const ~ ) // cM. naparpad 20 Dror ua610n renepupyer Were cemelicrBo yHKUMi, KaxKAad M3 KOTOPbIx NpH- HHMaeT (Ba ApryMeHTa O{HOTO H Toro xe THN H BbIsbIBaeT f C HAHOOABINHM 13 HX, Hert Heo6Xxo2MMOcTH 3aKs1OUaTL NapaMeTpbi B CKOOKH BHYTPH Tea ynkit, He HYK- HO 3a60THTbCA O MHOTOKPaTHOM BbIYMCEHHH MapaMeTpos H T. 1. Boree Toro, 10- cxoabxy callWithMax - nacoamaa (byHKuns, lla Hee pacnpocrpanaiotca upaswia o6acreii Ae/icrBua M KOHTpora nocTyna. HanpuMep, MOxHO roBOpHTs O BCTpoeHITOi yHKUMH, ABIAIOMeLICA 3aKPBITbIM WIEHOM Kacca, OnucaTb He4YTO No-LGHOe Cc NO- MOULbIO MakpOca HEBO3MOXKHO. Hasmune const, enum u inline pesKo cHywKaeT noTpeGuocT B npenpoueccope (ocobeHHo oto oTHocuTca K #define), Ho He ycTpaHseT ee NonHOCTBIO. JLupeKTHBa #include octaerca cymtecraennoit, a #ifdef/#ifndef npoxomxaloT urpatb BaxKHYI0 pom B ynpaBrciuM KoMMUAAUHeL. Moka elle He BpeMs OTKasbIBATBCA OT MpeTIpo- meCcopa, 10 OMpeAeeHHO CTOHT 3alyMaTbCA, KaK U36aBHTbCA OT Hero B AaDHeli- mem. 'Ymo cxedyem nomnumo @ na npoctiix koncrant Aupextuse #define cnezyeT npemnouecTb KOHCTaHT- Hbie OObeKTHI M Mepeyncsenna (enum). BMecTo MMUTHPYIOULMX (py HKUMH MaKpOcoB, onpeseseHHIx Yepes #define, Jule NPHMeHATS BCTPOeHHbIe yHKUHH. Mpasuno 3: Beage, rae TOnbKO MOXKHO, ucnonb3sylite const SameyaterbHoe CBolicTBO MOAMGuKaTOpa Const COCTONT B TOM, 4TO OH Hakslabl- BaeT ONpesesIcHHOe CeMaHTHYeCKOe OrpaHHyeHHe: AaHHbIit OObeKT He 1O12%KeH MOAH- cbuunposarEca, — H KOMMMIATOp GyAeT NPOBOAUTD 3TO OrpaHu4yeHHe B 2KM3HD. Const NOSBONAeT YKa3aTb KOMNHIATOPY H MporpaMMHCTaM, 4TO ONpenercuIad BEAM AouKHa OCTaBaTbCA HEN3MeHHOI. Bo Bcex nogoG6ubix cayyaax BbI AONK Ib O603Ha- 32] tT Ti Npnysaiitect k C++ 4MTb 9TO ABHDIM O6pasoM, fIpH3bipad ceGe Ha MOMOLL, KOMMKTATOp H rapaliTHpya Tem caMbIM, 4TO orpaHH4eHue He 6yeT HapyleHo. Karoyesoe coro const yAMBHTeIbHO MHOrocTopoHHe. Bre K1accoB Bbl MoxeTC HCMOb3OBaTb ETO AIA ONpeweMeHHA KOHCTaHT B r106anbHO; OGnacTH HH B MIpo- cTpancTne HMeH (cM. NpaByiio 2), a TakxKe Ad CTaTHYeCKHX O6beEKTOR (BHYTDH (paisa, bynkunn nau 610Ka). BuyTpu Knaccos ZOnycTHMo MpHMeHATE ero Kak Ala craTHue- CKHX, Tak M Jd HECTATHYeCKUX JaHHbIX-4eHOR, Jf yKasaTeseii MOXKHO CHeuMpuuH- POBaTb, MOMKEH JH ObITb KOHCTaHTHBIM CaM yKa3aTeJIb, JaHHble, Ha KOTOpble OH yKa- 3bIBaeT, M60 H TO, H Apyroe (1M HH TO, Hu Apyroe): char greeting{] = “Hello”; char *p = greeting; // wexoncrantuud yxaszatens, // sexoncTanTHe Tanne const char *p = greetin // wexoncrantHeit ywasarens, // KOHCTAHTHNe naKHBe char * const p = greeting; // KoHCraHTHE yKasarens, // weKoHCTaNTHBIe naHHue const char * const p= greeting; = // KoncTauTaui yxasarens, // KoxctantHne Danse DTOT CHHTAaKCHC He Tak CrpalileH, KaK MOKET MOKa3aTECA. EcAM C10BO Const 1l0AB- JACTCA CBA OT SBESMO4KU, KOHCTAHTHBIM ABJACTCA TO, Ha 4TO YKasbIBaeT yKasaTeNb; eCJM CiipaBa, TO CaM yKa3aTeJb ABJIAETCA KOHCTaHTHbIM. Hakonell, eC xe COBO Const MOABAAETCA C O6€UX CTOPOH, TO KOHCTAHTHO KH TO, H Apyroe. Koraa To, Ha 470 yka3bIBaeTCA, — KOHCTaHTAa, HEKOTOpble M1porpaMMHCTbI CTaBAT Const nepea KzeHTHdUKatTopom Tuna. J[pyrve — nocne uAeCHTHHKaTOpa THNA, Ho Mepex 3Be3q04Kol. CemMaHTH4ecKOii pasHUubl 3feCb HET, MOSTOMY CmenyoulMe dyHKunH IIpHHHMaloT MapaMeTp O/HOTO M Toro xKe THT: void f1(const Widget *pw); // £1 npuavuaer yxasarenb na // KoucranTHn OOveKr Widget void £1(Widget const *pw); // 0 we camoe nenaer £2 Tlockoupxy B peabHOM Kone BcTpevalorca 06e popME|, CeAyeT MPUBbIKaTd Ht K TOI, HK apyroit. Vrepatoppt STL cmogesMposanbl Ha OcHOBRe yKa3aTeneit, noaTOMy iterator BeweT ce6a no4uTH Kak yKa3aTenb T*. O6naBsmeHHe Const-HTepatopa Nos06HO ObbABNEH IO const-ykasaTea (To ecTb sanucn T* const): HTeparop He MOXeT Ha4aTb yKa3bIBaTb Ha 4TO-TO APyroe, HO TO, Ha 4TO OH yka3bIBaeT, MoxeT 6bITh MOZHULMpoBAHO. Ecan Bot XOTHTe HMeTb HTepaTop, KOTOpbIii ykasbIBast Obl Ha HeE4TO, YTO sanpelleHo MOAKHUM- posatb (To ectb STL-anasor yKasatesa const T*), To BaM MoHaAOGuTCH KOHCTALTHDIit wuTepatop: std::vector vec; = // xter paSoraeT Kak T* const vec.begin(); iter = 10; J/ Ok, uaMensetcA To, Ha 470 // yeasspaer iter titer; // oww6Ka! iter KoucraMrHei Npasuno 3 tt mE std::vector::const_iterator citer = // citer paSoraer xax const T* vec.begin(); ‘citer = 10; // oww6xa! *citer KoucvanTHeh +eiter; // wopmansuo, citer usmexserca Hekortopuie u3 Han6onee MATepecHbIx MpuMeHenuil const cBAsaHbI C O6bABIEHHA- Mu (byHkuHit. B stom cy4ae const MOxKeT OTHOCHTECA K BOSBpalllaemomy cpyHkuvel 3HaYeHUi0, K OT[@TbHBIM Napametpam, a AK cbyHKuuit-anenop — eme uk byHKuMH Bes10M. Ecam ykasat» B OObABeHUM PYHKUMM, 4TO Oa BOSBpalllaeT KOHCTAHTHOe 3Haye- HME, TO MO2%KHO YMCHBIHTb KOAMYECTBO OWMOOK B KMeEHTCKHX MporpaMMax, He CHH- 2a ypoBia GesonachocTH u addextHsnoctu. Hanpumep, paccMoTpHM o6paBrenne cbyHkwun operator* 714 panuonamDHBlx YceN, BBEFeHHOe B MpaBune 24: class Rational (..) const Rational operator* (const Rationalé lhs, const Rationalé rhs); Muorue nporpaMMucTsI YAMBATCA, BrepBbIe yBHAeB Takoe OObABEHHe. Ilouemy pesyxnTat dyHkyun operator* zomKeH 6brTb KOHCTaHTHBIM O6beKTOM? TloTomy 4TO BIIpOTHBHOM C7y¥ae MOASOBATETb NOMYYHT OI BOSMOXHOCTS AeaTb BEULM, KOTOPBIe Maye Kak HapyraTeTbCTBOM Hay 31paBbIM CMBICIIOM He HazOBellb: Rational a, b, c: (a*b) =¢7 // npyceaveanne nponspexenmm a*b! AA ne 3nai0, c Kakoli craTH nporpaMMHcTy MpHu10 Obi B roOBy NPUCBaMBaTh 3Ha- 4eHHe MPOHSBeAeHHIO ABYX YHCEM, HO MOTY TOUHO CKa3aTb, YTO MHOrMa TaKOe MOET cayuuTaca Mo HegocmoTpy. JlocraTouHo npocToii oneyaTKU (pH YCAOBHH, YTO THIT MoakeT 6sITb MpeoOpasozax kK bool): if (a*b = ¢)... // waenoce » euay cpasnenne! Taxoit Koz 6n11 651 copepmieHHO HeKOppekTHbIM, ecu 6b1 a Hb HMenM BCTpoeHHbIt tun. OnHUM 3 KPHTepueB KayeCTBa MOTESOBATEBCKHX THMOB ABIIAeTCH COBMECTH- MOCTb CO BCTpOcHHBIMH (cM. Tak2ke MpaBH10 18), a BOSMO2KHOCTb IIpHCBanBaHHA sHaye- HUA pesysIbTATy MpoUsRETeHHA ABYX OObEKTOB NpevcTaBAAeTCA MHe BeCbMa AareKol OT copMecTumoctu. Eciu 2ke OObABHTS, 4TO Operator* BOSBPalllaeT KOHCTAHTHOe 3HaYeHHe, To Taka CUTYAallUA CTaHeT HEBOSMOAHON. BoT mowemy Tak Caenyer Toctynate. B oTHOWeHHH apryMeHTOB C MOAHUKaTOpOM Const TpyZHO CKa3aTb YTO-TO HOBOE; OHH BeAYT ce6a Kak JOKaTbHbIe KOHCTAHTHEIe const-o6bekTH. Beroay, re BOsMOx- HO, Ao6aBaaiiTe TOT MomMUKaTOp. EcaH MomMdbMUMPOBATs apryMeHT HAH OKA bili OGbeKT HeT Heo6xogMMoOCcTH, O6DABHTE ero KaK const. Bam Bcero-To mpuneTca HaOpaTb WecTh CHMBOJOB, 3aTO STO NPeAOTBPATUT AOcCaAHbe OMIMOKM TuMAa <«xoTeT HalleyaTaTb ==, a H€YadHHO HalleyaTa =» (K YeMy 9TO IPHBOAHT, MbI TOKO ¥TO BHeNH). KoucravTHble PyHKYAH-4eHbI Hasnayenue moaucuxatopa const B o6baBenuu dbyHkuuii-w1eHOB — onpenenuTb, kakWe M3 HUX MOXKHO BBISBIBATD Jt KOHCTAHTHBIX O6bEKTOB. TakHe pyHKWHH-WJeHBI 2 Bavaa Ne E5948 EES Mpnyyaittect k C++ BaKHBI 10 ABYM npHunHam. Bo-nepsux, on obneryaior nOHMMaHMe HHTepdelica KuaCcca, Be MOTe3HO Cpa3y BUTT, KaKMe PYHKWMK MOLyT MOAUUNMpoBaTE O6beKT, akakue HeT. Bo-BTopstx, OHH OGecre4HBaloT BOSMOXAKHOCTD paGoTaTb C KOHCTAHTHBIMH. O6beKTaMH. ITO OYeH BaxKHO Wd HANHCaHHA aeKTHBHOFO KOMa, MOTOMY 4TO, Kak o6bacHaerca B Mpapuine 20, OH M3 OCHOBHEIX cOcO60B NOBBICHTL NPOKSBOAKTEb- HOCTS NporpamM Ha C++ — nepezapaTh O6beKTHI MO CCbIIKe Ha KoncTanty. Ho ata Tex- HHKa 6yneT paboTaTb TOMBKO B cry¥ae, Kora PYHKUMU-WeHBI Wid MaHUNyaMpoRa- HHA KOHCTaHTHBIMH O6beKTaMH OObABIEHI C MOLKUKATOPOM const. Mnorue ynyckawr u3 BHzy, ¥TO yHKYMH, OTMMYaIOMIMecA TOTDKO HamH4HeM const 8 OObABIEHHH, MOryT 6EITb neperpyeHbI. ITO, OHAKO, BaxKHOE CROICTBO C++. PaccMoTpuM Kilacc, npeacraBrsounii 610K TeKcra: class TextBlock { public: const charg operator[] (std::size_t position) const // operator[] ana (return text [position] +} // KOHCTAHTHEX OObEKTOB chars operator(] (std::s1ze_t position) // operator (] ana (return text [position] ;} // ReKOHCTAHTHHX OObEKTOB private: std::string text; h @yxxuno operator[] 8 Knacce TextBlock MoxkHo Hcno1s30BaTs Ce_yIONKM 06- pasom: TextBlock tb("Hello”); Std::cout << tb[0]; // puson HeKOKCTaRTHOTO // onepatopa TextBlock: :operator [} const TextBlock ctb(“World” Std::cout << ctb[0}; // sus08 KoHCTaHTHOrO // onepatopa TextBlock: :operator [] Ketatu, KOHCTaHTHBIe OGbEKTH Yale BCeTO BCTpeyaloTCA B PeabuBlx MporpaM- Max B pesy.mbTaTe MepemayH M10 ykasaTemI0 WIM CoBITKe Ha KOHCTaHTy. IIpupenennutit ple MpuMep Ctb ABAAeTCA JOBODHO UcKyccTBeHHDIM. Ho Bor Bam Gostee peamuc- Taye: void print (const TextBlocké ctb) // = 300% dyaxumm ctb — counKa // ma KouctantHuk oveKT { std::cout << ctb[0]; // pesos const TextBlock::operator() ) Tleperpy2xas operator[] 1 cosqaBas pasu4HBIe BEPCHH C pasHBIMH BOSBpalilaeMBl- MM THIIaMH, Bbl MOXETe NO-pasHomy O6paOaTHIBaTbh KOHCTaHTHBIe H HEKOHCTAHTHBIC o6pextut TextBlock: std::cout << tb(0]s /] HOpManbHo — untaerca // nekoncrantunh TextBlock thlO] = x; // wopmansHo — nuwerca // weKoHCTanTHLh TextBlock Npasuno 3 std::cout << ctb[0]; J/ wopmansxo ~ yuraetca J] woucrantHait TextBlock etb[0] = ix’: // ownoKa' — sanuce /} xoncrantHoro TextBlock Ormertum, 4T0 ommn6Ka 3n€Cb CBASAHA TONDKO C THTOM 3Ha4eHHA, BOSBpaulaeMoro operator[]; caM BbI30B Operator[] mpoxogHT HopMasbHo. [IpwunHa omm6Ku — B TO- TITKe MPHCBOUTE 3HadeHHe OGpEKTY THMAa Const char&, OTOMy 4TO 3TO HMCHHO Ta- Koli Tum Bosspaulaetca KOHCTaHTHO! Bepcuelt operator[]. Ormerim Takxe, 40 THN, BOSBpauLaeMBIti HeKOHCTaHTHOit Bepcueit operator[], — 97O ccBiiKa Ha Char, a He cam char. Ecan 6p! operator[] sosppamian mpocto char, To culegyioulee npedmorkenve He CKOMMMANpOBaOCh Opt: eb0} = tx'e 10 o6pacHseTCA TeM, 4TO BOSBPaulaeMoc *yHKUMCil 31a4eHHe BCTPOeHHOTO THNA MOZM@UUNpOBaTh HeKoppeKTHo. Jlaxe ec.1H 6pl 9TO Gpl0 ONycTUMo, TOT cbaKT, ¥TO. C++ nosppaulaeT o6beKTEI 10 3Ha4eHHio (cM, npaBHao 20), osa4an 6bl creayiomle MoghuyMpowamacs xonus tb.text(0], a we camo snauenue tb.text[0]. Bpag an 970 To, Mero Bbl OKMaeTE, Jlanaiire HemHoro nepejoxHem M noduaoccodcrayem. Uro o3HavaeT AA yHK- UMH-WreHa OxITs KoHCTAHTHON? CymecrByeT Ba WIMpOKo pacnpocrpaneHHWx MOHA- THA: NO6umoean KONCMaNmMHOCMd (TaKxKe U3BECTHaA Kak PusuvecKan KOHcCmanm- ocmb) M aoewueckan KouCmanmuocme. Croponuuku no6uToBol KOHCTalITHOCTH MomaraioT, 4TO cbyHKWHA-WIeH KOH- cTaHTHa TOrga H TOABKO Tora, KOrZa OHa He MOAMPUUMpyeT HKaKHe JaHHBIe-WWIEHBI o6pekTa (3a HCKIIOVEHHEM CTAaTHYECKHX), TO ECTD He MOAMHUMpyeT HM OHOTO 6uTa BHYTpH O6bekTa. Onpetesenve No6uTOBO!i KOHCTAHTHOCTH XOPOUIO TeM, 4TO ee Hapy- MleHHe Jerko OGHapy:KHTb: KOMMMAATOP NPOCTO MuLeT NPHCRAMBAHKA WieHaM Kaacca. @aktHueckH, NOGHTORAA KOHCTaHTHOCTb — 9TO KOHCTaHTHOCT, onpefewieHHaa B C++: (PyHKWHA-41eH C MOLHHKaTOpoM Const He MoxkeT MOLHUMMpoBaTL HecTaTHYecKHe AaHHbIe-WeHbI O6beKTA, 1A KOTOPOFO OHa BbI3BaHa. K coxkasenmio, Muorne tpyHKUMH-"1eHLI, KOTOpble BeilyT Ce6A DayeKO He KOHCTAHT- Ho, MpoxogaT no6utossiii tect. B vactHoctu, pyHkKuMA-4eH, KoTOpad MogMuUU- Pyer TO, Ha TO yKasbiBaeT yKasaTeb, YaCTO He BeneT CeOa KaK KOHCTaHTHas. Ho ecan O6beKTY NPHHALIeKUT TONbKO yKa3aTeNb, TO (pyHKUHA POPMaMBHO ABIAeTCA NOGH- TOBO KOHCTaHTHOM, H KOMIMJATOP He CTaHeT BO3paxKaTb. ITO MOXKET MPKBECTH K HEO- KN JanHOMy MoBezeHuI0. Hanpumep, ipeanoz02%xKMM, 4TO EcTb Kacc NogOGHBIt Text- Block, rae qanuate xpaatca B cTpoKax Tuna char * BMecTo string, MOcKOTbKY 9TO HeOOXOJMMO AJA Nepenain B cyHKUMH, HaMcanHsle Ha A3bIKe C, KOTOpbIit He MOHH- MaeT, 4TO TakOe OObeKTHI THMAa string. class CtextBlock { public: char& operator [] (std::size_t position) const —/// Heynaunoe (to nOGHTOBO ( return pText [position] } 7/ xoncrantHoe) /] OGpasnexne operator (} Ee private: char *pText; Npnysaittecs k C++ Batom kaacce byHkyua operator[] (HenpaBwabHo!) O6baBneHa Kak KOHCTAaHTHAAt (pyHkuMa-aen, XOTA OHa BOSBpalllaeT CChIIKY Ha BHYTPeHHHe LaHHbIe OObeKTa (9Ta Tema o6cyakgaeTca B mpaBuste 28). OcraBuM STO 110Ka B CTOPOHE M OTMeTHM, YTO pea- mmgauna operator[] HuKak He Moguduunpyer pText. B pesyanrate KomnumATOp Cno- Kolin crenepupyet Koy Ana bynkunu operator[]. Beas ona qeiicTBuTenBHO ABIAeTCA NOG6HTOBO KOHCTaHTHOI, a TO BCe, YTO KOMNMATOP MoxeT MpoBepuTs. Ho nocmoTpu- Te, YTO Mpoucxoant: const CtextBlock cctb("Hello”); uw Ww a 4 uw char &pe = écctb{0]; *pe = OStaBneHue KoNCTaHTHOTO oGteKTAa Bu30B Const operator[] mma nonywenun ykasarena wa manube cctb cctb teneps umeer sHauexne “Jello” Hecomuenno, ects uT0-To HeKOppeKTHOE B TOM, 4TO BI COSMaeTe KOHCTAHTHBIL OGbexKT C ONpeerenHbim 3HaYeHHeM, BBISHIBAeTE A.A HETO TOAbKO KOHCTaHTHY10 cbyHK- UHIO-4ieH H TEM He MeHee H3MeHseTe ero 3HayeHne! DSTO NpHBOLUT Hac K NOHATHW JOrMyeCKOl KOHCTaHTHOCTH. CTOPOHHHKH 3TOIL cbunocodun yrBepxaalT, uo byHKyHH-wWeHBI Cc Const MOryT MOAM¢HUMpOBaTh He- koTopbie 6HTHI BBISBABINETO HX O6bEKTA, HO TOABKO Tak, YTOOBI MOMb3OBaTEMb He MOT storo o6xapyxuTbs. Hanpumep, sam Knacc CTextBlock mor 6bt KauwMpoBaTD MHy TekcToBoro 6.10Ka NIpH KaxKNOM sampoce: Class CtextBlock { public: std::size_t length() const; private: char *pText; std::size_t textLength; uw uw “ nocnenvee suuMcneHHoe SHaYeHKe ANH reKctosore 6noKa bool lengthIsValids KOppextia 4M aaMHa B nanH momen? size_t CtextBlock::length() const if(!lengthIsvalid) { textLength = std::strlen(pText); // oww6xa! Henbsa mpucnamnary lengthIsvalid = true; // 3uauenme textLength 1 } // lengthisValid » Koxcranraom // dyuKumn-unene return textLength; Sra peannsauna length(), koneuHo xe, He ABIAETCA MOOUTOBO KOHCTaHTHOIt, no- cKObKy MoxeT MOAMHUMPOBATS 3HAYeHHA ueHoB textLength u lengthIsValid. Ho B TO K€ BPEMH CO CTOPOHBI KaxK€TCA, TO KOHCTAHTHOCTH OObeKTOB CTextBlock sto He yrpoxaet. Oguako KOMMHMJIATOp He cormacer. On HacTaHBaeT Ha MOGMTOROH KOHCTaHT- noctn. Eto zenatb? Apasuno 3 Haar Peurenue mpoctoe: ucnomss3yitre MoauuKkaTop mutable. On ocpoG6oxmaet HecTa- THYeCKHe JaHHBble-41eHbI OT Orpanu4eHuit MOOUTOBO! KOHCTAaHTHOCTH: Class CtextBlock ( public: std size_t length() const; private: char *pText; mutable std::size_t texthength; // 9tm aanmwe-uneus sceraa MoryT OuTB mutable bool lengthIsvalid; // woauguunpowat, naxe B KOHCTANTHEX Me 71 dyaKunnx-unenax std::size_t CtextBlock::length() const i a£(!lengthIsvaliad) { textLength = std::strlen(pText); // veneps nopanoK lengthIsvalid = true: J/ snec TO xe ) return textLength; Kak u36exaTb AYONUpOBaHHs B KOHCTAHTHbIX W HEKOHCTAHTHbIX YHKYMAX-41eHAX Vcnonssonanue mutable — samevatespuoe peurenue npo61embI, korga No6uToBas KOHCTAHTHOCTs BAC He BMOMHe YCTPauBAcT, HO OHO He YCTpanaeT Bcex TpyaHocTell, cBaganHeix c const. Hanpumep, mpegcrabpre, yo operator{] B Kuacce TextBlock (u CTextBlock) ne TombKo BosBpaulaeT CCBIIKY Ha COOTBETCTBYIONMH CHMBON, HO TaKxKe MIpOBepAET BbIXOA 3a MpewerH MaccuBa, NPOTOKOMMpyeT HHCOpMallMW O AOCTyNe H, BOSMOXHO, 1axke MpORepAeT WeTOCTHOCTS AanHerx. Tlomemenue Beit aTol AOrHKH B OGe Bepcun cbyHKuMu operator[] — KOHCTaHTHY10 M HEKOHCTaHTHy10 (/axKe CIM 3a- 6bITH, 4TO TeMlepb MEI HMEEM HEOGSIUHO AIMHHbIe BCTPOeHHBIe CPyYHKMHH — CM. paBH- 10 30) — NpHBOdUT K TaKOMYy BOT HeyKsi0xKeMy KOLY: class TextBlock { public const chars operator [] (std C ize_t position) const // ssnonuurs mposepky rpauuu Maccusa : // npovoKormporats goctyn K qaHHEN wee // nposeputs uenocrHocTs maHHEX return text (position); } char& operator(] (std. size_t position) const ae // sunonumts nposepky Tpanwy MaccuBa ee // mpovoKonuposats gocTyn x maHKen wee // npopepts uenocrHocts aannx return text (position]; ERRMSG Npuyyarttecs k C++ private: stdistring text; te Ox! Hannuo ace HenpHaTHoctH, CBagaHHbIe C Ay61MpoBaHHeM Kola: yBenyeHve BPeMeCHU KOMIHJAUMH, pasMepa MporpaMMb! 4 HeyZo6crBo conponoxgenna. Ko- He4HO, MOXKHO MepeMeCTHTb Bech KOU AA MpORePKH BEIXOMa 3a rpaHMup! MaCCHBa mpouero B OTHEAbHY10 YHKIUMI0-wWeH (ECTECTBEHHO, 3aKPBITy10), KOTOPyt0 OyAYT BbI- 3bIBaTb O6e RepCHH Operator[], HO O6pameHuA K ITOH dyHKUHH BCE %*e GyayT Ay6nu- powarecs. B gelicraurenbHocrn G6pin0 6pt *KenaTeNbHO peamH30BaTh cbyHKHOHAT_HOCTS operator[] O2MH pa3, a HCMO1_30BaTb B AByX MecTax. To ecTb ofHa Bepcua operator[] AOWKHA BESbIBATb Apyryto. MW sto no_BOAMT Hac K BOMpocy 06 or6pachiBaHHH KOH- cTaHTHOCTH. C camoro Hayasla OTMeTHM, OTOpacblBaTb KOHCTaHTHOCTh HexOpowlo. A nocBaTHI yem0e Npavii0 27 ToMy, 4TO6nI yOeaHTb BAC He JeNaTb 9TOFO, HO AyOMMpoBaHHe Koa — Tome He caxap. B 1aHHOM Cry¥ae KOHCTAaHTHas BepcusA operator[] AeaeT B TOUHOCTH To Ke CaMOe, YTO HEKOHCTAHTHad, H OTAM4Me MexXLY HMMM — JMU B IpHCyTCTBHH Moguduxaropa const. B stoi cutyaunu or6pacnipatb const GesonacHo, NOCKOADKy Mom,gOBaTeNb, BEISBIBAIOMIMH HEKOHCTAaHTHI operator[], Tak HIM HHave NOIKEeH NO- JYYTb HEKOHCTAHTHBI OObeKT. Beqb B MpOTHBHOM Ca1yyae OH He CTaq Obi BbISHIBaTb HeKOHCTaHTHYW (byHKUMW. Ilostomy peamusalua HeKOHCTaHTHOrO Operator[] NyTeM BbIZOBa KOHCTAHTHO! BepcHH — 370 GesonacHblit croco6 136exaTb AyYOMMpOBAHHA Kona, Wake MycTb faxke Wa aToro Tpe6yeTCA BOCTIOMb3OBaTECA OTepaTOpoOM const_cast. Hike mpupenen nozyyaiouluiica B pesybTaTe KOA, HO OH CraHeT ACHEe NOCHE Toro, Kak BbI MpounTaere caenyioue jasee OGBACHEHHA: class TextBlock { public: const charé operator[] (std::size_t position) const// ro xe, uTo panpule return text [position]; } charé operator] (std::size_t position) const // reneps npocto // susupaem const op(} ‘ return const_cast( // ¥3 Bosppattiaemoro Tuna 17 opt) wexnpante const static_cast(*this) // noOasute const runy // *this {position} // puspats KoHCTaHTHYD M // wepcum op{] Npasuno 3 eo Kak BuaMTe, KOA BKO4AeT 1Ra NPHBEAeHHA, a He OHO. Mul XOTHM, 4TOOEI HEKOH- cTanTHbiit operator[] BsI3bIBaT KOHCTAHTHBIM, HO ECAH BHYTPH HeKOHCTaHTHOFO one- paropa [] mpocro BbI30Bem operator[], To Mony4nTCa peKyPCHBHbI BbIZOB, Bo 13- 6exanne GeckoHe4HOl pekypcHH HYXKHO yKa3aTb, YTO MBI XOTHM BbI3BaTb Const operator[], Ho mpamoro cnoco6a cAemaTb 9TO He cymlectByeT. loastoMy MBI NpHBOQUM *this or tuna TextBlock& k const TextBlock&. Jla, Mb BAINOAHAeM MpHBE_EHHE, YTO- 6n1 Oo6agume KOHCTaHTHOCTS! Takum o6pa30M, MbI HMeeM Ba NPHBeDeHUA: OLHO D0- 6apaser KoHCTaHTHOCTS *this (uro6nI 611 BEISBaH Const operator[]), a BTOpoe — Hc- kyHO4aeT Const H3 THT BO3BPalllaeMoro 3HayeHHA. TIpupenenve, koTopoe q06aB19cT Const, BbINoAIAeT GesonacHoe npeobpasoBanie (or HeKoncTaHTHOTO O6beKTa K KOHCTaHTHOMY), NOITOMY MbI HCMOb3YeM DIA STON wesK static_cast. IIpupenenive xe, KoTOpoe oT6pacwrBaeT Const, MoxeT GpITb BBLTON- HeHO TOKO C NOMOUL>IO Const_cast, MosTOMy y Hac 3eCb HeT BBIGOpa. (Crporo rozo- pa, BeiGop ects. IIpunegenne B crune C taxxe paGoract, 10, Kak 4 O6bACHAIO B Mpa- Buse 27, TakHe NPHBEEHHA PeAKO ABAAIOTCA NpPAaBHJIBHBIM pemleHHem. Ec BEI HE 3HaKOMBI c OnepaTopaMu static_cast 1.1 const_cast, npouraiite o HUX B MpaBiite 27.) TlomuMo Bcero npouero, B 9TOM MpHMepe MbI BbIsbIBAeM OMepaTop, NOSTOMY CHHTAK- CHC BBITIALUT HEMHOTO CTpaHHO. BosMOrKHO, STOT KO He 3aiiMeT NPH3 Ha KOHKypce Kpa- COTHI, 3ATO NOSBONACT NOCTHYD Hy2kHOTO adipexta — va6exaTe Ly61MpoBaHHA Nocpel- CTBOM peaJIH3al{uM HEKOHCTaHTHOM BepcHu operator[] B TepMuHax KoHCTauTHOH. 1 xora TUIA JOCTHKEHMA LETH NPHILIOCh BOCNOAD3IOBATHCH L€YKIIOKHM CHHTAKCHCOM, KOTOpHIii CMOXKETE NOHATS TOABKO BBL CAMH, O1NaKO TEXHMKa peaTu3allMM HEKOHCTaHTHBIX (byHK- Hii-41eHOR Yepes HEKOHCTAHTHbIe ONpezeeHHO 3acmy%KMBaeT TOTO, YTOOBI ee SHaTb. A eue Hy2KHO MMeTb B BHAY, TO pelaTh aTy 3agayy HaoGopor — MyTeM BBIsOBa HeKOHCTaHTHOM BePCHH H3 KOHCTaHTHOMi — HenpaBHabHo. IloMHHTe, YTO KOHCTaHTHaa byHKuna-wen OGemlaeT MMKOrga He H3MCHATh JOrH4ecKoe CocrosHue OObekTa, a He- KOHCTaHTHas He MaeT TaKHX rapaHTHit. EcaM Bei BbIsOBeTe HEKOHCTaHTHY10 (byHKUHIO M3 KOHCTaHTHOIt, TO PuCKycTe NOAYYMTS CHTyalMIO, Korqa O6beKT, KOTOpBIit He 2ON- 2%KeH MonuuuMpoBateca, GyneT usMeHeH. BoT novemy sTOFO He CeMyeT HeMaTb: 4TO- 6u1 O6beKT He M3MeHHCcA, DakrnyeckH, 4TObI MOMYYUTS KOMNMMpyeMbIit KOZ, BaM MpHULTOCe 6st HcMO1430BATS Const_cast 118 OT6pachiBaHHA KOHCTanTHOCTH “this, asTO ABHBIt NpUSHAK Heyna4Horo peulenHa. OGparTHaa NOCTELOBATENBIOCTS BEISOBOR — Takada, Kak onvcaHa Blue, — Gesonacta. HexonctatitHaa tyHKUMA-41eH MOKeT Je- WaTb BCE, YTO 3aXOUET C OObEKTOM, NOSTOMY BbISOB M3 Hee KOHCTAHTHOH cbyHKMMH- wea HH4YeM He rposut. TloToMy-To MBI MpuMexsem K *this oneparop static_cast, or6pacbiBaHHA KOHCTaHTHOCTH MpH ITOM He NpoHcxogHT. Kak 4 yxke ynOMuHad B Haare dTOrO MpaBiia, MoAMdHkaTop const — 4yqecHaa seus. 1a yka3aTesei u uTepaTopos; 114 OObeKTOR, Ha KOTOpble CChINaIOTCA yKa3aTe- JIM, WTepaTOphl H CCHIIKH; JWI MapaMeTpOB PYHKUMIt H BOSBPallaeMbIx MMU SHAYeHHI; AA WOKaTbHEIX NepeMeHHBIX, 114 (pyHKUMit-11cHOR — BcIogy const Ball! MOLLHBIi co- rosHuk. Acnoapsyiite ero, rae To.ABKO BO3MOX%KHO. Bam moHpaBHTcal Ymo caedyem nomnums 2 OGvannenne vero-nuGo c MOAHepiKaTopoM const HloMoraeT KoMNUATO- pam OOHapyxKHBaTb OWIHOKK. Const MOAHO HCNOAb3OBaTe C OObEKTAMH Ci Mpnyyaittece x C++ 8B mo6oi o6nactn qelicTBHa, c napaMeTpamu yHKuuit 1 BOsBpaltaeMBIx aHavennit, a TakoKe c PYHKUMAMH-41eHaMM B e0M. Kommmaarops! nposepsioT no6uToBylo KOHCTaHTHOCTS, HO BbI 1OKHBI IporpaMMuposart, IpHMeHAA OTMYeCKYI0 KOHCTAHTHOCTS, Kora koncranTubte 4 HeKOHCTaHTHBIe bYHKUMU-“eHbI HMeIOT, 10 CyTH, omMHakoBylo peanusallHio, TO Zy61MpoBaHHA Koja MOxKHO H362KaT, 3acTa- BMB HEKOHCTAHTHY1 BEPCHIO BbISbIBaTh KOHCTAHTHY1O. Mpasuno 4: Mpexge 4em ucnonbsoBatb OGpexKTHI, yGenurec, 4TO OHM HHKLWaNKsnpoBaHb! Ornomenne C++ k HHHWHaM3alMM 3HayeHuit O6beKTOB MO2KeT NOKasaTbCA CTpaH- ubim. Hanpumep, ecu Bbr mMueTe: int x; TO B HeKOTOpbIxX KOHTeKcTax NepemeHHas x 6yAeT rapaHTHpOBaHHO HHMWMaTH3MpOBa- va HyzeM, a B Apyrax — Her. Ecau bi numere: class Point { int x, yi Me Point pi To "neHbI-qaHHbie O6beKTa p HHOrZa GyAyT HHMWMANH3KpoRaHbl (HAMM), a MHOra — net. Ecan Bhi nepeuim kK C++ oT asbika, re HEMHMUMaIM3KpoBaHHble OObEKTHI HE MOTT cyllecTBOBaTS, O6paTHTe Ha 970 BHMMaHHe. ‘Urenve HeMHMUMaIM3MpOBaHHbIx 3HadeHuit MOxeT ObITh NPHYMHO! HeonpeeeHHOTO: nosexenus. Ha Hexoropix miatdopmax Takoe mpocroe jeiicTBMe, Kak HOCTYTI K HeMHMWHH- POBaHHOMy SHa4eHHI0 AJA YTeHHA, MO2KET BbISBATS aBapUiiHy10 OCTaHOBKY NporpaM- bi, Ho yaue BbI Monyynte cayyaitnstit Habop GUTOR, KoTOpsIit UcNOpTHT BHYTpeHHee cocToaHne o6neKTA, B KOTOpbIii OHM SaNUCbIBAIOTCA, HB KOHE4HOM HTOre 9TO NpHBeneT K HEOOBACHHMOMY TlOBeeHHW0 NPOrpaMMbt H /VIMTesIbHOMY NOKCKY OWIMOKH B OTA 4HKe, Ccbopmynupyem npapua, KoTOpble ONMCEIBAWT, Kora MHUMATM3aHA OODEKTA TapanTupyerca, a korga Het. K coxkaleHMn, 3TH MpaBlisa NOCTAaTOYHO C1O%KHbI — Ha MOit BSTAL, CAMUIKOM C/OXKHI, YTOOEI UX CTOWO sanoMHHaTh. Boobute, ecm BI paGotaere c C-yactbio C++ (cm. mpapwo 1) 4 MHAUMaTH3all4A MOET CTOHTE ONpezeneHHBIX 3a- Tpar BO BpeMa HCNOAHEHHS, TO He rapaHTHpyeTcs, 4TO OHA NPOMSOii eT. ITO OObACHAeT, Touemy comepakuMoe Maccusos (B C-4actru C++) ne o6a3aTerbHO HHMUManuspyerca, a cogepxkuMoe BeKTopa (u3 STL-yacru C++) nuvumanuanpyerca Bcerga. Tlo-Buaqumomy, 1yummit cnoco6 nopedenua B Takoli HeonpenenenHo! curyanuu — 6cez0a MHMUMaTH3MpoBaTb OObeKTEI, Mperkme ¥eM HX UcTOnbZOBATD. Ana O6beKTOB BCTPOHHBIX THIOB, HE ABIAIOUIAXCA JIEHAMH KNACCOB, ITO HY%KHO 1eaTb BPYYHYIO. Hanpumep: int x = 03 // pywnan mamunanasauna int const char * text = “Crpoxa = crune C”; — // pyunan MMumannsaunn yKasatena J/ (em. vaxxe npasvno 3) Mpasuno 4 TTT Lt as | double d; // «vununansauna» wrennex std::cin >> dy // m3 BxomHoro noTOKa Tloutu Bo Bcex OcTasbHBIX CYYaAX OTBETCTBCHHOCTD 3a MHHUMAM3AlH10 NOKUT- ca Ha KoHCTpykTopni. IIpasuno mpoctoe: y6equTecb, 4TO BCe KOHCTpyKTOpbi HHHUHA- JM3pyT B OGbeKTe B STOMy mpaBMary jerKO CrenORATs, HO BaxKHO He NyTaTb MpUcBaMBaHHe Cc MHMIHA- ausauneit. PaccmoTpuM KOHCTpykKTop Ku1acca, MpeACTaBMAIOUIerO 3aNlHCH B alpecHoit kuure: class PhoneNumber { .} class ABEntry ( // ABEntry = “Address Book Entry” public: ABEntry(const std::string&é name, const std::stringé address, const std::list& phones); private: std::string theName; std::string theAddress; std::list thePhones; ant numTimesConsulted; Me ABEntry (const std::string&é name, const std tringé address, const std::lists phones) t theName = name; // sce 390 npuceanpanne, a He yuMuMannaauna theAddress = address; thePhones = phones; numTimesConsulted Za, B pesyaprare nopoxgawrca o6vexts! ABEntry co 3Ha¥eHHAMH, KOTOPBIX BbI ookvigaeTe, HO 9TO BCe 2Ke He TyMMIMH No”xog, IIpasuna C++ oropapHBalr, YTO WeHET o6beKTa HHMMMUpyIOTCA neped BXOAOM B Te KOHCTpykTopa. To eCTb BHYTPH KOHCT- pyktopa ABEntry uenut theName, theAddress u thePhones He HHHUMaM3sHpywTca, a MM npuceausaromcs sHaxenua. MHMuManHsauna MpOMCXOgHT pate: Kora aBToMa- THYECKH BbISbIBAIOTCA MX KOHCTPyKTOpbl Mepea BXONOM B TeNO KOHCTpyKTopa ABEntry. 3ro ne Kacaerca numTimesConsulted, nockombKy ator wen OTHOCHTCA K BcTpoeHHomy Tuny. J[14 Hero HET HHKaKHXx rapaHTHii Toro, 4To OH BoobmLe 6yneT HHMMasManpoBaH Nepen MpHcBaMBaHHeM. Jlyumuit cnoco6 Hanucanua Konctpyktopa ABEntry - ucnons30Bats cnvcoK MHMHaTMgaNMH YIeHOB BMeCTO IIpHCBaKBaHUA: ABEntry(const std::string& name, const std. const std::list& phones) :theName (name) , // veneps 370 Bce — uknunannsaunn theAddress (address), thePhones (phones) , numTimesConsulted (0) a // veno KoHCTpykTOpa Teneps nycTO OTOT KOHCTPyKTOp faer TOT 2Ke caMbili KOHEYHEIM pesybTAT, YTO M NpeABIAyni, HO ¥acTO OKasbiBaeTca Gonee adexTHBHLIM. Bepcus, OCHOBaHHad Ha NpHCBaKBaHH- AX, CHA4aIIa BBISKIBAeT KOHCTPYKTOPBI NO YMOIYaHMO UIA MHKUMaTH3anMH theName, tring& address, CR: Fpnyyarttect k C++ theAddress 1 thePhones, a 3aTem cpa3y IIpHCBaMBaeT HM HOBbIe 3HAyeHHA, 3aTHpas Te, ¥TO yxke GbLIN MPHCBOeNEI B KOHCTPykTOpax NO yMosu4aHHIo. Takum o6pa30m, BCA pa- 60Ta KOHCTpyKTOpos M0 yMoul4aHHl0 TpatHTca Bityctyto. [loxxo co cnMcKOM MHMIMa- IM3aLlMH YWIeHOB MOSBOACT 136eKaTb ITOH MpoGeMbI, MOCKO/bKy apryMeHTDI B CHCKE HHHUMaTH3aHH MCMOALSyIOTCH B KAYECTBE APyMeNTOB KOHCTPYKTOPOB JLT pas1H4- HBIX 4W1eHOB-AaHHbIX. B atom cayyae theName cosgqaeTca KOHCTpykKTOpOM KoMMpo- Banus H3 name, theAddress — u3 address, thePhones — u3 phones. J[na GorbumucTBa THILOB CAMHCTBEHHDI BbI3OB KOLCTpykTOpa KonMpoBaHna Gosee acpcpexTHBeH — HHOT- a Hamnozo Gonee apekTHBeN, FEM BbIZOB KOHCTPYKTOPOB MO YMOs¥AHHIO C MOC TELyI0- IJHM BbIZOBOM OMepaTOpoB MpHcBaHBanna. Zax o6bexktos Bctpoennstx THOR Bpoge numTimesConsulted Her pasnHub! 10 3aTpaTaM Mex Ly HHMWHaH3alHeli H MpAcBanBalineM, HO 1A eAMHOOOpa3zia YacTO sy4lle HHHWMMpOBaTb BCe NOCPeACTBOM CMMCKa MHKUMAIH3alMH YIeHOB. TaKue CICK MOKHO MpHMeHATS Jake TOMA, KOTMa AHHbIe-41eHbI HHMUHAM3MPYIOTCA KOH- CTPykTOpaMH I10 YMO.1YanMiO: MPOCTO Hie MepesaBalite HHKaKMX apryMeHTOB CooTBeT- cTBylomjemy Kouctpykropy. Hampumep, ecu y ABEntry ecTb KoncTpykTop, He MpH- HMMaioulMit apaMeTpos, TO OH MOxeT GbITL peayM30BaH MPHMEPHO Tak: aABEntry () :theName(), // su38aT KOHCTPYKTOP No yMonuaHWn ana theName theAddress (), // caenats To xe nna theAddress 4 ana thePhones; thePhones(), // Bo AHO vNuUManNaMpoRaTS HyneM numTamesConsulted numTimesConsulted(0) ce Tlockompxy KOMMMAATOp aBTOMATITYECKH BbISbIBAeT KOHCTPYKTOPHI MO YMOMHAHHIO JIA JaMHbIX-4IEHOB MOsb3OBATEALCKHX THMOB, KOTMa 1A HUX OTCYTCTBYIOT MHMUHa- AM3aTOPbI B CHMCKE MHNUMATH3ALHH Y1eHOR, HEKOTOpbIe NMpOrpaMMHcTDI CUHTalOT NpHBeLeHIbIi BEILE KOs, H3ObITONHDIM. ITO NONATHO, HO, MIPHepxKHBAACh NOMHTHKK Bcerla MepeynCAATL BCe HAHHLIe-YeHLI B CMCKaX HHMUMaIM3alHH, BbI H3OaBrAeTe ce6a OT HeOOXOAMMOCTH MOMHNTE, KakHe ¥enb! 6yzyT HHHUMaTH3HpOBallhl, ECAH AX mponycrur, a Kakuve ~ Het. Hanpumep, mockonbKy numTimesConsulted orHocutcs K BCTPOeNHOMY THITY, TO HCKMOYEHMe eo H3 CNHCKa MHHUMAAH3allHH MOXKET OTKPbIT ABepn HeonpeserenHomy noBezeHno. VWnorga cnvcoxk nHMiMarH3annn MpocTo neo6xodumo HCNOMD3OBaTS, MaKe 118 BCTpOeHHBIX THNOB. HanpHMep, AaHHbIe-WICHbI, KOTOPLIe ABAAIOTCA KOHCTAHTaMH sm60 ccblikamH, 0613aHbI ObITb AHMUMaM3MpOBaHbI, Tak Kak OHH He MOTYT MOYYHTb aHaveHHa MocpescTBOM npHcBanBanna (cM. TakxKe mpaBHno 5). Uro6pi u36exKaTp He- O6xXOAHMOCTH NOMUMTS, KOTMa LaHHbIe-GeHB! LOJKHBI OpITh HHUNHAAM3KpOBaHEt B CIMCKe HHMUMasH3allHH, a KOTAa ITO He OGAZaTEABHO, Mpowe AeAaTD ITO ecezda. Wnorna ato o6a3aTerbo, a uacro ~ Gostee adpeKTHBHO, 4¥eM NPHCBaNBaHHe, Bo MHOTHX KaccaX CCTb HECKOABKO KOHCTPYKTOPOB, H Ka2KAbIii KOICTPYKTOD HMeeT cBoii co6crsennbiii cnucoK HnMiMamHaauun. Ean y Kilacca MHOro TaHHuX-Ys1eHOB HH 6a30BpIx KMAaCCOB, TO HamM4ne GoAbUIOTO 4HC1a CNMCKOB HHH Mani3alMH Mopoxlaer HexeJlaTembHoe AYOAMpoBaHHe KOMa (B CIMCKaX) HM TOCKy (y mporpammucros). B Ta- KMX CJLyYaAX MMECT CMDICA ONYCTHTD B CNHCKAX HHHUHAIM3alMH TC aHHbIe-41eHbI, 1A KOTOpHIX MpHCBalBaHiic paoraer Tak 2ke, Kak NacTOAMAA HAWMMATH3aNHA, Mepe- Npasuno 4 TL 43 | MeCTHB HHVUMaTH3ay Mio B OLY (O6LI4HO 3aKpEITYI0) (PYHKLUMI, KOTOPY10 BBI3bIBaIOT BCe KOHCTpyKTOpbI. Dror nosXo_ MOxeT GpITh ocobeHHO MONEseH, CIM HatanDHDIe 3HaveHHA JomKHEI 6EITS 3arpyxenbI H3 dbaiina WM 6a3bI 2aHHEX. OxHako, Boobme TOBOPA, HHMWHaIM3aHA WJIeHOB MOcpeACTBOM CIMCKOB MHMUMaH3aMH Gonee npen- TOUTHTeNbHa, YeM TICeBLOMHHUMATHsaUHA NPHCBaMBaHHeM. Ogun us acrextos C++, Ha KOTOpbIli MOXKHO MONOXKUTBCA, — 9TO MOPANOK, B KOTO- POM MHHUMaM3upyloTca JaHlble OObeKTOB. ITOT MOpAMOK BCerfa OAM H TOT xe: 6a- 30BbI€ K1aCChI HHHHAIM3HPYIOTCA PaHbille MPOHSBOAHBIX (CM. TakoKe mpaBHsIO 12), @ BHYTPH Kracca WIeHBI-aHHble HHHUMAIM3HpyIOTCA B TOM MOpAAKe, B KOTOPOM o6pannensi. Hanpwmep, 8 knacce ABEntry utex theName sceraa 6yner uMManH3H- poban nepsuim, theAddress — propuim, thePhones — tperbuM, a numTimesConsulted — NOCsEAHHM. ITO BepHO AaxKe B CYYae, ECM B CHHCKE HHMWHAIN3aM WeHOB OHH mlepeYHcueHb! B ApYroM NopsKe (4TO, K COKaTeHHIO, He 3ampenyeno). UroGpi He BBO- TMT» B 3a6.1y%KeHKe YesOBeKa, YHTAIOMIerO Bally NporpamMy, H Bo H36exKaHHe OH6OK HEMOHATHOTO NPOMCXOKACHHA, BCerna NepeyHcsAalite AAWHbIe-WIeHb! B CICKe MHH- UHasM3allHH B TOM MOpAAKe, B KOTOPOM OHH OGbABsEHDI B Kuacce. TlosaGoTHBmncs 0 ABHOM HHMNHaTHZANHM OObEKTOB BCTPOEHHEIX THIIOB, KOTOpEIE He ABIAIOTCA WIeHAMH K1accoR, 1 OGecreuMB NpaBHbHYWO HHH UHATH3aHtO 6a30BbIx KaCCOB H MX JaHHbIX-WIeHOB NOCpeACTBOM CIMCKOB HHMUHATH3ayHH, y Bac OCTaHeT- C81 TOKO OfHa BeUIB, O YeM HYXHO OyneT noxyMaT. Peus Umer O MOpaKe HIMUHA- JIM3alMM HeENOKaIbHbIX CTaTHYeCKHX OObEKTOB, OODABNEHHBIX B PASHBIX EMMHUTAX TpatcaAaunn. Ornecemca k aToii pase co BceM BHHMaHHeM. Cmamuueckuii o6oexm cyulectByeT OT MoMeHTA, Kora 6111 CKOHCTpyHpOBaH, H 10 KOHua pa6orL! mporpaMMbl. OGvekrbi, pasMeneHHble B CTeKe HB nopanoK MHHMMHa- JM3aUMH HeNOKaMbHBIX cTaTHYecKHx O6beKTOB TpyAHO. Oven» TpyaHo. Hepaspemm- Npasuno 4 TT 4s | Mo Tpyauo. B Han6onee o6ulem cay4ae — pH HaMYHM MHOTHX eAHHHL TpaHCAAWHH Hh HJOKaJIBHBIX CTAaTHYeCKHX OOLEKTOB, CreHepHPOBAaHHBIX MyTeM HeABHOM KOHKPeTH- 3a1Mv m1a610HoB (KOTOppie H CaMH MOryT GbITb pesybTATOM HeABHOH KOHKPeTH3a- HH ApyrHx m1a60HOB) — He TOALKO HEBOSMO2XKHO ONpezeAUTS NpaBMIbHbIi MOPALOK HHHHATHIAYHH, HO OOLIMHO a2Ke He CTOHT HCKATb YACTHBIE CAY4AH, Kora BTOT T0- PALOK B NPHHUHNe ONpexeAMTb MOXKHO. K cyacrw, HeGomblloe H3MeHeHHe B MIpoeKTe NpOrpaMMb! MO3BOMAET NOMHOCTBIO ycTpanutp sty npo6semy. Hy2Ho Mum nepeMecTHTb Kaxkablit HemOKaMbHBIit CTaTH- ueckHii o6bexT B OTAEbHY10 (yHKUHIO, B KOTOpo!i OH 6yneT O6bABNEH CTATHMECKUM, OTH yHKUMH BOSBpaUaioT CCbIIKH Ha O6bEKTEI, KOTOpbIe B HHX comepxKatca. Knuex- ThI 3aTeM BLISLIBAIOT (PYHKUMH BMeCTO HENOcpeACTBEHHOrO OOpameHHa K O6bEKTAM. Jipyrvmu cioBaMH, HeOKaJIbHbIe CTaTHYeCKHe OOLEKTHI SAMEHAIOTCA NOKAAONDIMU cTaTHYecKHMH O6beKTaMH (3HaKOMEIe C MaTTepHaMH MpoeKTHpOBaHUsA erKO y3Ha- IOT B 9TOM ONMcaHHH THMMYHY1O peamm3ayuio naTTepHa Singleton). OTOT Nozxog OCHOBAaH Ha TOM, 4To C++ rapaHTHpyeT: JOKaIbHbIe CTaTHYeCKHe o6beKTbI HHHUMAIM3HPyIOTCA B NepBbiii pas, Korga onpeseneHHe ObbeKTa BCTpeyaeT- ca Mp BpIsoBe aTOH cbyHKunn. TlosToMy ecsIM BbI 3aMeHUTe NpaMolt AocTyn K HenO- KabHBIM CTaTHYeCKHM OGbeKTaM BbISOBOM yHKUMii, BOSBpalaiollHx CCHLIKH Ha pacmlonoxeHHble BHYTPH HUX JOKaTbHbIe CTaTHYECKHE OObEKTHI, TO MOXKeTE OBIT yBe- PeHEI, YTO CCHIIKH, BOSBpallaemble 43 byHKunit, 6yAyT CChINaTbCA Ha MHMUMaM3Kpo- BaHuble OGpexTHI. JLONOMHNTesbHOe MpeHMYIECTBO 3aKMOYAETCA B TOM, 4TO CCIM BbI HMKorua He BbISbIBaeTe CyHKUHIO, SMyJIMpyoulylo HeTOKaMbUbIt craTHueCKHit OGbEKT, TO W He MpweTcA M1aTHTb 3a CO3qaHMe HM YHHYTOKeHNe OGbEKTA, YeTO HE CKAKEIIb O peawbHbIX HENOKAIDHDIX CTATHYeCKHX OGbEKTAX. Bor kak 9TOT mpviem mpHMeHsetca K O6vextam tfs m tempDi class FileSystem {...}7 // sax pansue FileSystems tfs() // 20a dyHKunn saMeHReT OGtext tfs, ona MoxeT { // Outs crarwuecKow B xnacce FileSystem static Filesystem fs; // onpenenenwe 1 uHnuKanusaunA noKANbHOrO // crarmueckoro obvexra return f5; // sosppa? ccunky a Hero } class Directory {...}; // wax pansue Directory( params ) // xax paste, Ho sMecTo ccunk Ha tfs J/ pesos tfs() rsaze_t disks = tfs() .numDisks(); Directorys tempDar () // ava gyuKxuKA samenner OGtexr tempDir, ( J/ woxer OTS cTraTHyecKo% B Knacce Directory static Directory td; // onpenenenve/umuunannsauna noKanbuoro // crarnueckoro oGsexra return td; // Bosppat ccunkH Ha Hero EU Fipnyyaitect k C++ Kanentsr paSoraior c atoit Moaunmponannoit mporpamMoii Tak >e, Kak paHb- Ue, 3a ACKIO4eHKeM TOF, YTO BMecTO tfs H tempDir oun Tenepp o6pamatoTca K tfs() H tempDir(). Vrpimn cropamn, HCnomBsylOT CCBLIKM Ha OOBEKTEI, BOSBpaMIeHHpIe byHK- IHAMH, BMeCTO HCMOb3OBaHHA CaMHX OObEKTOB. Dyxkunu, Koropule B cooTBeTCTBAH Cc AaHHOM cxeMoi BOsBpamaloT CCBLIKH, BCer a MPOCTHI: O|PeAe AMT MH MHMWMAaTH3MpORATh MOKA bHBI CTATHUECKHt OObEKT BCTpoxe 1 M BepHyTb eFo B CTpoke 2. B cBa3M C THM Y BaC MOXET BOSHHKHYTD HCKyile- Hue OGbABHTD HX BCTPOCHHEIMH, OCOGEHHO, ECM OH YaCTO BbIsBIBAIOTCA (CM. MpaBH- 0 30). C apyroit cropoust, ToT cbakT, UTO 3TH by HKWHH ComepxaT B ceGe cTaTHYeCKHe OGBeKTH, YCNOKHACT HX MPHMeHeIMe B MHOronoTOUHBIX cHcTeMax. Ho TyT HHKyna He MeTbCA: HEKOHCTAHTHEIC CTaTHYecKHe OObeKTHI J1060r0 posa — OKAIHBIC HIM HeN0- KaJIbHbie — pecTaBAAIOT UpObIeMy B CAy4ae HANWYHA B IPOrpaMMe HECKOJIBKHX T10- TOKOB. PewMTh cc MOXKHO, HAMPHMep, BMISBAB CAMOCTOATEMDHO BCe PYHKUMM, BOSBPA- maloulHe CCbIIKH, Ha 9Talle 3amycKa MporpaMMni, Korma emte paGoTaeT TONLKO OLMH NOTOK. DTO HCKMOYNT HeOMpeseTeHHOCTS B XOZe HAKUMAINZAIHH. Koneuno, npumetumocts Hazen pylik nit, BOsBpalttaloulHx CCbIIKH, IIA NpemoTB- pamleHHa npoG.1eM, CBASAHHDIX C MOPALKOM HHHUMaJIH3alMH, 3aBHCHT OT TOTO, CyulecT- BYeT JIM B IPHHUMNe pasyMHbI NOpALOK HHMYUKaTN3aUHH BawUXx O6peKToB, EcaH BbI HaMHuleTe KOA, B KOTOPOM O6bexkT A OmKeH ObITh HHMUHAaIMsHpoBall Mpexkse, 1M o6vext B, 4 ogHOBpeMeHHO caenaeTe MHHUMaNH3auHio A 3aBMCHMOil OT HHKYHasIH3a- uuu B, To Bac 2*ayT Mpo6sembI — 1 Mogenom! Ecru, ognaxo, Bui Gygere n36eraTb TaKHX MaTOMOTHYeCKHX CHTYaUHii, TO OMMCariaA CXeMa COCYXHT BaM LOOpyio cary>%*K6y, m0 Kpaiineit mepe, B omlionoTountx npHAO-KeHMAX. Taku o6pasoy, ¥To6n 136exKaTb HCMOb3OBaHA OGbCKTOB AO MX HHH YMaH3a- UMM, BaM CjleflyeT cilenaTb TpH BeuIN. TepBoe: Bpy4Hy10 HHHWHaTHsHpoBaTD He AB- AmoulMecd wena O6beKTH BCTPOeIbIX THNOB. Bropoe: HcNOAb30BaTb CNMCKH HHHUHAIM3aHM WICHOB Aa Bcex YacTeii O6bexTa. HM nakoneu, TpeTbe: OOofiTH 3a cyeT MpaBHsIbHOro MpoekTHpoBaHHA Mpo6semy HerapaHTMpoBaHHOrO MopaALKa HHH- UMaNW3allHi HCOKATDHDIX CTATHYECKHX OGSCKTOB, ONPEAECHHDIX B Pa3sHBIX EMHH- wax TpancaayHn. Ymo cnedyem nomuumo @ Beerga spysnylo HHMUMATHsHpOBaTL OGbEKTbI BCTPOEHHBIX THIIOB, T10- cKombKy C++ aesaeT 9TO, TOAbKO He Bcerga. @ Bxoncrpyxtope oraapaTs mpenmourenve MpHMeHeHHi0 CIMCKOB HHMUHa- AM3aMH YJIeHOB Neped NpAMBIM MpHCBaHBallMeM 3HaYeHHi B Tee KOHCT- pyxropa. Tepeuncasiire qaiHbie-wicHb! B CLIHCKe MHHUMaH3alHH B TOM 2Ke NOpAAKe, B KaKOM OHV OOBABJEHDI B Kacce. M Us6eraiire npo6.1em c nopaaKOM HHHUMATH3auHIH B pa3sHbix eMMHHMaX TPpakCAyMH, 3aMeliaA HeOKaIblible CTaTHYeCKMe OODEKTHI NOKATbHBIMH cTaTH¥eckuMH OObeKTaMH. fnasa 2. Konerpykropbi, ,ectpyKtopb! 4 oneparTophi NpHcBaHKBaHHa Tlourn Bo Bcex pawsux Knaccax GyayT onpeseneHb! ONMH HAM HECKOAbKO KOHCTPyKTO- pos, LectpykTop M onepaTop NpHcBaMBanHa. Sto yHKUHH, KOTOpbIe OTBEYaIOT 3a Ollepallvt Co3sqaHHA H HHHUMaTHsalHH OGbeKTa, ero YHHYTOXKEHHA, a TakWKe MPHCBaH- BaHna eMy HOBOrO 3Hayenna. Omn6KH B 9THX bYHKUMAX MpHBOMAT K MaeKO May- IMM H HENpHATHLIM MOCIeACTBHAM H OTParxkaloTcA Ha BCeX BalllMX Kyaccax, MOSTOMy OHH JOs>KHDI ObITh HaNHCaHel MpaBH.bHO. B HacTosmel raBe H3I02%KeHHI MpaByta MO MporpaMMupoBaHnio (pyHKyHii, COCTaBAAIONIMX OCHOBY K1accos. Npasuno 5: Kaxne dynkynu C++ co3sqaer WM BbISbIBaeT MONA Koraa nyctoii knacc nepectaet 6piTb nycTsim? Kora 3a Hero 6epetca C++. Ecan BbI H€ OGbABHTE KOHCTPYKTOP KOMMpoBaHHA, OMepaTop NPHCBaHBaHHA HIM ReCTpyK- TOP CAMOCTOATENbHO, TO KOMMHAATOP CieaeT 3TO 3a Bac. Boxee Toro, eciM BbI He oGbaBHTe BOOGIE HUKAKOTO KOHCTPYKTOpa, TO KOMIIWJIATOp ABTOMATHYECKH CO3MaCT KOHCTPyKTop No yMos4anmio. Bee aTH byHKuHH GyAyT OTKPbITBIMH H BCTpOeHHDIMH (cm. mpasito 30). Hanpumep, Takoe o6bannenne: class Empty (}7 SKBHBaIEHTO CilenyIouleMy: class Empty ( public: Empty() (...} // xouctpyktop no yMonwannn Empty(const Emptyé rhs) {...} // xouczpyxkrop xonuposanna ~Empty() (...) J/ mectpyxrop — cM. suxe // © sMpTyansusix nectpyxropax Emptyé operator=(const Emptyé rhs) {...} // oneparop mpucnampanna ye DTH hYHKNMM reHepHpyIOTCA, TOMBKO CCH OHM HYZKHBI, HO Maso HalimeTca cAyya- eB, Korga 6e3 HUX MO%KHO O6OlTHCE. Tak, creLyioulMii KOA MpHBeseT K MX aBTOMATH- ¥eCKOii reHepallHH KOMMHATOpOM: Empty e1; // xouctpyxtop no yMonwannn; // necrpyxtop Empty e2(e1); // xonctpyxtop Kormpopanun e2 = el; // oneparop npucpavnanna Vrax, Kommuaarop ner 3TH byHKUMH 1A Bac, HO YTO OHH Aerator? Kouctpyx- Top To YMOA4AHHIO H AECTPYKTOp — 9TO MeCTa, B KOTOpbie KOMITHJATOp TloMeUaeT Cary- xKeOubI KOM, HANPHMep BbI3OB KOHCTPYKTOPOB H AeCTpyKTOpoB 6a30BbIX KaCCOB HECTATHYECKHX JaHHBIX-41eHOB. OTMETHM, 4TO CreHepHpOBaHHbIit MECTPyKTOp He AB- AACTCA BHPTYAbHbIM (CM. MpaBH10 7), ECM TOKO pedb He HACT O KNacce, HacenyIo- yeM K1accy, y KOTOpOro ecTb BUPTYaMbHbIi AecTpyKTop (B STOM CAyyae BHPTyanb- HOCTb Hacslezyetca oT 6a30B0ro KNacca). ‘Uto Kacaerca KOHCTpykTOpa KONMpoBaHHaA H OlepaTopa MpHcBaMBaHHa, TO creHepH- POBAHHBIe KOMMHLIATOPOM BepcHH NpocTo KONMpyloT KaxyBIi HecTaTHYeCKHi 4WIeH naH- HbIX UCXOqHOrO OObeKTa B UeneBO. HanpuMep, paccMorpuM ua610H Named Object, KOTOpbIit NO3BONAeT aCCOMHMpOBATb HMeHa c O6beKTaMH Tua T: Template class Namedobject { public: NamedObject (const char *name, const Ts value); NamedObject (const std::string& name, const Té value); | Konctpyktoppi, gectpyxtoppi 1 oneparopti private: std:strang nameValue; T objectValue; Tlockonpxy B xnacce Named Object o6bansien KOHCTpyKTOp, KOMMHLATOp He craHeT TeHepHpoBaTb KOHCTPyKTop Mo yMONYaHMI0. TO BAKHO. 3HAYHT, ECM BbI CIpoeKTHPO- Bal KNaCC Tak, YTO ErO KOHCTPYKTOpy O6a3aTebHO AOJDKHbI ObITh MepemaHbl KaKHE-TO apryMeHTH, TO BAM He Hy2%HO GecioKOHTbCA, YTO KOMIMIATOP NpoMrHOpHpyer Balle peulenve Hi no co6cTBeHHoH MHUYHATHBE AO6aBHT eue H KOHCTpyKTOp 6e3 apryMeHTOB. B xnacce Named Object Het HU KOHCTpykTopa KONMpoBaHUs, HH OMepatopa MpH- cBaHBaHMA, MOITOMY KOMNMAATOp creHepupyeT Hx (pH Heobxog~HMocTH). Tlocmor- pute Ha cneayioulee ynorpe6.eHHe KOHCTpyKTOpa KOMMpoRaHHA: NamedObjectnol ("Smallest Prime Number”, 2); NamedObjectno2 (nol) ; /{ wusuBaerca KONCTpykTOp KonMpoBanna KoxctpyktTop KonHpoBaHua, creHepHpoBaHHblii KOMMHAATOPOM, XOJKeH HHH- uvanusupoBaTb no2.nameValue uv no2.objectValue, ucnomp3ya noi.nameValue 4 no1.object Value coornetcTBenHo. Une nameValue umeet Tun string, a B craHyapT- HOM kaacce string o6saBeH KOHCTpyKTOP KONMpoBaHua, MosTOMy no2.nameValue 6yaeT HHHUMaTH3HpoBaH BbISOBOM KOHCTpyKTopa KOMMpoBaHMa string c apryMeHTOB not.nameValue. C zpyroii cropousi, yeH NameObject::objectValue umeer TH int (nockoabxy T ect» int B JaHHOi KOHKpeTH3ayMN ma61oHa), a int — BcrpoeHHBIit ‘THM, nostomy no2.object Value 6yxzeT HHMUMaIH3HpoBaH NOOMTOBDIM KONMpOBaHHeM not.objectValue. CreepxposaHubiii KOMMHAATOPOM OMepaTop MpHcBaHBaHua Wa Kacca Named- Object 6yaerT Bectu ce6a aHanorM4yHbIM O6pa3oM, HO, BOObule roBops, creHe- PHpOBavHad KOMMMATOPOM BepcHA OnepaTopa NPHCBAMBaHHA BeAeT cebA Tak, KaK & OMMcan, TOABKO B TOM culy¥ae, KOrga B pesysthTaTe Mosy4aeTcA KOppeKTHBIM H ocMbicaeHHbii Kon. B mporHBHOM cuyyae KOMMMATOp He CreHepupyer operator=. Npasuno 5 Ht 49 | Hanpumep, npegnonoxum, sto Kacc NamedObject onpegesen, kak noKka3an0 Hue. OOpaTute BHHMaHne, ¥To nameValue — ccbiika Ha string, a object Value uMeet Tun const T: template class Namedobject { public: // 9707 xoNcTpyxTop Sonee He MpuNMMaeT const name, mockonbxy nameValue ~ // reneps ceunka Ha HeKONCTaHTHyn CTpoKy. KoncTpyxTop C aprymenTom Tuna /( chat* vicKnoven, NOCKONBKY HaM HyKHa CTPOKa, Ha KOTOPYM MOKHO CocmaTECA NamedObject (std::straingé name, const T& value); “: // “ak “ pasee, npennonaraem, // m0 operator= He oSvasnen private: stdi:strings namevalue; // teneps 970 ccunka const T objectValue; // veneps const Tlocmorpum, 4To mpovsoiiaer B pHBeeHHOM HY%Ke Kose: std::string newDog ("Persephone"); std::string oldDog(*Satch”); NamedObject p(newDog, 2); // Korna a snepsue Nanncan 970, // saua co6axa Mepcegona cobupanacs // sctperurs cBom BrTOpoh meH» poxnenna NamedObject s(oldDog, 36); // Ceewmomy ney Caray (43 Moero // neteTBa) 6uno 6H Teneps 36 neT p= // Yr0 nonx1© npousowrn // c naunsmn-anenamss p? Tlepea mpuicpavpanviem u p.nameValue, 1 s.nameValue ccbitanHch Ha OGbeKTEI string, Xora H Ha pasnbie. Uro ,osxHO npousoiiTH c weno p.nameValue B pesy.bTa- Te NpHcpanBanna? JlouKeH JH OH CCbLIaTbCA Ha TY KE CTPOKY, 4TO H S.nameValue, TO eCTb 2OIKHA AM MOAMUUMpOBaTECA CcBINKa? EcaH Aa, STO NOAPHIBAeT OCHOBHI, NO- Tomy uo C++ He MO3BOIAeT H3MeHMTL OObEKT, Ha KOTOpbIit yka3bIBaeT CChIIKa. Ho, 6piTp MoxKeT, AO/KIa MOAMPHUMPOBATHCA CTPOKa, Ha KOTOPYIO CCBINAeTCA HEH p-nameValue, 1 Torga 6yayT 3aTponyTs Apyrue oObeKTHI, ComepxalMe ykasaTerH WJIH CCBILIKH Ha STY CTPOKY, XOTA OHH H He YYaCTBOBANH HeMOcpeACTBEHHO B MIpHCBaH- BaHHH? TO JM AOIKEH AeaTb creHepHpoOBAHHDIi KOMMHAATOPOM OMepaTop NpHCBaH- BaHna? Crankupaacb c nogqo6HoH ronoBos0MKoii, C++ mpocto oTKa3biBaeTca KOMMMAN- poBat» aToT Kor. Ecsm BbI XOTHTe MOAMep2KHBAT MpPHCBAHBaHHe B KJIACCe, BKIOYAIO- UIeM B CeGA YIEH-CCbLIKY, TO AOJKHBI OTIPeeIHTb ONepaTop MPHcBaMBaHHA CaMOCTOs- TebHO. AHasOrHulibiM 06pa30M KOMMATOp BeneT ce6A C KMaCcaMH, COmep2xkaHMH KOHcTaHTHLIe Went (Takne Kak objectValue Bo BropoM BapHante K1acca NamedObject prime). MoquduyHpoBaTb KOHCTAHTHbIe YeHBI 3alIpenleHO, MOSTOMY KOMMHIATOP He 3HaeT, Kak MOCTyNaTb MpH HeaBHOii renepaunn OnepaTopa mpucBanBanna. Kpome TOTO, KOMMHJATOP He CTaHCT HeABHO reHepHpoBATb ONepaTop MpHcBaMBaHHA B Mpo- W3BOAHOM Kyacce, eC B ero 6a30B0M O6baBseH 3aKPBITHIH ONepaTop MpHcBanBa- Hua. V1 wakoneu, mpemmosaraetca, 470 creHepupoBaHHble KOMMMATOPOM OrTepaTOpE EXQREEBD Konctpyxtopu, gectpyxtops 1 onepatopy IIpHCBaMBaHHA A14 MIPOMSBOANBIX KNaccoB JoMxKHEI O6pabaTHBatp YacTH 6a30BbIx kaaccos (cM. mpaBito 12), HO MpH 3TOM OHM KOHeYHO 2k HE MOFYT BbISbIBATh CbYHK- UMH-WIeHBI, LOCTYT K KOTOPBIM JIA HHX 3ampenleH. Ymo cnedyem nomuums @ Komnuasarop Moxket HeaBHO reHepHpoBaTb MA Kacca KOHCTpykTOp 10 yMou4aHt10, KOHCTpYKTOp KOMHpOBAHHA, OMeparop MPHcBaKBaHHA Hi 1e- cTpyKTop. Npasuno 6: AsHo 3anpewaiite KoMnuAATOpy FeHEPMPOBaTb PYHKUMK, KOTOPbie BAM He HYKHbI Arentbi lo mpowaxe HeqBHXKHMOCTH HM MporpaMMubie CHCTeMbI, O6cyAMBAIONIHE HX JEATEbHOCTD, MOTYT HYKMaTbCA B KTACCe, MpeACTABAAIONEM NOMA, BLICTABEHUbIE Ha mpomaky: class HomeForSale {...}; JhoGoii arent no npomaxke HeABHOKHMOCTH CKaKET BaM, 4TO KaxKAbIit OGbEKT YHHKa- seu — He 6hiBaeT ABYX, B TOXHOCTH OfNHaKoBbIX. Bor moyemy Hed CosaHHA KOM o6bexta HomeForSale 6eccmuicnenna. Kak MOxKHO CKOMMPOBaTh HeYTO, M0 ompene- aennio, yxuxanvnoe? Tostomy xorenoce 641, 4TOGLI HOMITKH CKOMMPOBaTb O6bEKTEI HomeForSale ne komnuaupopamnce: HomeForSale hl; HomeForSale h2; HomeForSale h3(h1); // nonsrka cxonupomats hi — // se nORKHO KoMmunnponaTeca! hl haz 1] aonsrxa cKonmuponats h2 — J/ ne ROMO KoMnMmMpoRaTEca! Yebl, MpegqOTBpaTHTh Takyl0 KOMMHAUHIO He Tak-TO mpocTo, O6bIYHO, ecJIH BbI HE XOTHTE, YTOObI K1acc NOsepK HBA ONPEeTENHOrO porta SYHKUMONATbHOCTS, BbI HPOCTO He OObanssere cbyHKuHil, KOTOpHIe ee peatusyloT. Hoc KOHCTPyKTOPOM KOMMpoBaHHsA M ollepaTOpoM ipHcBaMBaHHA 9Ta CTpaTerHs He paGoTaer, HOCKOAbKY, Kak CuelyeT M3 papa 5, ecu BbI Mx He OObABIAeTE, a TMe-TO B MporpaMMe MpOH3BOAMTCA NOMLITKA HX BbI3BaTb, TO KOMNMATOp CreHepupyer Hx aBTOMATHYECKH. Tloxoxe na 6e3nbixogHoe nowoxenve. Eciv Bhi Camu He OODABHTe KOHCTpyKTOp KONMPOBAHHA HIM OllepaTop MpHCBaHBaHHs, TO HX creHepupyer KoMmMsATOp. MI Balt kulacc GygeT nognep»xKKBaTb KoMMpoBaHHe. Ho To xe caMoe MponsoiizeT, eCK BEI o6papnte oT byHKUHH CaMocTosTeNbHO. OnHako Halla Wesb — npedomepamumo Ko- mmposanue! Kunou k peutenuio B TOM, 4TO BCe CreHepHPOBAHHbIC KOMMMJATOPOM (PyHKUMH AB AAIOTCA OTKPBITEIMH. Uto6p! MpeOTBpaTHTb aBTOMATHYECKOe FeHEPHPOBAHHe, BbI 1OTK- HI OODABHT HX CAMOCTOATETDHO, HO HHKTO He TpeGyer, YTOGbI OHH Gp1IH OTKPDITHIMH. Hy tak 4 o6papnte KOHCTpyKTOP KOMMpOBaHHA KM ONepaTop MPHCBAKBaHHA 3axpoimel- du, OGbABARA ABHO bYHKIMO-W2IeH, BbI TPeMOTBpatiaere rcHepHpoBaHHe ee KOMTIH- AATOPOM, a CemaB ee 3aKPHITOM, He NOsBOAKETE KOMy-HG0 BLISHIBATL ee. Npasuno 6 ae Cxema He naeaJibHa, MOTOMy 4TO ApyrHe 4eHbI Klacca H yHKUMH-Apy3ba Mo- MpexkHeMY MOTYT BEISBIBATb 3aKPLITHIe YHKUMH. Ecau monKxo BbI He BKHOUNTE THLLb oGbaptenne, onycTuB onpenenenne. Torga ecam KTO-TO ciyyaitHo BbIsOBeT TaKYI0 yHKuHi0, To MonyaHT coo6menne 06 omOKe Ha sTaNe KOMMONOBKH. DTOT TpIoK — obbapsenne pyHkuMit-4ieHOB 3aKPHITHIMH H COSHaTesbHBIii OTKAs OT HX peaHga- WMH — Kak pa3 W HCHoMBsyeTCA AIA MpeqOTBPAalleHHsaA KONMPOBaHHA B HEKOTOPEIX rolaccax Ov61moTeKu iostreams, BarnaHuTe, HanpHMep, Ha OOpaBIeHnA KcTaccoB ios_base, basic_ios u sentry B Bameit peannsayMn cTangapTHoii 6v61noTeKH. Bu o6napyxute, ¥TO B Ka2KOM CHyYae Kak KOHCTPYKTOp KONMpOBAHAA, Tak H ONepatop NPHCBaMBaHHA oObABNEHDI 3aKPbITEIMH HM HHIe He OMpeneseHE. Tipumennt sty yopky B Kacce HomeForSale nec0%xHO: class HomeForSale { public: private: HomeForSale(const HomeForSale&) ; /1 roneKo OGbaBnennA HomeForSale& oparetor=( const HomeForSales); Mu SamerpTe, uTo A He yKa3aJI HMeHa MapameTpoB PyHKuHii. ITO HeoOasaTembHO, mpocro takoBo o6wee cormamenne. Begb pas 3TH yHKUMH HuKoraa He 6yayT peann- SOBbIBaTHCA MH HCTIOMb3OBATHCA, TO KAKOM CMBIC 3aaBaTb HMeHa MX NapaMeTpoB? Tip Takom onpenesennn KoMnMaatop Gyzet 610KHpoBaTb Ju0G6bIe MONBITKH KIH- eHTOB KOMHpoBaTb O6bekTHI HomeForSale, a ecan Bbi cAyYaitHo NonmbitaeTecb coemaTb 9TO B PYHKUMH-WleHe WIM yHKyHH-Apyre K1acca, To 06 oumbKe coo6ulT KoMMO- HOBILHK, CyulectByeT BO3MO2xXHOCTb NepeMecTHTS OMMOKy C 9TaNa KOMNOHOBKH Ha aTalt KOMMIMJIAUHH (3TO BCerga NOe3HO — yume O6HapyxXHTL omMOKY KaK MOXKHO paHD- ie), ec OObABHTb KOHCTPyKTOp KOMMpOBaHHA HM ONepaTop IpHCBaMBaHHA 3aKpbI- TbIMH He B caMOM Kilacce HomeForSale, a B ero 6a30B0M K/aCCce, Cle HaJIbHO CO3aH- HOM JIA MpegqOTBpamjeHHA KonMpoBaHna. Takoit 6a30BbIit Kacc OFeHb MpOcT: class Uncopyable { protected: Uncopyable() (} // paspeumts xoucrpynponanne ~Uncopyable() {} 7/ ™ yumuToxenne // o8vexr0s mponssomNux Knaccos private: Uncopyable (const Uncopyableé); // 40 npexorsparuTs Kon™MpoBanne Uncopyable& operator=(const Uncopyable&) ; Uro6ni mpeqorspatutp konuposanne o6pextos HomeForSale, HyxHo aMuIb yHa- caenoparp ero or Uncopyable: class HomeForSale : private Uncopyable ( // 8 970M Knacc Gonsme HeT HK " // KoNcTpyxTopa KonuponaHuA, Hu ) // oneparopa npucaansannn Takoe pemenne paGoraet, MOTOMY 4TO KOMIMAATOP MbITaeTCA TeHePpHPOBATb KOH- CTpykTOp KONMpOBaHHA H ONepaTop MPpHCBaHBaHHA, eCJIH Te-ToO — NycTb WaxKe B cpyHK- EZEEEMBBLL) Koxctpyxtops, nectpyxtopsi 4 onepatops WHH-WleHe HIM ApyxKecTBeH HOM PyHKYHH ~ MpOMSBOAHTCA HoMbITKa CKOMMpOBaTD o6bext HomeForSale. Kax o6bacuaetcs B mpapyne 12, creneppoBanibie KOMIHIA- TOPOM BepcHH 6yAYT BHISbIBATb COOTBCTCTBYIOWIMe (byHKUMM 13 6asoBoro Ksacca. Ho 9TO He NOAYYHTCA, TAK KaK B 6a30B0M K1acce OHH OOBABJEHLI 3aKPbITBIMM. Peannsatia 4 HcnoABgOBative Kacca Uncopyable conpskena ¢ HeKOTOpbIMH TOH- koctramu. Hanpymep, Hacteqonanve ot Uncopyable ne n02KHo GpITb OTKpEITDIM (cM. mpaBiia 32 4 39), a mecrpyktop Uncopyable ne ao%Ken 6hITb BAPTYaNbHbIM (CM. Mpa- Buno 7). Mockorpky Uncopyable we wMeeT aHnbix-4ueHOB, TO KOMMHAATOP MOxeT npu6ernyTs K ONTHMM3alHH NyCTSIX 6a30BbIX KlaCCoB, ONMCaHHOlt B IpaBHte 39, HO KOM CKOPO BTOT KACC 6aZOBLIii, TO BOSMO%HO BOSHMKHOBENHE MHOXKECTBEHHOTO Ha- crenopaHua (cM. mpatito 40). A MHoxkecTBeHHOe HacreqOBaline B HEKOTOpSIX Ctyya- AX He 1a€T BOSMOXHOCTH MpPOBeCTH ONTHMUSZAMIO MycTBIX Ga30BEIX KaccoB (cM. npasuzo 39). Boo6ue ropops, BbI MoxkeTe HTHOPMpOBaTb 3TH TOHKOCTH M MpocTo HC nlonssopats Uncopyable, kak noxasano peu. Moxkere Take BOCTONB3OBaTHCA Bep- cueii 13 6uaMotexu Boost (cm. npasno 55). B velit sror Knacc Hasbipaerca noncopyable. Sro xopoumit KAacc, HO MH MPOCTO MOKaZaNOCb, 4TO ETO HasBAHMe HEMHOTO, CKaKeM Tak, HeecTecTBeHIIOe. Umo cnedyem nomnumo Urobs! OTKMOYUTS (byHKIMOHANbHOCTD, aBTOMATHYECKH MpemocraBsAe- MylO KOMIMAATOpOM, OGbABMTe COOTBeTCTBYIOUIyIO yHKUMIO-4eN 3a- KpsiToi M He BKMONaiiTe ce peanHsaunio. Hacnenopanne 6a30BoMy Kacy tuna Uncopyable ~ oauu m3 choco6os caeaatb 370. Mpasuno 7: O6vasnaiite pectpykroppt BMPTyasIbHbIMM B NOMMMOpdHOM 6as0B0M Knacce Cyujecrsyer Muoro crocoGos orcAexHBaTb BpeMA, OSTOMY HMEeeT CMBICI CO3LaTb 6asonnrit Knacc TimeKeeper 1 Mpon3Bogquple OT HETO KMACCHI, KOTOpBIe peannsyioT pasHbre MOAXOALI K XpoHoMeTpaxy: class TimeKeeper { public: TameKeeper () i ~TameKeeper () 7 M class AtomicClock: public TimeKeeper {. }; class WaterClock: public TimeKeeper (..}; class WristWatch: public TimeKeeper { .); Muorve kawerrbt 3aXoTaT MMeTb JOCTYN K 1aHHbIM O BpeMeHH, He JaGOTACE O Te- TaNAx TOPO, KaK OHM MOMyYalOTCA, MOOTOMY MbI MO2%KEM BOCTIOMb3OBaTbcA Pabpuunow qynxyuet (factory function), kovopad BosBpalilaeT ykKa3aTenb Ha 6a30Bbiii KMaCc CO- siaHHoro eit OGbekTa MpousBomHoro KIaC TimeKeeper *getTimeKeeper(); // sosspauaer yxasatene Ha RuHaunuecKn // sumeneuneit o6vext Kmacca, // npoussonuoro or TimeKeeper Mpasuno 7 j DL lad 3a) B coornercrauu c coraamennem o ha6puyneix bynxunax o6vexrsi, Bosepamae- bie getTimeKeeper, Bbijlema10TCa H3 KH, MOsTOMy AIA Toro, YTObbI H3GexKaT yTe- YeK NAMATH H ApyrHx pecypcos, BaxkKHO, YTOOBI KaxKbIi MOAyYEHHDI OObeKT Obit Pano WK 1031HO YHHYTOXKeH: TomeKeeper *ptk = getTimeKeeper(); // nonyants mukammueckn BuneneHHy // oGvext “3 nepapxum TimeKeeper // wcnonb3opate ero delete ptk; // yanuroxnts, uTo6H us6eKare yreuKn // pecypcos Kak o6bacHaertca B parse 13, nomaraTbca Ha TO, UTO OObEKT YHHYTOKUT KAH- eHT, YpeBaTo OWHOKaMH, a B MpaBuae 18 roBOpuTcs, KaK MOXKHO MoAHHIMMpoBaTb cadpranyio ynxwno Ata npenorspajenua Han6onee yacTHIx OWM6OK B KAMeHT- ckoli Mporpamme. Spec 2ke Mbl O6cyHM Gone CeppesHblii HenOCTAaTOK MpHBeLeHHOTO BBIUE KO/la: Nae ECM KAMEHT BCE LeTaeT NPABHAHO, Mbl He MOXKEM y3HaTb, Kak Gy- jet BecTH ce6a nporpasma. Tpo6ema B Tom, uto getTimeKeeper BosspamlaeT yKasatenb Ha OObeKT MPOHSBOA- Horo ksacca (HarpuMmep, AtomicClock), a ynanaTs aTor o6beKT HYKHO 4epes yKasaTeNb Ha 6a3zopbiii kracc (To ecb na TimeKeeper), mpu aToM B Gas0Bom Kuacce (TimeKeeper) o6baBeH HeBHpTyampHbIi WecTpyKTOp. ITO MpAMOit MyTb K HEMpHATHOCTAM, MOTOMY uTo B cneunukayun C++ nocryaupyerca, ¥TO Korja O6beKT NPOMSBOAHOTO KMacca YHMUTOKaeTCA Yepes yKa3zaTemb Ha Ga3OBBIii KNACc C HEBUPTYabHBIM JecTpykTOpoM, TO pesy.AbTaT He ONpeyemen. Bo BpeMA HCHOANEHHA 3TO OGbIMHO MIPHBOLHT K TOMY, 4TO yacTb oGbeKTA, IpHHasTexKaulad NPOHSBOAHOMY Kacy, HMKOrAa He 6yneT yHUUTO- xkena, Ecan getTimeKeeper() sosppamaer ykasatem Ha O6texr Knacc AtomicClock, to yacTb o6bekTa, MpHHagsexanaa AtomicClock (ro ecrb Jannbie-“nennt, O6baABAeHHEIC BOTOM Kaacce), BepoaTHO, He 6yAyT YHHYTOXKeEHBI, TAK Kak He Oy/leT BbISBAH ECTPYKTOP AtomicClock. Te xe unenst, 470 oTHocaTCA K GasoBomy Knaccy (To ecrb TimeKceper), 6yMyT YHHYTOXKeHDI, 4TO MPUBEMET K NOABEHWIO Tak Ha3bIBAeMBIX <4aCTHYHO Pa3spy- WeHHBIx> OOBeKTOB. DT BepHMi MYTH K YTCUKe pecypCoB, NOBPEXAeNMIO CrpyKTyP aHHbIX H MpoBeLeHHiO H3PAHOrO BPeMeHH B ObulecTBe OTAALIHKa. Peumrs ary mpo6stemy slerko: Hy2kHO OObABUTS B 6a30B0M Knacce BUPTyaNDUBIii aectpyKrop. Torga mpH yatennHn O6bekTOB NPOMsBONBIX KMaccoB GyeT MPOHCXO- AMT MMeHHO TO, 4TO Hy%KHO. O6next 6yner paspyuien WeAHKOM, BKTIO%aA BCe ero wacTH: class TimeKeeper { public: TimeKeeper (); vartual ~Timekeeper (); a TameKeeper *ptk = get TimeKeeper(); delete ptk; // veneps paSoraer mpasnnsHo O6srano Gasopbie Knaccel Bpone TimeKeeper coyepxat uM Apyrve BUpTyanpHple cbyHKWMH, KpoMe DeCcTpykTOpa, MOCKOMDKY HasHateHHe BUPTYAaNbHbIX CyHKunl — o6eche4HTb BOZMOXKHOCTL HaCTPOMKH NPOMSBOLHBIX KaCCOB (cM. MpaBHto 34). Ha- mpHMep, B ktacce TimeKeeper Moxert Git onmpefentena Buptyanbnad byHKuna getCurrentTime, peatu3opannasd T0-pa3sHoMy B paSHbIX MPOM3BOAHBIX Kyaccax. JIio- 6ofi Knacc c BAPTyaMbUbIMH (PyHKUMAMH MOUTH HaBepHAKA LOVKEH HMeTb BApTyab- nbtii JecrpyKTop. Ecaw xe wacc He UMeer BUpTyaMbubIXx cbyuKuuil, 9TO YacTo OsHataer, YTO On HE mpeqnasnayen Opitb 6azoBpiM. A B TaKOM Kjlacce ONpereNATb BUPTyAMbHbIii ZecTpykK- Top He CTonT. PaccMOTpHM KACC, MpecTaBAOUIMi TOUKY Ha TOCKOCTH: class Point { // rouxa Ha nnocxocm™m public: Point (int xCoord, int yCoord); Point (); private: ant x,yF i}, Konctpykropsi, AectpykTopsi W OnepaTopLi Me Ecam int sannmaer 32 Guta, ro o6bexr Point oGptuH10 Moxer MomecruTbca B 64-GuTo- spiii peructp. Boxee toro, raxoii o6bext Point Moxer 6piTp mepegan Kak 64-6uTOBOe 4uucHO byHKUHAM, HanMcaHHbIM Ha ApyrHx AsprKax (TaKHx KaK C uM FORTRAN). Ecau xe gecrpyKtop Point cyewaTb BApTyalbHbIM, TO CHTYallHA H3MeHHTCA. Tlaa peanu3anm supryansusix ynkuuii HeOOXORUMO, YTOGHI B OGbeKTe xpa- HMacb HHCOpMallHA, KOTOPad BO BPeMA HCHOAHEHHA MOSBOAACT OMpedeIHTh, Kakad Buptyaipnad byHkyMA ZospKHa 6sITb BBIsBaHa. Ta MAcopMauHA O6BIMHO MpencraB- nena yKasaTenem ha Taba BAPTyambHBIX byHkuHit vptr (virtual table pointer). Cama taOaHua — 3TO MaccHuB yKa3aTexeli Ha byHKuMH, Ha3sbiBaemili vtbl (virtual table). C kaxkybIM K1aCcOM, B KOTOpOM ONpeyesenbI BUPTya/ibhble PYHKUHH, AaCCONMUPOBaHa ta6anua vtbl. Korga 214 nexoroporo o6bekTa BbISbIBAeTCA BHPTyanbHad (PYHKUMA, TO ¢ MOMOuIbIO ykasatens vptr B TaGanye vtbl mmerca Ta peambHasa cbyHKuHA, KOTOpyiO Hy2KHO BBISBaTb. Alerann peannaaynn BuptryansHyx dynKnnit we Baxnbl. BaxkHo To, uTO ecrn kylacc Point conepxUT BUPTyambHyIo byHKuUMO, To O6bEKT STOFO THMa YBEAHYMBaeTCA B pasmepe. B 32-6uropoii apxurextype ero pasMep Bospacraer c 64 6uT (Ba LeAbIX int) a0 96 6ut (11Ba int WoC vptr); B 64-Guropoii apxuTeKType OH MoxKer BpIpactH c 64 no 128 6ut, noToMy uTO yka3aTemH B TO! apxHTeKTYpe HMeIOT pasMep 64 6uiTa. TakHM o6pazom, no6aBAeHve vptr kK o6bexty Point ysexuuuBaert ero pasMep Ha BeH4MBY OT 50 no 100%! Mocxe sroro o6bexr Point yxxe He Moxer lomecruteca B 64-6uTHbIii pe- rucrp. Boxee toro, o6bekTst sroro THMa B C++ mepecraior BbITAAeTb TaK, KaK aHaJ0- THYHbIe CTpyKTypb, OGBABNEHHDIe Ha APyrHx AsbIKAX, HapuMep na C, NoToMy 4TO. B AApyrux agblKaX Het NoHATHA vptr. B peaynbrare CraHOBHTCA HeEBO3MOXHO Mepesa- Bats oObexrsi THMa Point HanucaHHbiM Ha APYFHX A3BIKAX MporpaMMaM, ecs1M TOABKO BBI He yurere HaqHuHA vptr. A TO y2Ke TeTaMb PearHsallHy, H, CAeEMOBATEAbHO, TaKOii Kou He GyueT MepenocuMLIM. Tipakruueckuit Bbipog H3 BCero BBIeCKasAHHOTO COCTOMT B TOM, 4TO HeOGOCHO- BaHHO OGbABAATH BC JECTPyKTOPbI BUPTYaJIbHBIMH Tak KE HEBEPHO, Kak He OObAB- HATH MX BAPTYAIbUSIMH HUKOrMa. MookHO BBICKa3aTb STOT COBET HB TAaKOM BMT: j1e- Npasuno 7 Hie cTpykroppt cueayet OObABAATD BUPTYAaNbHLIMH TOIMa, Kora B KJaCce ecTb XOTA Obr olHa BUptyastbHas cbyHKuusA. OaHako HeBupTyanbHbie LecrpyKTOpsI MOryT CTaTb NpH4nHOH HeNpHATHOcTelt Hake MPH NOAHOM OTCYTCTBHH B Kilacce BAPTYaIbHBIX cbyHkuniit. Hanpumep, B craH- AapTHoM kKracce string Her BUpTyambHBIX PyHKUMH, HO MporpaMMucTsI BpemMenamit BCe 2K UCHOB3yi0T ero Kak 6a30BnIii KNacc: class SpecialString: public std::string ( // nnoxo! std::string conepant wee // xepupryanenuh necTpyKTOp “a Ha nepsotii B3rnag Takoii Kon MOxeT NoKasaTbcA SesBpeHBIM, HO CCAM Tle-TO B HpHAO%KenHN Bol MpeoSpasyere ykasatenb na SpecialString B ykasatenp na string, a 3aTeM BBITIOAHMTe A418 STOO yka3aTesA delete, To HeMeaneHHO Monagete B OGTacTS Heolpemenennoro NoBezenna: SpecialString *pss = new SpecialString(“Hamsuranuaaca onacnocts”) ; std::string *ps; PS = pss; // SpecialString*=>std::strang* delete ps; // weonpesenenuocts! Ba npaxruKe pecypen, pumenenie // oBvexry SpecialString, He 6yny? ocBobomnens, noTouy // a0 nectpyxrop SpecialString He susueaerca To %e OTHOCHTCA K J060MY Kiaccy, B KOTOpOM HeT BUPTyanbHoro WecTpyKTopa, B facTHOCTH KO BceM Tuam STL-Konreiinepos (nanpumep, vector, list, set, tr1::unor- dered_map [cm. npasuno 54] wT. 2.). Ecaw y Bac Korma-Hu6ynb BosHMKHeT co61a3H yHacueqoBaTs CTaHapTHOMy KoHTeiiHepy WIM M0G0My Apyromy Kacy c HeBUpTyatb- HIM NeCTpyKTOpom, Bo3zepxuTecs! (K coxarennio, B C++ He NpemycMorpeHo HHKa- KOFO MexaHH3Ma MpexOTBpallleHva HaCeLOBaHKA, Kak, CKaxkem, final B asbiKe Java, KK sealed B C#). Vnxoraza moxer 61th yno6ro 206aBHTb B K1aCc YHCTO BUPTyabHbIii AecTpyKTOp. BenoMHuM, ¥ro WHCTO BUpTyanbuBe bYHKUMN NOpoxalor abcmpaxmusie KAACCHI, TO eCTb KMACCbI, 9KZEMMAAPHI KOTOPHIX CO3MaTb Hezb3a. Mnorna, onaKo, y Bac eCTb KWaCC, KOTOppIii BEI XOTeTH Obi CHeTaTs abcTpaKkTHBIM, HO B HEM HeT HM OHO! MycTOIt BupTyambHoi pbynkunn. Uro Aenatb? Mockonsky aGcrpaxrnsii Kacc MpeqHasHayen UIA MCTONb30BaHHA B KavectBe 6as0Boro Ht HOCKOMDKY 6as0Bbili Kacc AOKeH HMeTb BUptyanbusiit necrpykrop, a VHCTO BUTyaNbHaN dylKuAA Nopoxmaer abcrpaKTHBrit K7acc, TO peleHve OYeBHHO: OOBABHTS YMCTO BUPTyambHblit MecrpykTOp B Kyacce, KOTOPbIit BbI XOTHTe CueAaTS abcrpakTHBIM. Bor npuMep: class AWOV { // AWOV = “Abstract w/o Vartuals” public: virtual ~AWOV() = // OOpaBnenue uncto BupTyanbHoro Me // necrpyxtopa Stor kaacc Bkmouaer B ce6a YHCTO BAPTyanDHyio tbyHKuMIO, MoITOMY OH a6cT- paktupiii. A pa3 B Hem OObABNeH BUPTyaNbHBI AccTpyKTOp, TO MOxKHO He GecioKO- ESEEEBEDL Kouctpyxtopu, nectpyxtopyi 1 onepatops HTBCA O TOM, {TO LecTpykTopbi Gas0BHX KTaCcoB He GyAYT BbIsBaHDI. OnnaKo ecTb Onna TOHKOCTS: BBI OJOKHBI MpeqOcTaBHT Onpederenue “CTO BAPTYaNbHOFO jecTpyKTopa: AWOV: :~AWOV() (17 // onpenenenne uucto supryansuoro nectpyxTopa Jeno 8 TOM, 4TO CHaYasta BCerma BEISHIBAETCA MECTPYKTOP v; ) // snect v apromarwueckx yHnuToxaerca Npasuno 8 mea Kora Bexrop v yuuuToxkaerca, On OTBeYacT 3a YUMITOKEHHE BCeX OObEKTOB Widget, koroppie B nem comepxxatca. Mpeanonoxum, uo v conepxut 10 o6nexToB Widget, 1 Bo Bpema yHu4uTOXKeHMA MepBoro U3 HX BO36yxKacTCA McKOFeIHe. OcTatb- ble 2eBaTb O6beKTOB Widget Takxke JOIKHDI ObITh YHHYTOXKENbI (HHAYe Pecypcnl, BuIeMeHUbe AA HUX, OyAYT MOTepAHD!), MOSTOMY HEOOXOAHMO BBISBATb H HX 7e- ctpyxtopst. Ho npegcraBuM, 4TO B 3TO BpeMa AectpyKrop BTOporo OGbexta Widget Takxe BO36yAHT UcKMOueHHe. Tora BOSHHKHET Cpasy 1Ba OAHOBPeMeHHO aKTHBHBIX MCKNOYEHHA, a 9TO CMUIKOM MHOro Juta C++. B 3aBHCHMOCTH OT KOHKPeTHBIX YCHOBHIi McnlomHeHue Mporpammor 1H60 Gyaer mpepBano, 160 ec NoBeMeHNe OKaxKeTCA HeOTIpe- aejennpim. B stom ApHMepe Kak paz HMeert Mecto Bropoii cayuait. M tax 6yaer mpone- XOJMTb MPU KcnombsOBaHHM Mu060ro GuGaMoTeuoro KoHTeltHepa (HanpuMep, list, set), suo6oro Korrefinepa TRI (cM. npasio 54) w nae Maccua. M1 npusuna stoit npobse- MbI He B KoHTelinepax HK MaccuBax. IIpexjespemernoe sapepurenve MporpaMMbt HH Heonpeyesennoe NoBeneHve 31eCh ABAAETCA Pe3ybTATOM TOTO, YTO HeCTpyKTOpbI BO3- 6yaxnaioT ucKmouenna. C++ ne i06uT ZecrpyKTopos, BO36YKMAIOUIMX HcKMOYeHMAl Sro gocrarouno mpocro nonsats. Ho 470 Bei AOWKHD! ACAATh, ec B BalleM Je- cTpykTope HeoGXOMHMO BLITIOAHHTb ONepauMio, KOTOpad MOXKET NOPOAUTh UcKMONC- nue? Hanpumep, npezmonoxKuM, YTO MbI HMeeM 1010 C KaCCOM, ONMCEIBAIOWIHM TOA- kmovenne K Gaze AaHnbIx: class DBConnection { public: static DBConnection create (); // dyuxuns noappaujaer o6zexT // DBConnection; napamerps nna // npocrora onymens: void close(); // aaxpurh coenmienne; npa Heynave h // sostyxnaer ucKnovenne [Ina rapanrun roro, uo Kauent ne sa6yner BusBars close ana o6beKTOB DBConnection, pesonno cospatb Kiacc 118 ypapnenua pecypcamn DBConnection, koroppiii BEIsbIBaeT close B CBOeM AecrpyxKTope. Knaccpl, ympaBAsioule pecypcamu, MbI THOAPOGHO paccMOTpHM B raape 3, a 3fecb MOcTaTOUHO NPHKHHYTS, Kak TOKE BBITAALeTS MECTPYKTOp TaKOTO KiTacca: class DBConn { // Knace mna ynpasnenna oGvexramn public: // DBConnection ~DBConn() // cGecneunte, YTObH coenMHeHUA Cc 6a30% { // nawiux Bcerga 3axpsiaanuce db.close(); 1 private: DBConnecton db; Me Torjla KMeHT MOxKeT COMEPKATb Tako! KO: { // nox OTKPHBAeTCR DBConn dbe (DBConnection: :create()); // cosnats o6vex? DBConnection // 4 nepenats ero o6vexry DBConn EZEEEEBEDL Koxctpyxtops, nectpyxropy! 1 onepatopul // ncnonssonats obvext DBConnection // sepes wuvepderc DBConn ) // ® xonue OnoKa oOsext? DBConn // yunuroxaetca, npx stow // aspomatuuecky BauBaeTcA ueTon close // o6vexra DBConnection Bce ato npvemtemo 0 Tex Mop, Moka Merou close 3aBepilaeTCA YCTEMIHO, HO ec €TO BbISOB BO3OyKMaeT HCKMOUEHHE, TO OHO MoKHAaeT Npexembl Aectpykropa DBConn. ‘310 o4eHb MLIOXO, HOTOMY TO MECTPYKTOpBI, BOSOYMAIOMINe MCKMOMEHHA, MOFYT CTaTb HCTOWHHKaMM OWKGOK. Ecrb ipa OCHOBHLIX CHocoba H36exKaTb sTOH Mpo6remBI. Jlectpyxtop DBConn, MoxkeT: O Mpepsars nporpammy, ecan close Bos6yxnaer HcKOYeHNe; OOBIMHO JIA 9TO- TO BBISbIBaeTCA cbyHKuHa abort: DBConn: :~DBConn () { try (db.close();) catch(...) { vanucaTs B mpoToKom, ¥ro al30B Close sasepumnca Heyma4Ho; std: tabort (); ) Dro pesonnsiit BbIGop, ec MporpaMMa He MoxeT MponoKaTs pabory mocate TOrO, Kak B JecTpyKTope NpoHsouta ouMO«Ka. penmyuectBo Takoro HOLX0- da — B Mpenorspamjenuu HeonperenenHoro nopezenna. Bsisow abort ynpenut BOSHUKHOBeHHe HeompeseneHHocTH. QO Mepexsarurs uckmouyenne, sos6y22eHH0e BEI30B0M close: DBConn: :~D8Conn() ‘ try {db.close()s} cateh(...) { sanucaTs B mpoToKom, yTo Bu30B close saBepumica HeyaauHo; } ) Boo6ule ropopa, Takoe UCKMOUeHMii — N1OXad Hes, NOTO- My UTO MbI TepseM BaxxHy10 HHcbopMauHio: wmo-mo ne cpabomaao! Ho wxorna nyullle HOCTYNMT» Tak, YTO6pI H36exaTS NpexTEBpeMeHHOH OCTAHOBKH Mpo- rpaMMbI WIM Heompeetennoro nopetenus. BuiGupatb sToT MOzXoN cHenyeT ANUS B CTY4ae, KOTa MporpaMMa B COCTOANHH NaqexKHNO MpowOKaTs UCTIOs- Henhe, Wake MOcHe TOTO, KaK OWIMGKa MPOMsoULa, HO 6oita MPOurHopupoBara. Hu ono 13 atTHx pemenuit He aBAAeTCA MeaTbHbIM. I1po6sema B TOM, ¥TO B O6OHX cayyaax MporpaMMa He MMeeT BO3MO%KHOCTH OTpearHpoBath Ha CHTyalMio, KoTOpast puesta K BOSOyAEHMIO HCKMIOVeHKA BHYTpH Close. Bostee pasymuaa crparerua - ctpoextuposars untepieiic DBConn ax, ¥roGe. eF KMeHTbI CaM MMe BO3MOX%HOCTb PearMpoBaTb Ha BOSHHKaioulKe OuMOKH. Ha- mpumep, Kacc DBConn Moxer mpenocraBuTs coG6crenHy cbyHKusio close 4 Ta- KKM 06pa30M JaTb KAMeHTaM uraHc O6paGoraTs UcKMOYeHKe, BOSHHKWee B Ipouec-

You might also like