E__ stroka literalov, predstavlyayushchaya datu translyacii v vide "Mmm dd yyyy" ili "Mmm d yyyy", esli chislo men'she 10, (zdes' Mmm zadaet mesyac, dd - den', a yyyy - god). __TIME__ stroka literalov, predstavlyayushchaya vremya translyacii v vide "hh:mm:ss", (zdes' hh zadaet chasy, mm - minuty, a ss - sekundy). Krome togo, schitaetsya opredelennym pri translyacii programmy na S++ makroimya __cplusplus. Perechislennye makroimena nel'zya kak pereopredelyat', tak i otmenyat' ih opredeleniya. Makroimena __LINE__ i __FILE__ mozhno opredelit' s pomoshch'yu komandy #line ($$R.16.6). Opredeleno li makroimya __STDC, i esli da, to kakovo ego znachenie, zavisit ot realizacii. R.17 Prilozhenie A: Svodka grammatiki |to prilozhenie ne otnositsya k spravochnomu rukovodstvu yazyka i ne yavlyaetsya opredeleniem konstrukcij C++. Ona tol'ko dolzhno sluzhit' bolee polnomu ponimaniyu S++. Nel'zya rassmatrivat' ego kak tochnoe opredelenie yazyka, tak kak opisannaya zdes' grammatika dopuskaet proizvol'noe mnozhestvo konstrukcij, kazhdaya iz kotoryh zakonna dlya S++. CHtoby razlichat' vyrazheniya i opisaniya, sleduet primenyat' pravila razresheniya neopredelennosti ($$r.6.8, $$R.7.1, $$R.10.1.1). Dalee, dlya otseivaniya sintaksicheski pravil'nyh, no bessmyslennyh, konstrukcij sleduet primenyat' pravila kontrolya dostupa, razresheniya neopredelennosti i kontrolya tipa. R.17.1 Sluzhebnye slova V opisaniyah: typedef ($$R.7.1.3), klassa ($$R.9), perechisleniya ($$R.7.2), shablona tipa - ($$R.14) vvedeny novye, zavisyashchie ot konteksta, sluzhebnye slova, a imenno: imya-klassa: identifikator imya-perechisleniya: identifikator imya-typedef: identifikator Otmetim, chto imya-typedef, oboznachayushchee klass, yavlyaetsya v to zhe vremya konstrukciej imya-klassa ($$R.9.1). R.17.2 Vyrazheniya vyrazhenie: vyrazhenie-prisvaivaniya vyrazhenie, vyrazhenie-prisvaivaniya vyrazhenie-prisvaivaniya: vyrazhenie-usloviya unarnoe-vyrazhenie operaciya-prisvaivaniya vyrazhenie-prisvaivaniya operaciya-prisvaivaniya: odin iz = *= /= %= += -= >>= <<= &= ^= |= vyrazhenie-usloviya: logicheskoe-vyrazhenie-ILI logicheskoe-vyrazhenie-ILI ? vyrazhenie : vyrazhenie-usloviya logicheskoe-vyrazhenie-ILI: logicheskoe-vyrazhenie-I logicheskoe-vyrazhenie-ILI || logicheskoe-vyrazhenie-I logicheskoe-vyrazhenie-I: vyrazhenie-ILI logicheskoe-vyrazhenie-I && vyrazhenie-ILI vyrazhenie-ILI: vyrazhenie-isklyuchayushchego-ILI vyrazhenie-ILI | vyrazhenie-isklyuchayushchego-ILI vyrazhenie-isklyuchayushchego-ILI: vyrazhenie-I vyrazhenie-isklyuchayushchego-ILI ^ vyrazhenie-I vyrazhenie-I: vyrazhenie-ravenstva vyrazhenie-I & vyrazhenie-ravenstva vyrazhenie-ravenstva: vyrazhenie-otnosheniya vyrazhenie-ravenstva == vyrazhenie-otnosheniya vyrazhenie-ravenstva != vyrazhenie-otnosheniya vyrazhenie-otnosheniya: sdvigovoe-vyrazhenie vyrazhenie-otnosheniya < sdvigovoe-vyrazhenie vyrazhenie-otnosheniya > sdvigovoe-vyrazhenie vyrazhenie-otnosheniya <= sdvigovoe-vyrazhenie vyrazhenie-otnosheniya >= sdvigovoe-vyrazhenie sdvigovoe-vyrazhenie: additivnoe-vyrazhenie sdvigovoe-vyrazhenie << additivnoe vyrazhenie sdvigovoe-vyrazhenie >> additivnoe vyrazhenie additivnoe-vyrazhenie: mul'tiplikativnoe-vyrazhenie additivnoe vyrazhenie + mul'tiplikativnoe-vyrazhenie additivnoe-vyrazhenie - mul'tiplikativnoe-vyrazhenie mul'tiplikativnoe-vyrazhenie: vyrazhenie-pm mul'tiplikativnoe-vyrazhenie * vyrazhenie-pm mul'tiplikativnoe-vyrazhenie / vyrazhenie-pm mul'tiplikativnoe-vyrazhenie % vyrazhenie-pm vyrazhenie-pm: vyrazhenie-privedeniya vyrazhenie-pm .* vyrazhenie-privedeniya vyrazhenie-pm ->* vyrazhenie-privedeniya vyrazhenie-privedeniya: unarnoe-vyrazhenie ( imya-tipa ) vyrazhenie-privedeniya unarnoe-vyrazhenie: postfiksnoe-vyrazhenie ++ unarnoe vyrazhenie -- unarnoe vyrazhenie unarnaya-operaciya vyrazhenie-privedeniya sizeof unarnaya-operaciya sizeof ( imya-tipa ) vyrazhenie-razmeshcheniya vyrazhenie-osvobozhdeniya unarnaya-operaciya: odin iz * & + - ! ~ vyrazhenie-razmeshcheniya: ::opt new parametry-new opt imya-tipa-new inicializator-new ::opt new parametry-new opt ( imya-tipa ) inicializator-new parametry-new: ( spisok-vyrazhenij ) imya-tipa-new: spisok-specifikacij-tipa opisatel'-new opt opisatel'-new: * spisok-specifikacij-cv opt opisatel'-new opt imya-klassa :: spisok-specifikacij-cv opt opisatel'-new opt opisatel'-new opt [ vyrazhenie ] inicializator-new: ( spisok-inicializatorov opt ) vyrazhenie-osvobozhdeniya: ::opt delete vyrazhenie-privedeniya ::opt delete [] vyrazhenie-privedeniya postfiksnoe-vyrazhenie: pervichnoe-vyrazhenie postfiksnoe-vyrazhenie [ vyrazhenie ] postfiksnoe-vyrazhenie ( spisok-vyrazhenij opt ) imya-prostogo-tipa ( spisok-vyrazhenij opt ) postfiksnoe-vyrazhenie . imya postfiksnoe-vyrazhenie -> imya postfiksnoe-vyrazhenie ++ postfiksnoe-vyrazhenie -- spisok-vyrazhenij: vyrazhenie-prisvaivaniya spisok-vyrazhenij , vyrazhenie-prisvaivaniya pervichnoe-vyrazhenie: literal this :: identifikator :: imya-funkcii-operacii :: utochnennoe-imya ( vyrazhenie ) imya imya: identifikator imya-funkcii-operacii imya-funkcii-preobrazovaniya ~imya-klassa utochnennoe-imya utochnennoe-imya: utochnyayushchee-imya-klassa :: imya literal: celaya konstanta simvol'naya konstanta konstanta s plavayushchej tochkoj stroka literalov R.17.3 Opisaniya opisaniya: specifikacii-opisaniya opt spisok-opisatelej opt ; opisanie-asm opredelenie-funkcii specifikaciya-svyazi specifikaciya-opisaniya: specifikaciya-klassa-pamyati specifikaciya-tipa specifikaciya-fct specifikaciya-shablona-tipa friend typedef specifikacii-opisaniya: specifikacii-opisaniya opt specifikaciya-opisaniya specifikaciya-klassa-pamyati: auto register static extern specifikaciya-fct: inline virtual specifikaciya-tipa: imya-prostogo-tipa specifikaciya-klassa specifikaciya-perechisleniya specifikaciya-slozhnogo-tipa :: imya-klassa const volatile imya-prostogo-tipa: polnoe-imya-klassa utochnennoe-imya-tipa char short int long signed unsigned float double void specifikaciya-slozhnogo-tipa: sluzhebnoe-slovo-klassa imya-klassa sluzhebnoe-slovo-klassa identifikator sluzhebnoe-slovo-klassa: class struct union utochnennoe-imya-tipa: imya-typedef imya-klassa :: utochnennoe-imya-tipa polnoe-imya-klassa: utochnennoe-imya-klassa :: utochnennoe-imya-klassa utochnennoe-imya-klassa: imya-klassa imya-klassa :: utochnennoe-imya-klassa imya-perechisleniya: identifikator specifikaciya-perechisleniya: enum identifikator opt { spisok-perechisleniya } spisok-perechisleniya: element-perechisleniya spisok-perechisleniya , element-perechisleniya element-perechisleniya: identifikator identifikator = vyrazhenie-konstanta specifikaciya-svyazi: extern stroka-literal { spisok-opisanij opt } extern stroka-literal opisanie spisok-opisanij: opisanie spisok-opisanij opisanie opisanie-asm: asm ( stroka-literal) ; R.17.4 Opisateli spisok-opisanij: opisatel'-s-inicializatorom spisok-opisanij , opisatel'-s-inicializatorom opisatel'-s-inicializatorom: opisatel' inicializator opt opisatel': imya-v-opisatele operaciya-ptr opisatel' opisatel' (spisok-opisanij-parametrov) spisok-specifikacij-cv opt opisatel' [ vyrazhenie-konstanta opt] ( opisatel' ) operaciya-ptr: * spisok-specifikacij-cv opt & spisok-specifikacij-cv opt polnoe-imya-klassa :: * spisok-specifikacij-cv opt spisok-specifikacij-cv: const volatile imya-v-opisatele: imya imya-klassa ~imya-klassa imya-typedef utochnennoe-imya-tipa imya-tipa: spisok-specifikacij-tipa abstraktnyj-opisatel' opt spisok-specifikacij-tipa: specifikaciya-tipa spisok-specifikacij-tipa abstraktnyj-opisatel': operaciya-ptr abstraktnyj-opisatel' opt abstraktnyj-opisatel' opt ( spisok-opisanij-parametrov ) spisok-specifikacij_cv opt abstraktnyj-opisatel' opt [ vyrazhenie-konstanta opt ] ( abstraktnyj-opisatel' ) spisok-opisanij-parametrov: spisok-opisanij-param opt ... opt spisok-opisanij-param , ... spisok-opisanij-param: opisanie-parametra spisok-opisanij-param , opisanie-parametra opisanie-parametra: specifikacii-opisaniya opisatel' specifikacii-opisaniya opisatel' = vyrazhenie specifikacii-opisaniya abstraktnyj-opisatel' opt specifikacii-opisaniya abstraktnyj-opisatel' opt = vyrazhenie opredelenie-funkcii: specifikacii-opisaniya opt opisatel' inicializator-ctor telo-funkcii telo-funkcii: sostavnoj-operator inicializator: = vyrazhenie-prisvaivaniya = { spisok-inicializatorov , opt } ( spisok-vyrazhenij ) spisok-inicializatorov: vyrazhenie-prisvaivaniya spisok-inicializatorov , vyrazhenie-prisvaivaniya { spisok-inicializatorov , opt } R.17.5 Opisaniya klassa specifikaciya-klassa: zagolovok-klassa { spisok-chlenov opt } zagolovok-klassa: sluzhebnoe-slovo-klassa identifikator opt spec-bazovyh opt sluzhebnoe-slovo-klassa imya-klassa spec-bazovyh opt sluzhebnoe-slovo-klassa: class struct union spisok-chlenov: opisanie-chlena spisok-chlenov opt specifikaciya-dostupa : spisok-chlenov opt opisanie-chlena: specifikacii-opisaniya opt spisok-opisatelej-chlenov opt ; opredelenie-funkcii ; opt utochnennoe-imya ; spisok-opisatelej-chlenov: opisatel'-chlena spisok-opisatelej-chlenov , opisatel'-chlena opisatel'-chlena: opisatel' specifikaciya-chistoj opt identifikator opt : vyrazhenie-konstanta specifikaciya-chistoj: = 0 spisok-bazovyh: specifikaciya-bazovyh spisok-bazovyh , specifikaciya-bazovyh specifikaciya-bazovyh: polnoe-imya-klassa virtual specifikaciya-dostupa opt polnoe-imya-klassa specifikaciya-dostupa virtual opt polnoe-imya-klassa specifikaciya-dostupa: private protected public imya-funkcii-preobrazovaniya: operator imya-tipa-preobrazovaniya imya-tipa-preobrazovaniya: spisok-specifikacij-tipa operaciya-ptr opt inicializator-ctor: : spisok-inicializatorov-chlenov spisok-inicializatorov-chlenov: inicializator-chlena inicializator-chlena , spisok-inicializatorov-chlena inicializator-chlena: polnoe-imya-klassa ( spisok-vyrazhenij opt ) identifikator imya-funkcii-operator: operator operaciya operaciya: odin iz new delete + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* -> () [] R.17.6 Operatory operator: pomechennyj-operator operator-vyrazhenie sostavnoj-operator vybirayushchij-operator operator-cikla operator-perehoda operator-opisaniya pomechennyj-operator: identifikator : operator case vyrazhenie-konstanta : operator default : operator operator-vyrazhenie: vyrazhenie opt ; sostavnoj-operator: { spisok-operatorov opt } spisok-operatorov: operator spisok-operatorov operator vybirayushchij-operator: if ( vyrazhenie ) operator if ( vyrazhenie ) operator else operator switch ( vyrazhenie ) operator operator-cikla: while ( vyrazhenie ) operator do operator while (vyrazhenie) for ( operator-inic vyrazhenie opt ; vyrazhenie opt ) operator operator-inic: operator-vyrazhenie operator-opisanie operator-perehoda: break ; continue ; return vyrazhenie opt ; goto identifikator ; operator-opisaniya: opisanie R.17.7 Preprocessor #define identifikator stroka-leksem #define identifikator ( identifikator , ... , identifikator ) stroka-leksem #include "imyafajla" #include <imyafajla> #line konstanta "imyafajla" opt #undef identifikator uslovnoe: chast'-if chasti-elif opt chast'-else opt stroka-endif chast'-if: stroka-if tekst stroka-if: # if vyrazhenie-konstanta # ifdef identifikator # ifndef identifikator chasti-elif: stroka-elif tekst chasti-elif stroka-elif tekst stroka-elif: # elif vyrazhenie-konstanta chast'-else: stroka-else tekst stroka-else: # else stroka-endif: # endif R.17.8 SHablony tipa opisanie-shablona-tipa: template < spisok-parametrov-shablona-tipa> opisanie spisok-parametrov-shablona-tipa: parametr-shablona-tipa spisok-parametrov-shablona-tipa , parametr-shablona-tipa parametr-shablona-tipa: parametr-tipa opisanie-parametra parametr-tipa: class identifikator imya-shablonnogo-klassa: imya-shablona-tipa < spisok-param-shablona-tipa > spisok-param-shablona-tipa: param-shablona-tipa spisok-param-shablona-tipa , param-shablona-tipa param-shablona: vyrazhenie imya-tipa R.17.9 Obrabotka osobyh situacij proveryaemyj-blok: try sostavnoj-operator spisok-obrabotchikov spisok-obrabotchikov: obrabotchik spisok-obrabotchikov opt obrabotchik: catch ( opisanie-osoboj-situacii ) sostavnoj-operator opisanie-osoboj-situacii: spisok-specifikacij-tipa opisatel' spisok-specifikacij-tipa abstraktnyj-opisatel' spisok-specifikacij-tipa ... vyrazhenie-zapuska: throw vyrazhenie opt specifikaciya-osoboj-situacii: throw ( spisok-tipa opt ) spisok-tipa: imya-tipa spisok-tipa , imya-tipa R.18 Prilozhenie B: Sovmestimost' |to prilozhenie ne otnositsya k spravochnomu rukovodstvu S++ i ne yavlyaetsya opredeleniem konstrukcij yazyka. YAzyk S++ osnovyvaetsya na S (opisanie v knige Kernigana i Ritchi, 78 g., dal'she K&R) i vklyuchaet bol'shinstvo izmenenij, predlozhennyh v ANSI standarte dlya S. Pri konvertirovanii programm na yazykah S++, K&R C i ANSI C mogut vozniknut' trudnosti v svyazi s razlichnym vychisleniem v nih vyrazhenij. Translyator dolzhen raspoznavat' vse razlichiya mezhdu S++ i ANSI C. Programmy na S++ i ANSI C dolzhny imet' odinakovyj smysl za isklyucheniem treh sleduyushchih sluchaev: V yazyke S vyrazhenie sizeof('a') ravno sizeof(int), a v S++ ono ravno sizeof(char). Esli est' opisanie enum e { A }; to sizeof(A) ravno v S sizeof(int), togda kak v S++ ono ravno sizeof(e) i ne obyazano byt' ravno sizeof(int). Imya struktury, opisannoj vo vnutrennem bloke, mozhet skryvat' imya ob容kta, funkcii, elementa perechisleniya ili tipa iz vneshnego bloka. Privedem primer: int x[99]; void f() { struct x { int a; }; sizeof(x); /* dlya C eto razmer massiva */ /* a dlya C++ razmer struktury */ } R.18.1 Rasshireniya V etom razdele perechislyayutsya osnovnye rasshireniya yazyka S, vvedennye v S++. R.18.1.1 Vozmozhnosti S++, vvedennye v 1985 g. Zdes' perechislyayutsya vozmozhnosti, dobavlennye k S, versiej yazyka S++ 1985 g. Mozhno ukazyvat' tipy formal'nyh parametrov funkcii ($$R.8.2.5), i oni budut proveryat'sya ($$R.5.2.2). Budet proishodit' preobrazovanie tipa ($$R.5.2.2). |to est' i v ANSI C. V vyrazheniyah so znacheniyami tipa float vychisleniya mogut prohodit' s obychnoj tochnost'yu ($$R.3.6.1 i $$R.4.3). |to est' i v ANSI C. Mozhno peregruzhat' imena funkcij; $$R.13. Mozhno peregruzhat' operacii; $$R.13.4 Vozmozhna realizaciya vyzova funkcij podstanovkoj; $$R.7.1.2. Mozhno opisyvat' ob容kty, predstavlyayushchie dannye, so specifikaciej const; $$R.7.1.6. |to est' i v ANSI C. Mozhno opisyvat' tipa ssylki; $$R.8.2.2 i $$R.8.4.3. Vozmozhno upravlenie svobodnoj pamyat'yu s pomoshch'yu operacij new i delete; $$R.5.3.3 i $$R.5.3.4. Vvedeny klassy, kotorye pozvolyayut: skryvat' informaciyu ($$R.11), provodit' inicializaciyu ($$R.12.1), osushchestvlyat' pol'zovatel'skie preobrazovaniya tipa ($$R.12.3) i rabotat' s dinamicheskimi tipami s pomoshch'yu virtual'nyh funkcij ($$R.10.2). Imya klassa ili perechisleniya schitaetsya imenem tipa; $$R.9. Ukazatel' na lyuboj ob容kt c tipom, ne yavlyayushchimsya const ili volatile, mozhno prisvoit' ukazatelyu tipa void*. |to est' i v ANSI C. Ukazatel' na funkciyu mozhno prisvaivat' ukazatelyu tipa void*; $$R.4.6. Opisanie vnutri bloka schitaetsya operatorom; $$R.6.7. Mozhno opisyvat' bezymyannye ob容dineniya; $$R.9.5. R.18.1.2 Vozmozhnosti, dobavlennye v S++ posle 1985 g. Zdes' perechislyayutsya osnovnye rasshireniya S++ posle 1985 g.: Klass mozhet imet' bolee odnogo pryamogo bazovogo klassa (mnozhestvennoe nasledovanie); $$R.10.1. CHleny klassa mogut byt' zashchishchennymi; $$R.11. Operacii new i delete mozhno opisyvat' v klasse i peregruzhat'; $$r.5.3.3, $$R.5.3.4, $$R.12.5. |to pozvolilo opredelennyj sposob upravleniya pamyat'yu dlya klassa s pomoshch'yu "prisvaivaniya ukazatelyu this" otnesti v razdel anahronizmov; $$R.18.3.3. Mozhno yavno unichtozhat' ob容kty; $$R.12.4. Prisvaivaniya i inicializaciya dlya klassa opredeleny kak prisvaivanie i inicializaciya po chlenam; $$R.12.8. Sluzhebnoe slovo overload stalo izlishnim i otneseno k razdelu anahronizmov; $$R.18.3. Proizvol'nye vyrazheniya razresheny v kachestve inicializatorov staticheskih ob容ktov; $$R.8.4. Ob容kty, predstavlyayushchie dannye, mogut byt' volatile; $$R.7.1.6. Takzhe i v ANSI C. Dopustimy inicializatory dlya staticheskih chlenov klassa; $$R.9.4. Funkcii-chleny mogut byt' staticheskimi; $$R.9.4. Funkcii-chleny mogut byt' const ili volatile; $$R.9.3.1. Mozhno yavno ukazat' svyazyvanie s podprogrammami na drugih yazykah; $$R.7.4. Mozhno peregruzhat' operacii ->, ->* i ` ; $$R.13.4. Klassy mogut byt' abstraktnymi; $$R.10.3. Dlya pol'zovatel'skih tipov prefiksnye i postfiksnye operacii razlichayutsya. SHablony tipov; $$R.14. Upravlenie osobymi situaciyami; $$R.15. R.18.2 S++ i ANSI C Voobshche yazyk S++ obladaet bol'shimi vozmozhnostyami i nalagaet men'she ogranichenij, chem ANSI C, poetomu bol'shinstvo konstrukcij ANSI C yavlyayutsya zakonnymi dlya S++, prichem smysl ih ne menyaetsya. Isklyucheniya svoditsya k sleduyushchemu: Lyubaya programma na ANSI C, ispol'zuyushchaya v kachestve identifikatorov sleduyushchie sluzhebnye slova S++, ne yavlyaetsya programmoj na S++; $$R.2.4: asm catch class delete friend inline new operator private protected public template try this virtual throw Hotya eto schitaetsya ustarevshem v ANSI C, realizaciya S mozhet nalagat' drakonovskie ogranicheniya na dlinu identifikatorov; v realizaciyah S++ eto nedopustimo; $$R.2.3. V S++ funkciya dolzhna byt' opisana prezhde, chem ee mozhno vyzvat'; $$R.5.2.2. Opisanie f(); v S++ oznachaet, chto funkciya f ne imeet parametrov ($$R.8.2.5), a v S eto oznachaet, chto f mozhet imet' lyuboe chislo parametrov lyubogo tipa. Takoe opisanie schitaetsya ustarevshim v ANSI C. V ANSI C mozhno neskol'ko raz opisat' bez specifikacii extern global'nyj ob容kt dannyh, v S++ vozmozhno tol'ko odno ego opredelenie; $$R.3.3 V S++ klass ne mozhet imet' tozhe imya, chto i imya typedef, otnosyashcheesya v toj zhe oblasti vidimosti k drugomu tipu; $$R.9.1. V ANSI C operand tipa void* mozhno ispol'zovat' v pravoj chasti prisvaivaniya, a takzhe pri inicializacii peremennoj tipa ukazatelya na proizvol'nyj tip; v S++ eto nevozmozhno $$R.7.1.6. V ANSI C vozmozhny komandy perehodov, obhodyashchie inicializaciyu; v S++ eto nevozmozhno. V ANSI C po umolchaniyu global'nyj ob容kt tipa const podlezhit vneshnemu svyazyvaniyu; dlya S++ eto ne tak; $$R.3.3. Opredeleniya funkcij v "starom" stile i vyzovy neopisannyh funkcij schitayutsya v S++ anahronizmami, kotorye ne obyazatel'no dolzhny podderzhivat'sya lyuboj realizaciej; $$R.18.3.1. V ANSI C oni prosto schitayutsya ustarevshimi. V S++ struktura (struct) obrazuet oblast' vidimosti ($$R.3.2); V ANSI C struktura, perechislenie ili element perechisleniya, opisannye v strukture podnimayutsya v oblast' vidimosti samoj struktury. Prisvaivanie ob容ktu tipa perechisleniya znacheniya, ne prinadlezhashchego perechisleniyu, schitaetsya v S++ anahronizmom i ne dolzhno podderzhivat'sya vo vseh realizaciyah; $$R.7.2. V ANSI C rekomenduetsya dlya takih prisvaivanij vydavat' preduprezhdenie. Stroki, inicializiruyushchie simvol'nye massivy, ne mogut byt' dlinnee etih massivov; $$R.8.4.2. Tip simvol'noj konstanty v S++ est' char ($$R.2.5.2) i int v ANSI C. Tip elementa perechisleniya est' tip etogo perechisleniya v S++ ($$R.7.2) i tip int v ANSI C. Krome togo, standart ANSI dlya S dopuskaet znachitel'nye razlichiya v dopustimyh realizaciyah yazyka, chto mozhet privesti k eshche bol'shim rashozhdeniyam mezhdu realizaciyami S++ i S. V chastnosti, v nekotoryh realizaciyah S mogut byt' dopustimy nekotorye nesovmestimye opisaniya. V S++ trebuetsya sovmestimost' dazhe dlya raznyh edinic translyacii; $$R.3.3. R.18.2.1 Kak borot'sya s rashozhdeniyami V obshchem sluchae programma na S++ ispol'zuet mnogie vozmozhnosti, otsutstvuyushchie v ANSI C. Dlya takoj programmy neznachitel'nye rashozhdeniya, perechislennye v $$R.18.2, yavno perekryvayutsya rasshireniyami v S++. Kogda S++ i ANSI C dolzhny imet' obshchie zagolovochnye fajly, nuzhno pozabotit'sya, chtoby eti fajly predstavlyali tekst na obshchem podmnozhestve etih yazykov. Nel'zya pol'zovat'sya specificheskimi vozmozhnostyami S++ takimi, kak klassy, peregruzka i t.p. Nel'zya ispol'zovat' odno imya dlya oboznacheniya tipa struktury i drugogo tipa. Funkciyu bez parametrov sleduet opisyvat' kak f(void), a ne prosto f(). Global'nye ob容kty tipa const sleduet yavno specificirovat' kak static ili extern. Dlya razdeleniya chastej programmy na ANSI C i S++ mozhno ispol'zovat' uslovnuyu translyaciyu s predopisannym imenem __cplusplus. Funkcii, kotorye mogut vyzyvat'sya iz programm na obeih yazykah, dolzhny byt' yavno opisany, kak funkcii, podlezhashchie svyazyvaniyu s S. R.18.3 Anahronizm Realizaciya S++ mozhet vklyuchat' perechislennye zdes' rasshireniya, chtoby oblegchit' ispol'zovanie programmy na S, ili chtoby uprostit' perehod s bolee rannih versij S++. Otmetim, chto s kazhdym rasshireniem svyazany nezhelatel'nye posledstviya. Esli realizaciya predostavlyaet takoe rasshirenie, to ona dolzhno takzhe predostavlyat' vozmozhnost' ubedit'sya v otsutstvii etih posledstvij dlya ishodnoj programmy. Realizaciya S++ ne obyazana obespechivat' eti rasshireniya. Pri opisanii ili opredelenii funkcii mozhno ispol'zovat' slovo overload v konstrukcii specifikaciya-opisaniya ($$R.7). Esli ono ispol'zuetsya v specifikacii-opisaniya, to schitaetsya sluzhebnym slovom i ego nel'zya ispol'zovat' kak identifikator. Opredelenie staticheskogo chlena klassa, predstavlyayushchego dannye, dlya kotorogo dana standartnaya inicializaciya nulyami ($$R.8.4, $$R.9.4), mozhet byt' opushcheno. Mozhno ispol'zovat' komandy preprocessora starogo stilya (do ANSI C). Mozhno prisvaivat' ob容ktu tipa perechisleniya znachenie tipa int. Pri udalenii massiva, tip kotorogo ne imeet destruktora, mozhno ukazyvat' chislo elementov; $$R.5.3.4. Odna funkciya operator++() mozhet ispol'zovat'sya dlya peregruzki kak prefiksnyh, tak i postfiksnyh operacij ++; tozhe verno dlya operacii --; $$R.13.4.6. R.18.3.1 Opredeleniya funkcij starogo stilya Mozhno ispol'zovat' sintaksis S dlya opredelenij funkcij: staroe-opredelenie-funkcii: specifikacii-opisanij opt staryj-opisatel'-funkcii spisok-opisanij opt telo-funkcii staryj-opisatel'-funkcii: opisatel' ( spisok-parametrov opt ) spisok-parametrov: identifikator spisok-parametrov , identifikator Privedem primer: max(a,b) int b; { return (a<b) ? b : a; } Esli opredelennaya takim obrazom funkciya ne byla opisana ranee, to tip ee formal'nyh parametrov polagaetsya (...), t.e. on ne budet proveryat'sya. Esli ona byla opisana, to tip dolzhen soglasovyvat'sya s tipom, ukazannym v opisanii. Privedennyj sintaksis nel'zya ispol'zovat' dlya opredeleniya funkcij-chlenov. R.18.3.2 Staryj stil' zadaniya inicializatora bazovogo klassa V konstrukcii inicializator-pamyati ($$R.12.6.2) mozhno ne ukazyvat' imya-klassa, oboznachayushchee bazovyj klass pri uslovii, chto sushchestvuet tol'ko odin pryamoj (neposredstvennyj) bazovyj klass. Poetomu v opisanii class B { // ... public: B(int); }; class D : public B { // ... D(int i) : (i) { /* ... */ } }; budet vyzyvat'sya konstruktor B s parametrom i. R.18.3.3 Prisvaivanie ukazatelyu this Prisvaivaya opredelennye znacheniya ukazatelyu this, pol'zovatel' mog upravlyat' vydeleniem pamyati dlya ob容kta nekotorogo klassa. V konstruktore do ispol'zovaniya chlenov klassa mozhno bylo s pomoshch'yu takogo prisvaivaniya realizovat' svoj algoritm vydeleniya pamyati. Prisvaivaya v destruktore ukazatelyu this nul', mozhno bylo obojti standartnuyu operaciyu osvobozhdeniya ob容ktov klassa. Krome togo, prisvaivanie nulya v destruktore otmenyalo neyavnye vyzovy destruktorov dlya chlenov i bazovyh klassov, naprimer: class Z { int z[10]; Z() { this = my_allocator(sizeof(Z) ); } ~Z() { my_deallocator (this); this = 0; } }; Esli vydelenie pamyati uzhe proizoshlo (kak byvaet dlya chlenov i ob容ktov auto ili static), to pri vhode v konstruktor this imeet nenulevoe znachenie i znachenie nul' v protivnom sluchae. Vyzovy konstruktorov dlya chlenov i bazovyh klassov proizojdut tol'ko posle togo, kak this poluchil znachenie. Esli v konstruktore bazovogo klassa est' prisvaivanie this, to novoe znachenie this budet ispol'zovat'sya i v konstruktorah proizvodnyh klassov, esli oni est'. Otmetim, chto pri nalichii ukazannogo anahronizma ili tip ukazatelya this ne mozhet byt' *const, ili nuzhno delat' isklyuchenie dlya this iz pravila o prisvaivanii ukazatelyam so specifikaciej const. R.18.3.4 Privedenie ukazatelej na funkciyu-chlen Ukazatel' na funkciyu-chlen nekotorogo ob容kta mozhno privesti k ukazatelyu na kakuyu-to druguyu funkciyu, naprimer (int (*) ())p->f. Rezul'tiruyushchij ukazatel' budet nastroen na funkciyu, vyzov kotoroj budet proishodit' s pomoshch'yu obrashcheniya k etoj funkcii-chlenu dlya togo zhe ob容kta. Kak obychno rezul'tat takogo vyzova schitaetsya neopredelennym. R.18.3.5 Nevlozhennost' klassov Esli klass opisan vnutri drugogo klassa i v programme bol'she ne opisano klassov s etim imenem, to ego mozhno ispol'zovat', kak esli by on byl opisan vne klassa (tak obstoit delo s opisaniem struct v S), naprimer: struct S { struct T { int a; }; int b; }; struct T x; // oznachaet `S::T x;' Spisok sluzhebnyh slov auto avtomaticheskij break razryv case variant catch perehvatit' char simvol class klass const konst continue prodolzhit' default po umolchaniyu delete udalit' do delat' double dvojnoj else inache enum perechislenie extern vneshnij float plavayushchij for dlya friend drug goto perehod na if esli inline podstanovka int celyj long dlinnyj new novyj operator operator private chastnyj protected zashchishchennyj public obshchij register registrovyj return vozvrat short korotkij signed znakovyj sizeof razmer static staticheskij struct struktura switch pereklyuchatel' template shablon tipa this tekushchij throw zapustit' try proverit' typedef tip union ob容dinenie unsigned bezznakovyj virtual virtual'nyj void pustoj volatile izmenyaemyj while poka UKAZATELX A abstraktnyj abstraktnyj klass abstraktnyj opisatel' abstraktnyj tip dannyh (ATD) abstrakciya abstrakciya dannyh abstrakciya dannyh ili nasledovanie avtomaticheskie agregat Ada additivnye operacii adres adres bitovogo polya adres i prisvaivanie adres konstruktora Algol68 amerikanskij nacional'nyj institut standartov (ANSI) anahronizm analizator rekursivnogo spuska arifmetika bezznakovogo arifmetika fiksirovannoj tochnosti arifmeticheskaya osobaya situaciya arifmeticheskie operacii s ukazatelem arifmeticheskie preobrazovaniya arifmeticheskij tip assembler asinhronnye sobytiya associativnost' operacij associativnyj massiv associativnost' operacij B bazovyj bazovyj klass bezymyannoe ob容dinenie bezznakovaya arifmetika bezznakovaya konstanta bezznakovyj tip biblioteka biblioteka zagolovochnyh fajlov bitovoe pole blok blokirovanie (zamok) buferizaciya vvoda-vyvoda V vvod vstroennyh tipov vvod i vyvod vvod pol'zovatel'skih tipov vvod-vyvod virtual'nyj bazovyj klass virtual'nyj destruktor virtual'nyj konstruktor virtual'naya funkciya vklyuchaemyj fajl vklyuchenie ishodnogo fajla vneshnee svyazyvanie vnutrennee svyazyvanie vnutrennyaya struktura vlozhennyj klass vozvrat karetki vozvrashchaemoe funkciej znachenie vos'merichnaya konstanta vos'merichnoe chislo vremya zhizni ob容kta vstroennyj vstroennaya operaciya vstroennyj (osnovnoj) tip vybor chlena klassa vyvod vstroennyh tipov vyvod pol'zovatel'skih tipov vydelenie probelami vyzov vyzov virtual'noj funkcii vyzov destruktora vyzov operatornoj funkcii vyzov po znacheniyu vyzov po ssylke vyzov funkcii vyravnivanie vyravnivanie bitovogo polya vyravnivanie klassa vyravnivanie chlena klassa vyrazhenie vyrazhenie-zapuska vyrazhenie konstanta vyrazhenie-konstanta vyrazhenie-otnosheniya vyrazhenie prisvaivaniya vyrazhenie-privedeniya vyrazhenie-prisvaivaniya vyrazhenie-sdviga vyrazhenie-razmeshcheniya vychislenie standartnogo parametra vychitanie ukazatelej G gibridnyj proekt global'naya oblast' vidimosti global'naya oblast' vidimosti global'noe bezymyannoe ob容dinenie global'noe imya global'noe imya global'nye dannye global'nye ob容kty glubokoe kopirovanie gorizontal'naya tabulyaciya \t gruppirovanie osobyh situacij D dannye dvojnaya kavychka desyatichnaya konstanta destruktor destruktor vremennogo ob容kta destruktor lokal'nogo ob容kta destruktor ob容dineniya destruktor proizvodnogo klassa dinamicheskaya inicializaciya dinamicheskaya informaciya o tipe dinamicheskij kontrol' tipov dinamicheskaya oshibka dlina imeni dostup dostup k bazovomu klassu dostup k virtual'noj funkcii dostup k zashchishchennomu chlenu dostup k imeni chlena dostup k chlenu bazovogo klassa dostup k chlenu klassa druzhestvennyj klass druzhestvennaya funkciya dostup k virtual'noj funkcii E edinica translyacii Z zavershenie programmy zagolovochnyj fajl zagruzchik zakrytie potoka zapros resursa zapusk osoboj situacii zapusk programmy zarezervirovannyj identifikator zashchishchennyj chlen znakovyj tip I identifikator ierarhiya klassov ierarhiya osobyh situacij ierarhiya ob容ktov izmenyaemyj adres imya imya klassa imya-klassa imya peregruzhennogo chlena imya peregruzhennoj funkcii imya-prostogo-tipa imya-shablonnogo-klassa imya-funkcii-preobrazovaniya inicializator inicializaciya inicializaciya avtomaticheskih inicializaciya bazovogo klassa inicializaciya biblioteki inicializaciya i prisvaivanie inicializaciya massiva inicializaciya massiva ob容ktov klassa inicializaciya massiva simvolov inicializaciya ob容dineniya inicializaciya ob容kta klassa inicializaciya ob容kta-chlena inicializaciya registra inicializacii ssylki inicializaciya struktury inicializaciya chlena inicializaciya chlena klassa inkapsulyaciya interfejs interfejs klassa interfejsnyj klass ishodnyj fajl ischerpanie svobodnoj pamyati ischerpanie resursa ischerpanie svobodnoj pamyati iteraciya K karkas oblasti prilozheniya klass klass i tip klass ili ob容dinenie klass ili struktura klass osoboj situacii klass pamyati auto Kobol kommentarij konec stroki \n konkatenaciya strok konkretnyj tip konkretnyj tip dannyh (KTD) konstanta konstanta double konstanta float konstanta long konstanta long double konstanta unsigned konstanta perechisleniya konstanta pol'zovatel'skogo tipa konstanta s plavayushchej tochkoj konstanta stroka konstruktor konstruktor vremennogo ob容kta konstruktor global'noj peremennoj konstruktor i abstraktnyj klass konstruktor kopirovaniya konstruktor lokal'nogo ob容kta konstruktor lokal'noj peremennoj konstruktor ob容dineniya konstruktor peremennoj iz svobodnoj pamyati konstruktor proizvodnogo klassa konstruktor chlena klassa konstruktor chlenov massiva kontroliruemoe ob容dinenie kontrol' diapazona kontrol' dostupa kontrol' tipov parametrov funkcii kopirovanie kosvennost' (kosvennoe obrashchenie) kosvennyj bazovyj klass L leksema leksicheskie soglasheniya Lisp literal literal'nye konstanty logicheskaya operaciya lokal'naya oblast' vidimosti M makrokomanda makrokomanda preprocessora makrokomanda error makrokomanda null makrokomanda pragma makroobrabotka makroopredelenie makropodstanovka makropodstanovka (podstanovka) manipulyator massiv metka metka case metka default mehanizm vyzova funkcii metod proektirovaniya mnogomernyj massiv mnogosimvol'naya konstanta mnogourovnevaya obrabotka oshibok mnozhestvo simvolov ASCII mnozhestvo simvolov EBCDIC mnozhestvennoe nasledovanie model' kaskad modul'noe programmirovanie modul'nost' mul'tiplikativnoe-vyrazhenie N napravlennyj aciklichnyj graf nasledovanie nasledovanie destruktora nasledovanie interfejsa nasledovanie konstruktora neodnoznachnoe preobrazovanie tipa neodnoznachnost' neodnoznachnost' preobrazovaniya klassa neozhidannye osobye situacii neopisannyj parametr neperehvachennaya osobaya situaciya neopredelennyj parametr konstruktora neyavnyj vyzov destruktor neyavnoe preobrazovanie neyavnoe preobrazovanie tipa neyavnoe pol'zovatel'skoe preobrazovanie O obobshchennyj probel ob容dinenie oblast' vidimosti oblast' vidimosti friend oblast' vidimosti vlozhennogo klassa oblast' vidimosti imeni oblast' vidimosti klassa oblast' vidimosti lokal'nogo klassa oblast' vidimosti makroimeni oblast' vidimosti makroopredeleniya oblast' vidimosti metki oblast' vidimosti funkcii oblast' vidimosti standartnogo parametra obrabotka oshibok obrabotchik osoboj situacii obratnaya drobnaya cherta \ obratnyj vyzov obshirnyj interfejs obshchij chlen klassa ob容kt ob容kt-funkciya ob容ktno-orientirovannoe programmirovanie odinochnaya kavychka okruzhenie programmy operand const operand volatile operand ssylka operator operator break operator continue operator do operator for operator goto operator if operator return operator switch (pereklyuchatel') operator while operator vyrazheniya operator iteracii operator opisaniya operator perehoda operator cikla operator-vyrazhenie operator-opisanie operator-perehoda operatornaya funkciya (operator) operacionnaya sistema UNIX operaciya ! operaciya # operaciya ## operaciya %= operaciya && operaciya &= operaciya *= operaciya ++ operaciya += operaciya , operaciya -- operaciya -= operaciya /= operaciya :: operaciya <<= operaciya >>= operaciya ^= operaciya bol'she ili ravno operaciya bol'she chem operaciya vvoda >> operaciya vzyatiya adresa operaciya vybora chlena klassa operaciya vyvoda << operaciya vyzova funkcii operaciya dekrement operaciya zapyataya operaciya indeksacii operaciya inkrement operaciya kosvennosti operaciya logicheskogo otricaniya operaciya logicheskoe I operaciya logicheskoe ILI operaciya men'she ili ravno operaciya men'she chem operaciya neravno operaciya otnosheniya operaciya preobrazovaniya operaciya privedeniya operaciya ravenstva operaciya prisvaivaniya operaciya-prisvaivaniya operaciya razresheniya oblasti vidimosti operaciya sdviga vlevo operaciya slozheniya operaciya usloviya ( ? : ) operaciya umnozheniya operaciya unarnyj minus operaciya delete operaciya new operaciya sizeof opisanie opisanie asm opisanie extern opisanie friend opisanie register opisanie typedef opisanie bitovogo polya opisanie v kachestve opredeleniya opisanie vneshnih opisanie vlozhennogo klassa opisanie dostupa opisanie druzhestvennogo klassa opisanie ili opredelenie opisanie imeni opisanie imeni klassa opisanie klassa opisanie klassa pamyati opisanie lokal'nogo klassa opisanie massiva opisanie parametra opisanie postoyannogo ukazatelya opisanie ssylki opisanie staticheskogo chlena opisanie standartnogo parametra opisanie staticheskogo chlena opisanie tipa opisanie ukazatelya opisanie funkcii opisanie funkcii-chlena opisanie chlena opisanie chlena klassa opisanie shablona tipa opisanie-shablona-tipa opisanie shablonnogo klassa opisanie shablonnoj funkcii opisanie ellipsisa v funkcii opisanie-osoboj-situacii opisanie-parametra opisatel' opisatel'-chlena opredelenie opredelenie virtual'noj funkcii opredelenie klassa opredelenie konstruktora opredelenie oblasti vidimosti funkcii opredelenie ob容kta opredelenie staticheskogo chlena opredelenie funkcii opredelenie-funkcii opredelenie funkcii-chlena opredelenie funkcii-chlena inline opredelenie shablonnogo klassa opredelenie shablonnoj funkcii opredelenie chisto virtual'noj funkcii opredelenie chlena opredelenie shablonnogo klassa opredelenie shablonnoj funkcii opredelenie elementa perechisleniya osobaya situaciya osvobozhdenie resursa osnovnoj tip otladka otlichiya ot vychisleniya vyrazhenij v S otlichiya ot oblasti vidimosti S otlichiya ot opisaniya funkcii v S otlichiya ot prostranstva imenovaniya S otlichiya ot svyazyvaniya v S oshibka svyazyvaniya P pamyat' dlya klassa pamyat' dlya massiva paradigma programmirovaniya parametr parametry komandnoj stroki parametr funkcii param-shablona-tipa parametr-shablona-tipa pervichnoe vyrazhenie perevod formata \f peregruzka peregruzka binarnoj operacii peregruzka dekrementa peregruzka i dostup peregruzka i oblast' vidimosti peregruzka i ssylka peregruzka imeni funkcii peregruzka imeni chlena peregruzka indeksacii peregruzka inkrementa peregruzka operacii peregruzka operacii vybora chlena peregruzka operacii vyzova peregruzka operacii prisvaivaniya peregruzka unarnoj operacii peredacha parametra funkcii pereopredelenie virtual'noj funkcii perepolnenie perehvatit' (osobuyu situaciyu) perechislenie pobochnye effekty poverhnostnoe kopirovanie povtornyj zapusk (osoboj situacii) podderzhka abstrakcii dannyh podderzhka ob容ktno-orientirovannogo programmirovaniya pole polnoe-imya-klassa pol'zovatel'skaya operaciya pol'zovatel'skaya operaciya *= pol'zovatel'skaya operaciya + pol'zovatel'skaya operaciya ++ pol'zovatel'skaya operaciya - pol'zovatel'skaya operaciya -- pol'zovatel'skaya operaciya -> pol'zovatel'skaya operaciya = pol'zovatel'skaya operaciya indeksacii pol'zovatel'skij tip pol'zovatel