B'ern Straustrup. YAzyk programmirovaniya S++ --------------------------------------------------------------- Vtoroe dopolnennoe izdanie --------------------------------------------------------------- YAzyki programmirovaniya / S++ B'ern Straustrup YAzyk programmirovaniya S++ Kniga B. Straustrupa "YAzyk programmirovaniya S++" daet opisanie yazyka, ego klyuchevyh ponyatij i osnovnyh priemov programmirovaniya na nem. |to zavershennoe rukovodstvo, napisannoe sozdatelem yazyka, kotoroe soderzhit opisanie vseh sredstv S++, v tom chisle upravlenie isklyuchitel'- nymi situaciyami, shablony tipa (parametrizovannye tipy dannyh) i mno- zhestvennoe nasledovanie. Kniga delitsya na tri chasti. Pervye desyat' glav yavlyayutsya uchebnikom, sluzhashchim vvedeniem v yazyk, vklyuchaya podmnozhestvo sobstvenno S. V treh posleduyushchih glavah obsuzhdayutsya voprosy proektirovaniya i sozdaniya programmnogo obespecheniya s pomoshch'yu S++. Kniga zavershaetsya polnym spravochnym rukovodstvom po yazyku. V knige vy najdete: * zakonchennyj uchebnik i rukovodstvo po yazyku. * polnoe osveshchenie sredstv yazyka, nacelennyh na abstraktnye tipy dannyh i ob容ktno-orientirovannoe programmirovanie. * obsuzhdenie programmistskih i tehnicheskih voprosov, voznikayushchih v pro- cesse proektirovaniya i sozdaniya bol'shih programmnyh sistem. * opisanie sposobov postroeniya bibliotek vysokogo klassa. * primery realizacii klyuchevyh tipov dannyh, opredelyaemyh pol'zovatelem, takih kak graficheskie ob容kty, associativnye massivy i potoki vvoda- vyvoda. |ta kniga budet horoshim pomoshchnikom opytnomu programmistu, reshivshemu ispol'zovat' S++ dlya netrivial'nyh zadach. Ee mozhno schitat' klyuchevoj v lyubom sobranii knig po S++. Ob avtore knigi: B'ern Straustrup yavlyaetsya razrabotchikom yazyka S++ i sozdatelem pervogo translyatora. On - sotrudnik nauchno-issledovatel'skogo vychislitel'nogo centra AT&T Bell Laboratories v Myurrej Hill (N'yu-Dzhersi, SSHA). On poluchil zvanie magistra matematiki i vychislitel'noj tehniki v universitete g. Aarus (Daniya), a doktorskoe zvanie po vychislitel'noj tehnike v kembridzhskom universitete (Angliya). On specializiruetsya v oblasti ras- predelennyh sistem, operacionnyh sistem, modelirovaniya i programmiro- vaniya. Vmeste s M. A. |llis on yavlyaetsya avtorom polnogo rukovodstva po yazyku S++ - "Rukovodstvo po S++ s primechaniyami". PREDISLOVIE "A doroga idet vse dal'she i dal'she" (Bil'bo Beginz) Kak bylo obeshchano v pervom izdanii knigi, zaprosy pol'zovatelej opredelili razvitie S++. Ego napravlyal opyt shirokogo kruga pol'zovatelej, rabotayushchih v raznyh oblastyah programmirovaniya. Za shest' let, otdelyayushchih nas ot pervogo izdaniya opisaniya S++, chislo pol'zovatelej vozroslo v sotni raz. Za eti gody byli usvoeny mnogie uroki, byli predlozheny i podtverdili praktikoj svoe pravo na sushchestvovanie razlichnye priemy programmirovaniya. O nekotoryh iz nih i pojdet rech' nizhe. Sdelannye za eti shest' let rasshireniya yazyka prezhde vsego byli napravleny na povyshenie vyrazitel'nosti S++ kak yazyka abstrakcii dannyh i ob容ktno-orientirovannogo programmirovaniya voobshche i kak sredstva dlya sozdaniya vysokokachestvennyh bibliotek s pol'zovatel'skimi tipami dannyh v chastnosti. Bibliotekoj vysokogo kachestva my schitaem biblioteku, pozvolyayushchuyu pol'zovatelyu opredelyat' s pomoshch'yu klassov ponyatiya, rabota s kotorymi sochetaet udobstvo, effektivnost' i nadezhnost'. Pod nadezhnost'yu ponimaetsya to, chto klass predostavlyaet zashchishchennyj po tipam interfejs mezhdu pol'zovatelyami biblioteki i ee razrabotchikami. |ffektivnost' predpolagaet, chto ispol'zovanie klassov ne vlechet za soboj bol'shih nakladnyh rashodov po pamyati ili vremeni po sravneniyu s "ruchnymi" programmami na S. |ta kniga yavlyaetsya polnym opisaniem yazyka S++. Glavy s 1 po 10 predstavlyayut soboj uchebnik, znakomyashchij s yazykom. V glavah s 11 po 13 obsuzhdayutsya voprosy proektirovaniya i razvitiya programmnogo obespecheniya. Zavershaetsya kniga spravochnym rukovodstvom po yazyku S++. Estestvenno, chto vse rasshireniya yazyka i sposoby ih ispol'zovaniya, kotorye poyavilis' posle vyhoda v svet pervogo izdaniya, yavlyayutsya chast'yu izlozheniya. K nim otnosyatsya utochnennye pravila dlya razresheniya peregruzki imeni, sredstva upravleniya pamyat'yu i sredstva kontrolya dostupa, nadezhnaya po tipam procedura svyazyvaniya, staticheskie i postoyannye funkcii-chleny, abstraktnye klassy, mnozhestvennoe nasledovanie, shablony tipov i obrabotka osobyh situacij. S++ yavlyaetsya yazykom programmirovaniya obshchego naznacheniya. Estestvennaya dlya nego oblast' primeneniya - sistemnoe programmirovanie, ponimaemoe v shirokom smysle etogo slova. Krome togo, S++ uspeshno ispol'zuetsya vo mnogih oblastyah prilozheniya, daleko vyhodyashchih za ukazannye ramki. Realizacii S++ teper' est' na vseh mashinah, nachinaya s samyh skromnyh mikrokomp'yuterov - do samyh bol'shih super-|VM, i prakticheski dlya vseh operacionnyh sistem. Poetomu kniga daet lish' opisanie sobstvenno yazyka, ne ob座asnyaya osobennosti konkretnyh realizacij, sredy programmirovaniya ili bibliotek. CHitatel' najdet v knige mnogo primerov s klassami, kotorye, nesmotrya na nesomnennuyu pol'zu, mozhno schitat' igrushechnymi. Takoj stil' izlozheniya pozvolyaet luchshe vydelit' osnovnye ponyatiya i poleznye priemy, togda kak v nastoyashchih, zakonchennyh programmah oni byli by skryty massoj detalej. Dlya bol'shinstva predlozhennyh zdes' klassov, kak to svyazannye spiski, massivy, stroki simvolov, matricy, graficheskie klassy, associativnye massivy i t.d., - privodyatsya versii "so 100% garantiej" nadezhnosti i pravil'nosti, poluchennye na osnove klassov iz samyh raznyh kommercheskih i nekommercheskih programm. Mnogie iz "promyshlennyh" klassov i bibliotek poluchilis' kak pryamye ili kosvennye potomki igrushechnyh klassov, privodimyh zdes' kak primery. V etom izdanii knigi po sravneniyu s pervym bol'she vnimaniya udeleno zadache obucheniya. Vmeste s tem, uroven' izlozheniya v ravnoj mere uchityvaet i opytnyh programmistov, ni v chem ne umalyaya ih znanij i professionalizma. Obsuzhdenie voprosov proektirovaniya soprovozhdaetsya bolee shirokoj podachej materiala, vyhodyashchej za ramki opisanij konstrukcij yazyka i sposobam ih ispol'zovaniya. V etom izdanii privoditsya bol'she tehnicheskih detalej i povyshena strogost' izlozheniya. V osobennosti eto otnositsya k spravochnomu rukovodstvu, kotoroe vobralo v sebya mnogoletnij opyt raboty v etom napravlenii. Predpolagalos' sozdat' knigu s dostatochno vysokim urovnem izlozheniya, kotoraya by sluzhila programmistam ne tol'ko knigoj dlya chteniya. Itak, pered vami kniga s opisaniem yazyka S++, ego osnovnyh principov i metodov programmirovaniya. Nadeemsya, chto ona dostavit vam radost'. Vyrazhenie priznatel'nosti Krome lic, perechislennyh v sootvetstvuyushchem razdele predisloviya k pervomu izdaniyu knigi, mne hotelos' by vyrazit' svoyu blagodarnost' |lu |ho, Stivu Baroffu, Dzhimu Koplinu, Tomu Hansenu, Peteru Dzhaglu, Brajanu Kerniganu, |ndryu Kenigu, Billu Leggetu, Lorrejn Mingachchi, Uorrenu Montgomeri, Majku Moubri, Robu Myurreyu, Dzhonatanu SHapiro, Majku Vilotu i Peteru Vejnbergu za kommentarii chernovyh variantov vtorogo izdaniya knigi. V razvitii yazyka S++ za period ot 1985 do 1991 gg. prinimali uchastie mnogie specialisty. YA mogu upomyanut' lish' neskol'kih iz nih: |ndryu Keniga, Brajana Kernigana, Daga Makilroya i Dzhonatana SHapiro. Krome togo, vyrazhayu priznatel'nost' mnogim uchastnikam sozdaniya spravochnogo rukovodstva S++, predlozhivshim svoi varianty, a takzhe tem, s kem dovelos' nesti tyazhkuyu noshu v techenie pervogo goda raboty komiteta X3J16 po standartizacii yazyka S++. Myurrej-Hill, sht.N'yu Dzhersi B'ern Straustrup PREDISLOVIE K PERVOMU IZDANIYU "YAzyk obrazuet sredu myshleniya i formiruet predstavlenie o tom, o chem my dumaem". (B.L.Uorf) S++ - yazyk obshchego naznacheniya i zaduman dlya togo, chtoby nastoyashchie programmisty poluchili udovol'stvie ot samogo processa programmirovaniya. Za isklyucheniem vtorostepennyh detalej on soderzhit yazyk S kak podmnozhestvo. YAzyk S rasshiryaetsya vvedeniem gibkih i effektivnyh sredstv, prednaznachennyh dlya postroeniya novyh tipov. Programmist strukturiruet svoyu zadachu, opredeliv novye tipy, kotorye tochno sootvetstvuyut ponyatiyam predmetnoj oblasti zadachi. Takoj metod postroeniya programmy obychno nazyvayut abstrakciej dannyh. Informaciya o tipah soderzhitsya v nekotoryh ob容ktah tipov, opredelennyh pol'zovatelem. S takimi ob容ktami mozhno rabotat' nadezhno i prosto dazhe v teh sluchayah, kogda ih tip nel'zya ustanovit' na stadii translyacii. Programmirovanie s ispol'zovaniem takih ob容ktov obychno nazyvayut ob容ktno-orientirovannym. Esli etot metod primenyaetsya pravil'no, to programmy stanovyatsya koroche i ponyatnee, a soprovozhdenie ih uproshchaetsya. Klyuchevym ponyatiem S++ yavlyaetsya klass. Klass - eto opredelyaemyj pol'zovatelem tip. Klassy obespechivayut upryatyvanie dannyh, ih inicializaciyu, neyavnoe preobrazovanie pol'zovatel'skih tipov, dinamicheskoe zadanie tipov, kontroliruemoe pol'zovatelem upravlenie pamyat'yu i sredstva dlya peregruzki operacij. V yazyke S++ koncepcii kontrolya tipov i modul'nogo postroeniya programm realizovany bolee polno, chem v S. Krome togo, S++ soderzhit usovershenstvovaniya, pryamo s klassami ne svyazannye: simvolicheskie konstanty, funkcii-podstanovki, standartnye znacheniya parametrov funkcij, peregruzka imen funkcij, operacii upravleniya svobodnoj pamyat'yu i ssylochnyj tip. V S++ sohraneny vse vozmozhnosti S effektivnoj raboty s osnovnymi ob容ktami, otrazhayushchimi apparatnuyu "real'nost'" (razryady, bajty, slova, adresa i t.d.). |to pozvolyaet dostatochno effektivno realizovyvat' pol'zovatel'skie tipy. Kak yazyk, tak i standartnye biblioteki S++ proektirovalis' v raschete na perenosimost'. Imeyushchiesya realizacii yazyka budut rabotat' v bol'shinstve sistem, podderzhivayushchih S. V programmah na S++ mozhno ispol'zovat' biblioteki S. Bol'shinstvo sluzhebnyh programm, rasschitannyh na S, mozhno ispol'zovat' i v S++. Dannaya kniga v pervuyu ochered' rasschitana na professional'nyh programmistov, zhelayushchih izuchit' novyj yazyk i ispol'zovat' ego dlya netrivial'nyh zadach. V knige daetsya polnoe opisanie S++, soderzhitsya mnogo zavershennyh primerov i eshche bol'she fragmentov programm. Vyrazhenie priznatel'nosti YAzyk S++ nikogda by ne stal real'nost'yu bez, esli by postoyanno ne ispol'zovalis' predlozheniya i sovety i ne uchityvalas' konstruktivnaya kritika so storony mnogih druzej i kolleg. Osobenno sleduet upomyanut' Toma Kardzhila, Dzhima Kopli, St'yu Fel'dmana, Sendi Frezera, Stiva Dzhonsona, Brajana Kernigana, Barta Lokanti, Daga Makilroya, Dennisa Ritchi, Lerri Roslera, Dzherri SHvarca i Dzhona SHapiro, kotorye vnesli vazhnye dlya razvitiya yazyka idei. Dejv Presotto realizoval tekushchuyu versiyu biblioteki potokovogo vvoda/vyvoda. Svoj vklad v razvitie S++ i sozdanie translyatora vnesli sotni lyudej, kotorye prisylali mne predlozheniya po sovershenstvovaniyu yazyka, opisaniya trudnostej, s kotorymi oni stalkivalis', i oshibki translyatora. Zdes' ya mogu upomyanut' lish' nekotoryh iz nih: Gari Bishopa, |ndryu H'yuma, Toma Karcesa, Viktora Milenkovicha, Roba Myurreya, Leoni Ross, Brajana SHmal'ta i Garri Uokera. Mnogie uchastvovali v podgotovke knigi k izdaniyu, osobenno Dzhon Bentli, Laura Ivs, Brajan Kernigan, Ted Koval'ski, Stiv Mahani, Dzhon SHapiro i uchastniki seminara po yazyku S++, kotoryj provodilsya firmoj Bell Labs v Kolumbii, Ogajo, 26-27 iyunya 1985 g. Myurrej-Hill, sht.N'yu-Dzhersi B'ern Straustrup PREDVARITELXNYE ZAMECHANIYA "O mnogom - molvil Morzh,- prishla pora pogovorit' ". L.Kerroll Dannaya glava soderzhit kratkij obzor knigi, spisok literatury i nekotorye dopolnitel'nye zamechaniya o yazyke S++. Zamechaniya kasayutsya istorii sozdaniya S++, idej, kotorye okazali sushchestvennoe vliyanie na razrabotku yazyka, i nekotoryh myslej po povodu programmirovaniya na S++. |ta glava ne yavlyaetsya vvedeniem; privedennye zamechaniya ne yavlyayutsya neobhodimymi dlya ponimaniya posleduyushchih glav. Nekotorye iz nih predpolagayut znakomstvo chitatelya s S++. Struktura knigi Kniga sostoit iz treh chastej. Glavy s 1 po 10 yavlyayutsya uchebnikom po yazyku. V glavah s 11 po 13 obsuzhdayutsya voprosy proektirovaniya i razvitiya programmnogo obespecheniya s uchetom vozmozhnostej S++. V konce knigi privedeno polnoe spravochnoe rukovodstvo po yazyku. Ischerpyvayushchee opisanie konstrukcij S++ soderzhitsya tol'ko tam. Uchebnaya chast' knigi soderzhit primery, sovety, predosterezheniya i uprazhneniya, dlya kotoryh ne nashlos' mesta v rukovodstve. Kniga v osnovnom posvyashchena voprosu, kak s pomoshch'yu yazyka C++ strukturirovat' programmu, a ne voprosu, kak zapisat' na nem algoritm. Sledovatel'no, tam, gde mozhno bylo vybirat', predpochtenie otdavalos' ne professional'nym, no slozhnym dlya ponimaniya, a trivial'nym algoritmam. Tak v odnom iz primerov ispol'zuetsya puzyr'kovaya sortirovka, hotya algoritm bystroj sortirovki bol'she podhodit dlya nastoyashchej programmy. CHasto napisat' tu zhe programmu, no s bolee effektivnym algoritmom, predlagaetsya v vide uprazhneniya. Glava 1 soderzhit kratkij obzor osnovnyh koncepcij i konstrukcij S++. Ona pozvolyaet poznakomit'sya s yazykom v obshchih chertah. Podrobnye ob座asneniya konstrukcij yazyka i sposobov ih primeneniya soderzhatsya v posleduyushchih glavah. Obsuzhdayutsya v pervuyu ochered' sredstva, obespechivayushchie abstrakciyu dannyh i ob容ktno-orientirovannoe programmirovanie. Osnovnye sredstva procedurnogo programmirovaniya upominayutsya kratko. V glavah 2, 3 i 4 opisyvayutsya sredstva S++, kotorye ne ispol'zuyutsya dlya opredeleniya novyh tipov: osnovnye tipy, vyrazheniya i struktury upravleniya. Drugimi slovami, eti glavy soderzhat opisanie toj chasti yazyka, kotoraya po suti predstavlyaet S. Izlozhenie v ukazannyh glavah idet v uglublennom vide. Glavy 5 - 8 posvyashcheny sredstvam postroeniya novyh tipov, kotorye ne imeyut analogov v S. V glave 5 vvoditsya osnovnoe ponyatie - klass. V nej pokazano, kak mozhno opredelyat' pol'zovatel'skie tipy (klassy), inicializirovat' ih, obrashchat'sya k nim, i, nakonec, kak unichtozhat' ih. Glava 6 posvyashchena ponyatiyu proizvodnyh klassov, kotoroe pozvolyaet stroit' iz prostyh klassov bolee slozhnye. Ono daet takzhe vozmozhnost' effektivnoj i bezopasnoj (v smysle tipa) raboty v teh situaciyah, kogda tipy ob容ktov na stadii translyacii neizvestny. V glave 7 ob座asnyaetsya, kak mozhno opredelit' unarnye i binarnye operacii dlya pol'zovatel'skih tipov, kak zadavat' preobrazovaniya takih tipov, i kakim obrazom mozhno sozdavat', kopirovat' i udalyat' ob容kty, predstavlyayushchie pol'zovatel'skie tipy. Glava 8 posvyashchena shablonam tipa, t.e. takomu sredstvu S++, kotoroe pozvolyaet opredelit' semejstvo tipov i funkcij. V glave 9 obsuzhdaetsya obrabotka osobyh situacij, rassmatrivayutsya vozmozhnye reakcii na oshibki i metody postroeniya ustojchivyh k oshibkam sistem. V glave 10 opredelyayutsya klassy ostream i istream, predostavlyaemye standartnoj bibliotekoj dlya potokovogo vvoda-vyvoda. Glavy 11 - 13 posvyashcheny voprosam, svyazannym s primeneniem S++ dlya proektirovaniya i realizacii bol'shih programmnyh sistem. V glave 11 v osnovnom rassmatrivayutsya voprosy proektirovaniya i upravleniya programmnymi proektami. V glave 12 obsuzhdaetsya vzaimosvyaz' mezhdu yazykom S++ i problemami proektirovaniya. V glave 13 pokazany sposoby sozdaniya bibliotek. Zavershaetsya kniga spravochnym rukovodstvom po S++. Ssylki na razlichnye chasti knigi dayutsya v vide $$2.3.4, chto oznachaet razdel 3.4 glavy 2. Dlya oboznacheniya spravochnogo rukovodstva primenyaetsya bukva R, naprimer, $$R.8.5.5. Zamechaniya po realizacii Sushchestvuet neskol'ko rasprostranyaemyh nezavisimyh realizacij S++. Poyavilos' bol'shoe chislo servisnyh programm, bibliotek i integrirovannyh sistem programmirovaniya. Imeetsya massa knig, rukovodstv, zhurnalov, statej, soobshchenij po elektronnoj pochte, tehnicheskih byulletenej, otchetov o konferenciyah i kursov, iz kotoryh mozhno poluchit' vse neobhodimye svedeniya o poslednih izmeneniyah v S++, ego ispol'zovanii, servisnyh programmah, bibliotekah, novyh translyatorah i t.d. Esli vy ser'ezno rasschityvaete na S++, stoit poluchit' dostup hotya by k dvum istochnikam informacii, poskol'ku u kazhdogo istochnika mozhet byt' svoya poziciya. Bol'shinstvo programmnyh fragmentov, privedennyh v knige, vzyaty neposredstvenno iz tekstov programm, kotorye byli translirovany na mashine DEC VAX 11/8550 pod upravleniem 10-j versii sistemy UNIX [25]. Ispol'zovalsya translyator, yavlyayushchijsya pryamym potomkom translyatora S++, sozdannogo avtorom. Zdes' opisyvaetsya "chistyj S++", t.e. ne ispol'zuyutsya nikakie zavisyashchie ot realizacii rasshireniya. Sledovatel'no, primery dolzhny idti pri lyuboj realizacii yazyka. Odnako, shablony tipa i obrabotka osobyh situacij otnosyatsya k samym poslednim rasshireniyam yazyka, i vozmozhno, chto vash translyator ih ne soderzhit. Uprazhneniya Uprazhneniya dayutsya v konce kazhdoj glavy. CHashche vsego oni predlagayut napisat' programmu. Resheniem mozhet schitat'sya programma, kotoraya transliruetsya i pravil'no rabotaet hotya by na neskol'kih testah. Uprazhneniya mogut znachitel'no razlichat'sya po slozhnosti, poetomu daetsya priblizitel'naya ocenka stepeni ih slozhnosti. Rost slozhnosti eksponencial'nyj, tak chto, esli na uprazhnenie (*1) u vas ujdet pyat' minut, to (*2) mozhet zanyat' chas, a (*3) - celyj den'. Odnako vremya napisaniya i otladki programmy bol'she zavisit ot opyta chitatelya, chem ot samogo uprazhneniya. Na uprazhnenie (*1) mozhet potrebovat'sya celyj den', esli pered zapuskom programmy chitatelyu pridetsya oznakomit'sya s novoj vychislitel'noj sistemoj. S drugoj storony, tot, u kogo pod rukoj okazhetsya nuzhnyj nabor programm, mozhet sdelat' uprazhnenie (*5) za odin chas. Lyubuyu knigu po programmirovaniyu na yazyke S mozhno ispol'zovat' kak istochnik dopolnitel'nyh uprazhnenij pri izuchenii glav 2 - 4. V knige Aho ([1]) privedeno mnogo obshchih struktur dannyh i algoritmov v terminah abstraktnyh tipov dannyh. |tu knigu takzhe mozhno ispol'zovat' kak istochnik uprazhnenij pri izuchenii glav 5 - 8. Odnako, ispol'zovannomu v nej yazyku ne dostaet funkcij-chlenov i proizvodnyh klassov. Poetomu opredelyaemye pol'zovatelem tipy na S++ mozhno napisat' bolee elegantno. Zamechaniya po proektu yazyka Pri razrabotke yazyka S++ odnim iz vazhnejshih kriteriev vybora byla prostota. Kogda voznikal vopros, chto uprostit': rukovodstvo po yazyku i druguyu dokumentaciyu ili translyator, - to vybor delali v pol'zu pervogo. Ogromnoe znachenie pridavalos' sovmestimosti s yazykom S, chto pomeshalo udalit' ego sintaksis. V S++ net tipov dannyh i elementarnyh operacij vysokogo urovnya. Naprimer, ne sushchestvuet tipa matrica s operaciej obrashcheniya ili tipa stroka s operaciej konkatenacii. Esli pol'zovatelyu ponadobyatsya podobnye tipy, on mozhet opredelit' ih v samom yazyke. Programmirovanie na S++ po suti svoditsya k opredeleniyu universal'nyh ili zavisyashchih ot oblasti prilozheniya tipov. Horosho produmannyj pol'zovatel'skij tip otlichaetsya ot vstroennogo tipa tol'ko sposobom opredeleniya, no ne sposobom primeneniya. Iz yazyka isklyuchalis' vozmozhnosti, kotorye mogut privesti k nakladnym rashodam pamyati ili vremeni vypolneniya, dazhe esli oni neposredstvenno ne ispol'zuyutsya v programme. Naprimer, bylo otvergnuto predlozhenie hranit' v kazhdom ob容kte nekotoruyu sluzhebnuyu informaciyu. Esli pol'zovatel' opisal strukturu, soderzhashchuyu dve velichiny, zanimayushchie po 16 razryadov, to garantiruetsya, chto ona pomestitsya v 32-h razryadnyj registr. YAzyk S++ proektirovalsya dlya ispol'zovaniya v dovol'no tradicionnoj srede, a imenno: v sisteme programmirovaniya S operacionnoj sistemy UNIX. No est' vpolne obosnovannye dovody v pol'zu ispol'zovaniya S++ v bolee bogatoj programmnoj srede. Takie vozmozhnosti, kak dinamicheskaya zagruzka, razvitye sistemy translyacii i bazy dannyh dlya hraneniya opredelenij tipov, mozhno uspeshno ispol'zovat' bez ushcherba dlya yazyka. Tipy S++ i mehanizmy upryatyvaniya dannyh rasschitany na opredelennyj sintaksicheskij analiz, provodimyj translyatorom dlya obnaruzheniya sluchajnoj porchi dannyh. Oni ne obespechivayut sekretnosti dannyh i zashchity ot umyshlennogo narusheniya pravil dostupa k nim. Odnako, eti sredstva mozhno svobodno ispol'zovat', ne boyas' nakladnyh rashodov pamyati i vremeni vypolneniya programmy. Uchteno, chto konstrukciya yazyka aktivno ispol'zuetsya togda, kogda ona ne tol'ko izyashchno zapisyvaetsya na nem, no i vpolne po sredstvam obychnym programmam. Istoricheskaya spravka Bezuslovno S++ mnogim obyazan yazyku S [8], kotoryj sohranyaetsya kak ego podmnozhestvo. Sohraneny i vse svojstvennye S sredstva nizkogo urovnya, prednaznachennye dlya resheniya samyh nasushchnyh zadach sistemnogo programmirovaniya. S, v svoyu ochered', mnogim obyazan svoemu predshestvenniku yazyku BCPL [13]. Kommentarij yazyka BCPL byl vosstanovlen v S++. Esli chitatel' znakom s yazykom BCPL, to mozhet zametit', chto v S++ po-prezhnemu net bloka VALOF. Eshche odnim istochnikom vdohnoveniya byl yazyk SIMULA-67 [2,3]; imenno iz nego byla zaimstvovana koncepciya klassov (vmeste c proizvodnymi klassami i virtual'nymi funkciyami). Operator inspect iz SIMULA-67 namerenno ne byl vklyuchen v S++. Prichina - zhelanie sposobstvovat' modul'nosti za schet ispol'zovaniya virtual'nyh funkcij. Vozmozhnost' v S++ peregruzki operacij i svoboda razmeshcheniya opisanij vsyudu, gde mozhet vstrechat'sya operator, napominayut yazyk Algol-68 [24]. S momenta vyhoda v svet pervogo izdaniya etoj knigi yazyk S++ podvergsya sushchestvennym izmeneniyam i utochneniyam. V osnovnom eto kasaetsya razresheniya neodnoznachnosti pri peregruzke, svyazyvanii i upravlenii pamyat'yu. Vmeste s tem, byli vneseny neznachitel'nye izmeneniya s cel'yu uvelichit' sovmestimost' s yazykom S. Byli takzhe vvedeny nekotorye obobshcheniya i sushchestvennye rasshireniya, kak to: mnozhestvennoe nasledovanie, funkcii-chleny so specifikaciyami static i const, zashchishchennye chleny (protected), shablony tipa i obrabotka osobyh situacij. Vse eti rasshireniya i dorabotki byli naceleny na to, chtoby S++ stal yazykom, na kotorom mozhno sozdavat' i ispol'zovat' biblioteki. Vse izmeneniya opisyvayutsya v [10,18,20,21 i 23]. SHablony tipov poyavilis' chastichno iz-za zhelaniya formalizovat' makrosredstva, a chastichno byli inspirirovany opisaniem genericheskih ob容ktov v yazyke Ada (s uchetom ih dostoinstv i nedostatkov) i parametrizirovannymi modulyami yazyka CLU. Mehanizm obrabotki osobyh situacij poyavilsya otchasti pod vliyaniem yazykov Ada i CLU [11], a otchasti pod vliyaniem ML [26]. Drugie rasshireniya, vvedennye za period mezhdu 1985 i 1991 g.g. (takie kak mnozhestvennoe nasledovanie, staticheskie funkcii-chleny i chistye virtual'nye funkcii), skoree poyavilis' v rezul'tate obobshcheniya opyta programmirovaniya na S++, chem byli pocherpnuty iz drugih yazykov. Bolee rannie versii yazyka, poluchivshie nazvanie "S s klassami" [16], ispol'zovalis', nachinaya s 1980 g. |tot yazyk voznik potomu, chto avtoru potrebovalos' napisat' programmy modelirovaniya, upravlyaemye preryvaniyami. YAzyk SIMULA-67 ideal'no podhodit dlya etogo, esli ne uchityvat' effektivnost'. YAzyk "S s klassami" ispol'zovalsya dlya bol'shih zadach modelirovaniya. Strogoj proverke podverglis' togda vozmozhnosti napisaniya na nem programm, dlya kotoryh kritichny resursy vremeni i pamyati. V etom yazyke nedostavalo peregruzki operacij, ssylok, virtual'nyh funkcij i mnogih drugih vozmozhnostej. Vpervye S++ vyshel za predely issledovatel'skoj gruppy, v kotoroj rabotal avtor, v iyule 1983 g., odnako togda mnogie vozmozhnosti S++ eshche ne byli razrabotany. Nazvanie S++ (si plyus plyus) , bylo pridumano Rikom Maskitti letom 1983 g. |to nazvanie otrazhaet evolyucionnyj harakter izmenenij yazyka S. Oboznachenie ++ otnositsya k operacii narashchivaniya S. CHut' bolee korotkoe imya S+ yavlyaetsya sintaksicheskoj oshibkoj. Krome togo, ono uzhe bylo ispol'zovano kak nazvanie sovsem drugogo yazyka. Znatoki semantiki S nahodyat, chto S++ huzhe, chem ++S. YAzyk ne poluchil nazvaniya D, poskol'ku on yavlyaetsya rasshireniem S, i v nem ne delaetsya popytok reshit' kakie-libo problemy za schet otkaza ot vozmozhnostej S. Eshche odnu interesnuyu interpretaciyu nazvaniya S++ mozhno najti v prilozhenii k [12]. Iznachal'no S++ byl zaduman dlya togo, chtoby avtoru i ego druz'yam ne nado bylo programmirovat' na assemblere, S ili drugih sovremennyh yazykah vysokogo urovnya. Osnovnoe ego prednaznachenie - uprostit' i sdelat' bolee priyatnym process programmirovaniya dlya otdel'nogo programmista. Do nedavnego vremeni ne bylo plana razrabotki S++ na bumage. Proektirovanie, realizaciya i dokumentirovanie shli parallel'no. Nikogda ne sushchestvovalo "proekta S++" ili "Komiteta po razrabotke S++". Poetomu yazyk razvivalsya i prodolzhaet razvivat'sya tak, chtoby preodolet' vse problemy, s kotorymi stolknulis' pol'zovateli. Tolchkami k razvitiyu sluzhat takzhe i obsuzhdeniya avtorom vseh problem s ego druz'yami i kollegami. V svyazi s lavinoobraznym processom uvelicheniya chisla pol'zovatelej S++, prishlos' sdelat' sleduyushchie izmeneniya. Primerno v 1987 g. stalo ochevidno, chto rabota po standartizacii S++ neizbezhna i chto sleduet nezamedlitel'no pristupit' k sozdaniyu osnovy dlya nee [22]. V rezul'tate byli predprinyaty celenapravlennye dejstviya, chtoby ustanovit' kontakt mezhdu razrabotchikami S++ i bol'shinstvom pol'zovatelej. Primenyalas' obychnaya i elektronnaya pochta, a takzhe bylo neposredstvennoe obshchenie na konferenciyah po S++ i drugih vstrechah. Firma AT&T Bell Laboratories vnesla osnovnoj vklad v etu rabotu, predostaviv avtoru pravo izuchat' versii spravochnogo rukovodstva po yazyku vmeste s upominavshimisya razrabotchikami i pol'zovatelyami. Ne sleduet nedoocenivat' etot vklad, t.k. mnogie iz nih rabotayut v kompaniyah, kotorye mozhno schitat' konkurentami firmy AT&T. Menee prosveshchennaya kompaniya mogla by prosto nichego ne delat', i v rezul'tate poyavilos' by neskol'ko nesoglasovannyh versij yazyka. Okolo sta predstavitelej iz poryadka 20 organizacij izuchali i kommentirovali to, chto stalo sovremennoj versiej spravochnogo rukovodstva i ishodnymi materialami dlya ANSI po standartizacii S++. Ih imena mozhno najti v "Annotirovannom spravochnom rukovodstve po yazyku S++" [4]. Spravochnoe rukovodstvo polnost'yu voshlo v nastoyashchuyu knigu. Nakonec, po iniciative firmy Hewlett-Packard v dekabre 1989 g. v sostave ANSI byl obrazovan komitet X3J16. Ozhidaetsya, chto raboty po standartizacii S++ v ANSI (amerikanskij standart) stanut sostavnoj chast'yu rabot po standartizacii silami ISO (Mezhdunarodnoj organizacii po standartizacii). S++ razvivalsya odnovremenno s razvitiem nekotoryh fundamental'nyh klassov, predstavlennyh v dannoj knige. Naprimer, avtor razrabatyval klassy complex, vector i stack, sozdavaya odnovremenno vozmozhnost' peregruzki operacij. V rezul'tate etih zhe usilij i blagodarya sodejstviyu D. SHapiro poyavilis' strokovye i spisochnye klassy. |ti klassy stali pervymi bibliotechnymi klassami, kotorye nachali aktivno ispol'zovat'sya. Biblioteka task, opisyvaemaya v [19] i v uprazhnenii 13 iz $$6.8 stala chast'yu samoj pervoj programmy, napisannoj na yazyke "S s klassami". |ta programma i ispol'zuemye v nej klassy byli sozdany dlya modelirovaniya v stile Simuly. Biblioteka task byla sushchestvenno pererabotana D. SHapiro i prodolzhaet aktivno ispol'zovat'sya do nastoyashchego vremeni. Potokovaya biblioteka, kak ukazyvalos' v pervom izdanii knigi, byla razrabotana i primenena avtorom. D. SHvarc preobrazoval ee v potokovuyu biblioteku vvoda-vyvoda ($$10), ispol'zuya naryadu s drugimi priemami metod manipulyatorov |.Keniga ($$10.4.2). Klass map ($$8.8) byl predlozhen |.Kenigom. On zhe sozdal klass Pool ($$13.10), chtoby ispol'zovat' dlya biblioteki predlozhennyj avtorom sposob raspredeleniya pamyati dlya klassov ($$5.5.6). Na sozdanie ostal'nyh shablonov povliyali shablony Vector, Map, Slist i sort, predstavlennye v glave 8. Sravnenie yazykov S++ i S Vybor S v kachestve bazovogo yazyka dlya S++ ob座asnyaetsya sleduyushchimi ego dostoinstvami: (1) universal'nost', kratkost' i otnositel'no nizkij uroven'; (2) adekvatnost' bol'shinstvu zadach sistemnogo programmirovaniya; (3) on idet v lyuboj sisteme i na lyuboj mashine; (4) polnost'yu podhodit dlya programmnoj sredy UNIX. V S sushchestvuyut svoi problemy, no v yazyke, razrabatyvaemom "s nulya" oni poyavilis' by tozhe, a problemy S, po krajnej mere, horosho izvestny. Bolee vazhno to, chto orientaciya na S pozvolila ispol'zovat' yazyk "S s klassami" kak poleznyj (hotya i ne ochen' udobnyj) instrument v techenie pervyh mesyacev razdumij o vvedenii v S klassov v stile Simuly. S++ stal ispol'zovat'sya shire, no po mere rosta ego vozmozhnostej, vyhodyashchih za predely S, vnov' i vnov' voznikala problema sovmestimosti. YAsno, chto otkazavshis' ot chasti nasledstva S, mozhno izbezhat' nekotoryh problem (sm., naprimer, [15]). |to ne bylo sdelano po sleduyushchim prichinam: (1) sushchestvuyut milliony strok programm na S, kotorye mozhno uluchshit' s pomoshch'yu S++, no pri uslovii, chto polnoj perepisi ih na yazyk S++ ne potrebuetsya; (2) sushchestvuyut milliony strok bibliotechnyh funkcij i sluzhebnyh programm na S, kotorye mozhno bylo by ispol'zovat' v S++ pri usloviyah sovmestimosti oboih yazykov na stadii svyazyvaniya i ih bol'shogo sintaksicheskogo shodstva; (3) sushchestvuyut sotni tysyach programmistov, znayushchih S; im dostatochno ovladet' tol'ko novymi sredstvami S++ i ne nado izuchat' osnov yazyka; (4) poskol'ku S i S++ budut ispol'zovat'sya odnimi i temi zhe lyud'mi na odnih i teh zhe sistemah mnogie gody, razlichiya mezhdu yazykami dolzhny byt' libo minimal'nymi, libo maksimal'nymi, chtoby svesti k minimumu kolichestvo oshibok i nedorazumenij. Opisanie S++ bylo pererabotano tak, chtoby garantirovat', chto lyubaya dopustimaya v oboih yazykah konstrukciya oznachala v nih odno i to zhe. YAzyk S sam razvivalsya v poslednie neskol'ko let, chto otchasti bylo svyazano s razrabotkoj S++ [14]. Standart ANSI dlya S [27] soderzhit, naprimer, sintaksis opisaniya funkcij, pozaimstvovannyj iz yazyka "S s klassami". Proishodit vzaimnoe zaimstvovanie, naprimer, tip ukazatelya void* byl priduman dlya ANSI S, a vpervye realizovan v S++. Kak bylo obeshchano v pervom izdanii etoj knigi, opisanie S++ bylo dorabotano, chtoby isklyuchit' neopravdannye rashozhdeniya. Teper' S++ bolee sovmestim s yazykom S, chem eto bylo vnachale ($$R.18). V ideale S++ dolzhen maksimal'no priblizhat'sya k ANSI C, no ne bolee [9]. Stoprocentnoj sovmestimosti nikogda ne bylo i ne budet, poskol'ku eto narushit nadezhnost' tipov i soglasovannost' ispol'zovaniya vstroennyh i pol'zovatel'skih tipov, a eti svojstva vsegda byli odnimi iz glavnyh dlya S++. Dlya izucheniya S++ ne obyazatel'no znat' S. Programmirovanie na S sposobstvuet usvoeniyu priemov i dazhe tryukov, kotorye pri programmirovanii na S++ stanovyatsya prosto nenuzhnymi. Naprimer, yavnoe preobrazovanie tipa (privedenie) , v S++ nuzhno gorazdo rezhe, chem v S (sm. "Zamechaniya dlya programmistov na S" nizhe). Tem ne menee, horoshie programmy na yazyke S po suti yavlyayutsya programmami na S++. Naprimer, vse programmy iz klassicheskogo opisaniya S [8] yavlyayutsya programmami na S++. V processe izucheniya S++ budet polezen opyt raboty s lyubym yazykom so staticheskimi tipami. |ffektivnost' i struktura Razvitie yazyka S++ proishodilo na baze yazyka S, i, za nebol'shim isklyucheniem, S byl sohranen v kachestve podmnozhestva C++. Bazovyj yazyk S byl sproektirovan takim obrazom, chto imeetsya ochen' tesnaya svyaz' mezhdu tipami, operaciyami, operatorami i ob容ktami, s kotorymi neposredstvenno rabotaet mashina, t.e. chislami, simvolami i adresami. Za isklyucheniem operacij new, delete i throw, a takzhe proveryaemogo bloka, dlya vypolneniya operatorov i vyrazhenij S++ ne trebuetsya skrytoj dinamicheskoj apparatnoj ili programmnoj podderzhki. V S++ ispol'zuetsya ta zhe (ili dazhe bolee effektivnaya) posledovatel'nost' komand dlya vyzova funkcij i vozvrata iz nih, chto i v S. Esli dazhe eti dovol'no effektivnye operacii stanovyatsya slishkom dorogimi, to vyzov funkcii mozhet byt' zamenen podstanovkoj ee tela, prichem sohranyaetsya udobnaya funkcional'naya zapis' bezo vsyakih rashodov na vyzov funkcii. Pervonachal'no yazyk S zadumyvalsya kak konkurent assemblera, sposobnyj vytesnit' ego iz osnovnyh i naibolee trebovatel'nyh k resursam zadach sistemnogo programmirovaniya. V proekte S++ byli prinyaty mery, chtoby uspehi S v etoj oblasti ne okazalis' pod ugrozoj. Razlichie mezhdu dvumya yazykami prezhde vse sostoit v stepeni vnimaniya, udelyaemogo tipam i strukturam. YAzyk S vyrazitelen i v to zhe vremya snishoditelen po otnosheniyu k tipam. YAzyk S++ eshche bolee vyrazitelen, no takoj vyrazitel'nosti mozhno dostich' lish' togda, kogda tipam udelyayut bol'shoe vnimanie. Kogda tipy ob容ktov izvestny, translyator pravil'no raspoznaet takie vyrazheniya, v kotoryh inache programmistu prishlos' by zapisyvat' operacii s utomitel'nymi podrobnostyami. Krome togo, znanie tipov pozvolyaet translyatoru obnaruzhivat' takie oshibki, kotorye v protivnom sluchae byli by vyyavleny tol'ko pri testirovanii. Otmetim, chto samo po sebe ispol'zovanie strogoj tipizacii yazyka dlya kontrolya parametrov funkcii, zashchity dannyh ot nezakonnogo dostupa, opredeleniya novyh tipov i operacij ne vlechet dopolnitel'nyh rashodov pamyati i uvelicheniya vremeni vypolneniya programmy. V proekte S++ osoboe vnimanie udelyaetsya strukturirovaniyu programmy. |to vyzvano uvelicheniem razmerov programm so vremeni poyavleniya S. Nebol'shuyu programmu (skazhem, ne bolee 1000 strok) mozhno zastavit' iz upryamstva rabotat', narushaya vse pravila horoshego stilya programmirovaniya. Odnako, dejstvuya tak, chelovek uzhe ne smozhet spravit'sya s bol'shoj programmoj. Esli u vashej programmy v 10 000 strok plohaya struktura, to vy obnaruzhite, chto novye oshibki poyavlyayutsya v nej tak zhe bystro, kak udalyayutsya starye. S++ sozdavalsya s cel'yu, chtoby bol'shuyu programmu mozhno bylo strukturirovat' takim obrazom, chtoby odnomu cheloveku ne prishlos' rabotat' s tekstom v 25000 strok. V nastoyashchee vremya mozhno schitat', chto eta cel' polnost'yu dostignuta. Sushchestvuyut, konechno, programmy eshche bol'shego razmera. Odnako te iz nih, kotorye dejstvitel'no ispol'zuyutsya, obychno mozhno razbit' na neskol'ko prakticheski nezavisimyh chastej, kazhdaya iz kotoryh imeet znachitel'no men'shij upomyanutogo razmer. Estestvenno, trudnost' napisaniya i soprovozhdeniya programmy opredelyaetsya ne tol'ko chislom strok teksta, no i slozhnost'yu predmetnoj oblasti. Tak chto privedennye zdes' chisla, kotorymi obosnovyvalis' nashi soobrazheniya, ne nado vosprinimat' slishkom ser'ezno. K sozhaleniyu, ne vsyakuyu chast' programmy mozhno horosho strukturirovat', sdelat' nezavisimoj ot apparatury, dostatochno ponyatnoj i t.d. V S++ est' sredstva, neposredstvenno i effektivno predstavlyayushchie apparatnye vozmozhnosti. Ih ispol'zovanie pozvolyaet izbavit'sya ot bespokojstva o nadezhnosti i prostote ponimaniya programmy. Takie chasti programmy mozhno skryvat', predostavlyaya nadezhnyj i prostoj interfejs s nimi. Estestvenno, esli S++ ispol'zuetsya dlya bol'shoj programmy, to eto oznachaet, chto yazyk ispol'zuyut gruppy programmistov. Poleznuyu rol' zdes' sygrayut svojstvennye yazyku modul'nost', gibkost' i strogo tipizirovannye interfejsy. V S++ est' takoj zhe horoshij nabor sredstv dlya sozdaniya bol'shih programm, kak vo mnogih yazykah. No kogda programma stanovitsya eshche bol'she, problemy po ee sozdaniyu i soprovozhdeniyu peremeshchayutsya iz oblasti yazyka v bolee global'nuyu oblast' programmnyh sredstv i upravleniya proektom. |tim voprosam posvyashcheny glavy 11 i 12. V etoj knige osnovnoe vnimanie udelyaetsya metodam sozdaniya universal'nyh sredstv, poleznyh tipov, bibliotek i t.d. |ti metody mozhno uspeshno primenyat' kak dlya malen'kih, tak i dlya bol'shih programm. Bolee togo, poskol'ku vse netrivial'nye programmy sostoyat iz neskol'kih v znachitel'noj stepeni nezavisimyh drug ot druga chastej, metody programmirovaniya otdel'nyh chastej prigodyatsya kak sistemnym, tak i prikladnym programmistam. Mozhet vozniknut' podozrenie, chto zapis' programmy s ispol'zovaniem podrobnoj sistemy tipov, uvelichit razmer teksta. Dlya programmy na S++ eto ne tak: programma na S++, v kotoroj opisany tipy formal'nyh parametrov funkcij, opredeleny klassy i t.p., obychno byvaet dazhe koroche svoego ekvivalenta na S, gde eti sredstva ne ispol'zuyutsya. Kogda v programme na S++ ispol'zuyutsya biblioteki, ona takzhe okazyvaetsya koroche svoego ekvivalenta na S, esli, konechno, on sushchestvuet. Filosofskie zamechaniya YAzyk programmirovaniya reshaet dve vzaimosvyazannye zadachi: pozvolyaet programmistu zapisat' podlezhashchie vypolneniyu dejstviya i formiruet ponyatiya, kotorymi programmist operiruet, razmyshlyaya o svoej zadache. Pervoj celi ideal'no otvechaet yazyk, kotoryj ochen' "blizok mashine". Togda so vsemi ee osnovnymi "sushchnostyami" mozhno prosto i effektivno rabotat' na etom yazyke, prichem delaya eto ochevidnym dlya programmista sposobom. Imenno eto imeli v vidu sozdateli S. Vtoroj celi ideal'no otvechaet yazyk, kotoryj nastol'ko "blizok k postavlennoj zadache", chto na nem neposredstvenno i tochno vyrazhayutsya ponyatiya, ispol'zuemye v reshenii zadachi. Imenno eto imelos' v vidu, kogda pervonachal'no opredelyalis' sredstva, dobavlyaemye k S. Svyaz' mezhdu yazykom, na kotorom my dumaem i programmiruem, a takzhe mezhdu zadachami i ih resheniyami, kotorye mozhno predstavit' v svoem voobrazhenii, dovol'no blizka. Po etoj prichine ogranichivat' vozmozhnosti yazyka tol'ko poiskom oshibok programmista - v luchshem sluchae opasno. Kak i v sluchae estestvennyh yazykov, ochen' polezno obladat', po krajnej mere, dvuyazychiem. YAzyk predostavlyaet programmistu nekotorye ponyatiya v vide yazykovyh instrumentov; esli oni ne podhodyat dlya zadachi, ih prosto ignoriruyut. Naprimer, esli sushchestvenno ogranichit' ponyatie ukazatelya, to programmist budet vynuzhden dlya sozdaniya struktur, ukazatelej i t.p. ispol'zovat' vektora i operacii s celymi. Horoshij proekt programmy i otsutstvie v nej oshibok nel'zya garantirovat' tol'ko nalichiem ili otsutstviem opredelennyh vozmozhnostej v yazyke. Tipizaciya yazyka dolzhna byt' osobenno polezna dlya netrivial'nyh zadach. Dejstvitel'no, ponyatie klassa v S++ proyavilo sebya kak moshchnoe konceptual'noe sredstvo. Zamechaniya o programmirovanii na yazyke S++ Predpolagaetsya, chto v ideal'nom sluchae razrabotka programmy delitsya na tri etapa: vnachale neobhodimo dobit'sya yasnogo ponimaniya zadachi, zatem opredelit' klyuchevye ponyatiya, ispol'zuemye dlya ee resheniya, i, nakonec, poluchennoe reshenie vyrazit' v vide programmy. Odnako, detali resheniya i tochnye ponyatiya, kotorye budut ispol'zovat'sya v nem, chasto proyasnyayutsya tol'ko posle togo, kak ih popytayutsya vyrazit' v programme. Imenno v etom sluchae bol'shoe znachenie priobretaet vybor yazyka programmirovaniya. Vo mnogih zadachah ispol'zuyutsya ponyatiya, kotorye trudno predstavit' v programme v vide odnogo iz osnovnyh tipov ili v vide funkcii bez svyazannyh s nej staticheskih dannyh. Takoe ponyatie mozhet predstavlyat' v programme klass. Klass - eto tip; on opredelyaet povedenie svyazannyh s nim ob容ktov: ih sozdanie, obrabotku i unichtozhenie. Krome etogo, klass opredelyaet realizaciyu ob容ktov v yazyke, no na nachal'nyh stadiyah razrabotki programmy eto ne yavlyaetsya i ne dolzhno yavlyat'sya glavnoj zabotoj. Dlya napisaniya horoshej programmy nado sostavit' takoj nabor klassov, v kotorom kazhdyj klass chetko predstavlyaet odno ponyatie. Obychno eto oznachaet, chto programmist dolzhen sosredotochit'sya na voprosah: Kak sozdayutsya ob容kty dannogo klassa? Mogut li oni kopirovat'sya i (ili) unichtozhat'sya? Kakie operacii mozhno opredelit' nad etimi ob容ktami? Esli na eti voprosy udovletvoritel'nyh otvetov ne nahoditsya, to, skoree vsego, eto oznachaet, chto ponyatie ne bylo dostatochno yasno sformulirovano. Togda, vozmozhno, stoit eshche porazmyshlyat' nad zadachej i predlagaemym resheniem, a ne nemedlenno pristupat' k programmirovaniyu, nadeyas' v processe nego najti otvety. Proshche vsego rabotat' s ponyatiyami, kotorye imeyut tradicionnuyu matematicheskuyu formu predstavleniya: vsevozmozhnye chisla, mnozhestva, geometricheskie figury i t.d. Dlya takih ponyatij polezno bylo by imet' standartnye biblioteki klassov, no k momentu napisaniya knigi ih eshche ne bylo. V programmnom mire nakopleno udivitel'noe bogatstvo iz takih bibliotek, no net ni formal'nogo, ni fakticheskogo standarta na nih. YAzyk S++ eshche dostatochno molod, i ego biblioteki ne razvilis' v takoj stepeni, kak sam yazyk. Ponyatie ne sushchestvuet v vakuume, vokrug nego vsegda gruppiruyutsya svyazannye s nim ponyatiya. Opredelit' v programme vzaimootnosheniya klassov, inymi slovami, ustanovit' tochnye svyazi mezhdu ispol'zuemymi v zadache ponyatiyami, byvaet trudnee, chem opredelit' kazhdyj iz klassov sam po sebe. V rezul'tate ne dolzhno poluchit'sya "kashi" - kogda kazhdyj klass (ponyatie) zavisit ot vseh ostal'nyh. Pust' est' dva klassa A i B. Togda svyazi mezhdu nimi tipa "A vyzyvaet funkciyu iz B", "A sozdaet ob容kty B", "A imeet chlen tipa B" obychno ne vyzyvayut kakih-libo trudnostej. Svyazi zhe tipa "A ispol'zuet dannye iz B", kak pravilo, mozhno voobshche isklyuchit'. Odno iz samyh moshchnyh intellektual'nyh sredstv, pozvolyayushchih spravit'sya so slozhnost'yu, - eto ierarhicheskoe uporyadochenie, t.e. uporyadochenie svyazannyh mezhdu soboj ponyatij v drevovidnuyu strukturu, v kotoroj samoe obshchee ponyatie nahoditsya v korne dereva. CHasto udaetsya organizovat' klassy programmy kak mnozhestvo derev'ev ili kak napravlennyj aciklichnyj graf. |to oznachaet, chto programmist opredelyaet nabor bazovyh klassov, kazhdyj iz kotoryh imeet svoe mnozhestvo proizvodnyh klassov. Nabor operacij samogo ob