:: imya-funkcii-operacii :: utochnennoe-imya ( vyrazhenie ) imya Literal yavlyaetsya pervichnym vyrazheniem. Ego tip opredelyaetsya ego vidom ($$R.2.5). V tele nestaticheskoj funkcii-chlene ($$R.9.3) sluzhebnoe slovo this oboznachaet ukazatel' na ob容kt, k kotoromu otnositsya vyzov funkcii. Sluzhebnoe slovo this nel'zya ispol'zovat' vne tela funkcii-chlena klassa. Operaciya :: , za kotoroj sleduet identifikator ili imya-operacii-funkcii ili utochnennoe-imya yavlyayutsya pervichnym vyrazheniem. Ego tip zadaetsya opisaniem identifikatora, imeni ili imeni-funkcii-operacii. Rezul'tatom yavlyaetsya identifikator, imya ili imya-funkcii-operacii. Rezul'tat yavlyaetsya adresom, esli identifikator yavlyaetsya adresom. Identifikator ili imya-funkcii-operacii dolzhny imet' fajlovuyu oblast' vidimosti. S pomoshch'yu operacii :: mozhno obrashchat'sya k tipu, ob容ktu, funkcii ili elementu perechisleniya, dazhe esli oboznachayushchij ih identifikator yavlyaetsya skrytym ($$R.3.2). Vyrazhenie v skobkah yavlyaetsya pervichnym vyrazheniem, tip i znachenie kotorogo identichny im zhe u vyrazheniya bez skobok. Nalichie skobok ne vliyaet na to, yavlyaetsya vyrazhenie adresom ili net. Ponyatie imya - eto opredelennoe pervichnoe-vyrazhenie, kotoroe mozhet poyavlyat'sya tol'ko posle . i -> ($$R.5.2.4): imya: identifikator imya-funkcii-operacii imya-funkcii-preobrazovaniya ~imya-klassa utochnennoe-imya Identifikator est' imya, pri uslovii chto on opisan nadlezhashchim obrazom ($$R.7). Ponyatie imya-funkcii-operacii opisano v ($$R.13.4), a ponyatie imya-funkcii-preobrazovaniya v ($$R.12.3.2). Konstrukciya ~imya-klassa oboznachaet destruktor ($$R.12.4). utochnennoe-imya: utochnyayushchee-imya-klassa :: imya Ponyatie utochnyayushchee-imya-klassa, za kotorym sleduet :: i imya chlena etogo klassa ($$R.9.2), ili chlena bazovogo po otnosheniyu k dannomu klassa ($$R.10) yavlyaetsya utochnennoe-imya. Ego tip est' tip chlena, a rezul'tat vyrazheniya est' etot chlen. Rezul'tat yavlyaetsya adresom, esli takovym yavlyaetsya chlen. Imya klassa mozhet byt' skryto drugim imenem (ne tipa), v takom sluchae vse ravno imya klassa dostupno i ego mozhno ispol'zovat'. Esli ispol'zuetsya imya-klassa::imya-klassa ili imya-klassa::~imya-klassa, oba ponyatiya imya-klassa dolzhny oboznachat' odin i tot zhe klass. S pomoshch'yu takoj zapisi oboznachayutsya konstruktory ($$R.12.1) i destruktory ($$R.12.4) sootvetstvenno. Mozhno ispol'zovat' utochnyayushchie imena neodnokratno, naprimer, N1::N2::N3::n, chtoby oboznachat' vlozhennye tipy ($$R.9.7). R.5.2 Postfiksnye vyrazheniya Postfiksnye vyrazheniya primenyayutsya sleva napravo. 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 R.5.2.1 Indeksaciya Postfiksnoe vyrazhenie, za kotorym sleduet vyrazhenie v kvadratnyh skobkah, yavlyaetsya postfiksnym vyrazheniem. Intuitivnyj smysl ego indeksirovanie. Pervoe iz vyrazhenij dolzhno imet' tip "ukazatel' na T", a vtoroe byt' celochislennogo tipa. Tip rezul'tata est' "T". Vyrazhenie E1[E2] sovpadaet (po opredeleniyu) s vyrazheniem *((E1) + (E2)). Podrobnosti operacij * i + dany v $$R.5.3 i $$R.5.7, a massivy obsuzhdayutsya v $$R.8.2.4. R.5.2.2 Vyzov funkcii Vyzov funkcii yavlyaetsya postfiksnym vyrazheniem, za kotorym sleduet, vozmozhno pustoj, spisok vyrazhenij v skobkah, razdelennyh zapyatoj. |ti vyrazheniya obrazuyut fakticheskie parametry funkcii. Postfiksnoe vyrazhenie dolzhno imet' tip "funkciya, vozvrashchayushchaya T", "ukazatel' na funkciyu, vozvrashchayushchuyu T" ili "ssylka na funkciyu, vozvrashchayushchuyu T", a rezul'tat operacii vyzova imeet tip "T". Pri vyzove funkcii proishodit inicializaciya kazhdogo formal'nogo parametra ($$R.8.4.3, $$R.12.8, $$r.12.1) fakticheskim parametrom. Proizvodyatsya standartnye ($$R.4) i zadannye pol'zovatelem ($$R.12.3) preobrazovaniya tipa. V funkcii mozhet izmenyat'sya znacheniya nepostoyannyh formal'nyh parametrov, no eti izmeneniya ne mogut povliyat' na znacheniya fakticheskih parametrov, krome togo sluchaya, kogda formal'nyj parametr imeet tip ssylki bez specifikacii const ($$R.8.2.2). Esli formal'nyj parametr imeet tip ssylki pri neobhodimosti mozhet sozdavat'sya vremennaya peremennaya ($$R.7.1.6, $$R.2.5,$$R.2.5.4,$$R.8.2.4, $$R.12.2). Dobavim, chto vozmozhno izmenenie nepostoyannyh ob容ktov s pomoshch'yu parametrov-ukazatelej. Funkciyu mozhno opisat' takim obrazom, chto ona smozhet ispol'zovat' men'shee chislo parametrov (opredeliv parametry po umolchaniyu $$R.8.2.6) ili bol'shee chislo parametrov (s pomoshch'yu ellipsisa ... $$R.8.2.5), chem bylo ukazano pri opredelenii funkcii ($$R.8.3). Funkciyu mozhno vyzvat' tol'ko, esli opisanie ee dostupno v toj oblasti vidimosti, gde proishodit vyzov. Otsyuda sleduet, vsyakij formal'nyj parametr, sootvetstvuyushchij nekotoromu fakticheskomu parametru, dolzhen byt' dostupen, esli ne schitat' ellipsis (...). Pered vyzovom vsyakij fakticheskij parametr tipa float, dlya kotorogo net formal'nogo parametra, preobrazuetsya k tipu double, a tipa char, short, perechisleniya ili bitovoe pole, dlya kotorogo net formal'nogo parametra, preobrazuetsya k tipu int ili unsigned soglasno standartnym preobrazovaniyam celochislennyh ($$R.4.1). Ob容kt, yavlyayushchijsya klassom i ne imeyushchij opisaniya formal'nogo parametra, peredaetsya pri vyzove kak struktura dannyh. Ob容kt, yavlyayushchijsya klassom i imeyushchij opisanie formal'nogo parametra peredaetsya s pomoshch'yu inicializacii formal'nogo parametra fakticheskim parametrom, kotoraya proishodit pered vypolneniem funkcii posredstvom vyzova konstruktora ($$R.12.2, $$R.12.8). Poryadok vychislenij parametrov neopredelen i uchtite, chto on mozhet byt' razlichen u raznyh translyatorov. Vse pobochnye effekty vyrazhenij fakticheskih parametrov mogut proishodit' pered nachalom vypolneniya funkcii. Poryadok vychisleniya postfiksnyh vyrazhenij i spiska vyrazhenij parametrov neopredelen. Dopustimy rekursivnye vyzovy. Operaciya vyzova funkcii porozhdaet adres tol'ko, esli tip rezul'tata est' adres. R.5.2.3 YAvnye preobrazovaniya tipa Konstrukciya imya-prostogo-tipa ($$R.7.1.6), za kotoroj sleduet spisok-vyrazhenij v skobkah obrazuet znachenie ukazannogo tipa s uchetom spiska vyrazhenij. Esli spisok vyrazhenij soderzhit bolee odnogo znacheniya, tip dolzhen byt' klassom s konstruktorom, opisannym sootvetstvuyushchim obrazom ($$R.8.4, $$R.12.1). Konstrukciya imya-prostogo-tipa ($$R.7.1.6), za kotoroj sleduet para skobok (pustaya), obrazuet znachenie ukazannogo tipa. Esli tip yavlyaetsya klassom s konstruktorom, opisannym sootvetstvuyushchim obrazom, budet vyzvan etot konstruktor, v protivnom sluchae rezul'tatom budet neopredelennoe znachenie ukazannogo tipa, sm. tak zhe ($$R.5.4). R.5.2.4 Dostup k chlenu klassa Postfiksnoe vyrazhenie, za kotorym sleduet tochka (.) i imya, yavlyaetsya postfiksnym vyrazheniem. Pervoe vyrazhenie dolzhno byt' ob容ktom tipa klass, a imya dolzhno byt' imenem chlena etogo klassa. Rezul'tatom budet poimenovannyj chlen ob容kta i on budet adresom, esli chlen yavlyaetsya adresom. Postfiksnoe vyrazhenie, za kotorym sleduet strelka (->) i imya, yavlyaetsya postfiksnym vyrazheniem. Pervoe vyrazhenie dolzhno byt' ukazatelem na ob容kt tipa klass, a imya dolzhno byt' imenem chlena etogo klassa. Rezul'tatom budet poimenovannyj chlen ob容kta, na kotoryj nastroen ukazatel' i on budet adresom, esli chlen yavlyaetsya adresom. Znachit vyrazhenie E1->MOS tozhe samoe, chto (*E1).MOS. Obratite vnimanie, chto "ob容kty tipa klass" mogut byt' strukturami ($$R.9.2) ili ob容dineniyami ($$R.9.5). Klassy obsuzhdayutsya v $$R.9. R.5.2.5 Inkrement i dekrement Znachenie, poluchaemoe v rezul'tate primeneniya postfiksnoj operacii ++, est' znachenie operanda. Operand dolzhen byt' izmenyaemym adresom. Tip operanda dolzhen byt' arifmeticheskij ili tip ukazatelya. Posle vyborki rezul'tata (dlya dal'nejshego ispol'zovaniya) ob容kt uvelichivaetsya na 1. Tip rezul'tata sovpadaet s tipom operanda, no ne yavlyaetsya adresom (sm. tak zhe $$R.5.7 i $$R.5.17). Postfiksnaya operaciya -- svoditsya k operacii dekrementa (umen'shenie na 1) i analogichna operacii ++. R.5.3 Unarnye operacii Vyrazheniya s unarnymi operaciyami vypolnyayutsya sprava nalevo. 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 * & + - ! ~ Unarnaya operaciya * oznachaet kosvennost': vyrazhenie dolzhno byt' ukazatelem, a rezul'tat yavlyaetsya adresom, ssylayushchimsya na ob容kt, na kotoryj ukazyvaet vyrazhenie. Esli tip vyrazheniya est' "ukazatel' na T", to tip rezul'tata budet "T". Rezul'tatom unarnoj operacii & budet ukazatel' na ee operand. Operand dolzhen byt' funkciej ili adresom ili konstrukciej utochnennoe-imya. Dlya pervyh dvuh sluchaev, esli tip vyrazheniya est' "T", to tip rezul'tata budet "ukazatel' na T". V chastnosti, adres ob容kta tipa const T imeet tip const T*, tozhe verno dlya volatile. Dlya sluchaya utochnennoe imya esli chlen klassa "C" ne yavlyaetsya staticheskim i imeet tip "T", to tip rezul'tata operacii budet "ukazatel' na chlen C tipa T". Dlya staticheskih chlenov tipa T rezul'tatom budet obychnyj "ukazatel' na T". Adres peregruzhennoj funkcii ($$R.13) mozhno brat' tol'ko pri inicializacii ili prisvaivanii, v kotorom levaya chast' odnoznachno opredelyaet kakaya versiya peregruzhennoj funkcii imeetsya vvidu ($R13.3). Operand unarnoj operacii + dolzhen byt' arifmeticheskogo tipa ili tipa ukazatel' i rezul'tatom budet znachenie operanda. Dlya celochislennyh operandov proizvoditsya standartnoe preobrazovanie celochislennyh. Tip rezul'tata est' tip preobrazovannogo operanda. Operand unarnoj operacii - dolzhen imet' arifmeticheskij tip i rezul'tatom budet izmenenie znaka operanda. Dlya celochislennyh operandov vypolnyaetsya standartnoe preobrazovanie celochislennyh. Operaciya dlya bezznakovyh velichin vypolnyaetsya s pomoshch'yu vychitaniya znacheniya operanda iz 2**n, gde n chislo bitov v predstavlenii preobrazovannogo operanda. Tip rezul'tata est' preobrazovannogo operanda. Operand operacii logicheskogo otricaniya ! dolzhen imet' arifmeticheskij tip ili byt' ukazatelem, rezul'tat raven 1, esli znachenie operanda est' 0, i raven 0, esli operand ne raven 0. Tip rezul'tata est' int. Operand operacii ~ dolzhen imet' celochislennyj tip, rezul'tatom budet obrashchenie dvoichnogo predstavleniya operanda. Vypolnyayutsya standartnye preobrazovaniya celochislennyh. Tip rezul'tata est' tip preobrazovannogo operanda. R.5.3.1 Inkrement i dekrement Operand prefiksnoj operacii ++ uvelichivaetsya na 1. Operand dolzhen byt' izmenyaemym adresom. Tip operanda dolzhen byt' arifmeticheskim ili ukazatelem. Rezul'tatom yavlyaetsya novoe znachenie operanda, ono schitaetsya adresom. Vyrazhenie ++x ekvivalentno x+=1. Dlya utochneniya preobrazovanij mozhno obratit'sya k opisaniyu slozheniya ($$R.5.7) i operacij prisvaivaniya ($$R.5.17). Prefiksnaya operaciya -- svoditsya k umen'sheniyu na 1 i vypolnyaetsya analogichno prefiksnoj operacii ++. R.5.3.2 Operaciya sizeof Operaciya sizeof vychislyaet razmer svoego operanda v bajtah. Operand dolzhen byt' ili vyrazheniem, kotoroe ne vychislyaetsya, ili imenem tipa v skobkah. Operaciyu sizeof nel'zya primenyat' k funkcii, bitovomu polyu, neopredelennomu klassu, tipu void ili k massivu s neukazannymi granicami indeksov. Bajt nikak ne opredelyaetsya yazykom, krome kak rezul'tata operacii sizeof, imenno sizeof(char) est' 1. Esli operaciya primenyaetsya k ssylke, rezul'tatom budet razmer ob容kta, na kotoryj nastroena ssylka. Esli ona primenyaetsya k klassu, rezul'tatom budet razmer ob容kta etogo klassa v bajtah s uchetom vseh dopolnitel'nyh bajtov, kotorye potrebuetsya dlya razmeshcheniya takogo ob容kta v massive. Razmer lyubogo klassa ili ob容kta klassa bol'she nulya. V sluchae massiva operaciya vydaet polnoe chislo bajtov v massive. Otsyuda sleduet, chto razmer massiva iz n elementov raven razmeru elementa, umnozhennomu na n. Operaciya sizeof mozhet primenyat'sya k ukazatelyu na funkciyu, no ne k samoj funkcii. Rezul'tatom operacii budet konstanta tipa size_t. |tot tip opredelen v standartnom zagolovochnom fajle <stddef.h> i yavlyaetsya zavisyashchim ot realizacii bezznakovym celochislennym tipom. R.5.3.3 Operaciya new Operaciya new prednaznachena dlya sozdaniya ob容kta tipa imya-tipa ($$R.8.1). |tot tip dolzhen byt' tipom ob容kta i funkcii nel'zya razmeshchat' s ee pomoshch'yu, hotya ukazateli na funkcii mozhno. 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 ) Vremya zhizni ob容kta, sozdannogo s pomoshch'yu new, ne ogranichivaetsya oblast'yu vidimosti, v kotoroj on byl sozdan. Operaciya new vozvrashchaet ukazatel' na sozdannyj ob容kt. Esli ob容kt yavlyaetsya massivom, vozvrashchaetsya ukazatel' na nachal'nyj element massiva. Naprimer, obe operacii new int i new int[1] vozvratyat int* , a tipom new int[i][10] budet int(*)[10]. Esli opisyvaetsya tip massiva ($$R.8.2.4), vse razmernosti, krome pervoj, dolzhny byt' vyrazheniyami- konstantami ($$R.5.19) s polozhitel'nym znacheniem. Pervaya razmernost' massiva mozhet zadavat'sya proizvol'nym vyrazheniem, dazhe esli ispol'zuetsya imya-tipa (zdes' narushaetsya obshchee trebovanie, chtoby razmernosti massiva v konstrukcii imya-tipa byli vyrazheniyami-konstantami ($$R.5.19)). Dopuskaetsya, chtoby vyzyvalas' funkciya operator new() s parametrom nul'. V takom sluchae vozvrashchaetsya ukazatel' na ob容kt. Pri povtorenii takih vyzovov budut vozvrashchat'sya ukazateli na raznye ob容kty. Konstrukciya spisok-specifikacij-tipa ne dolzhna soderzhat' const, volatile, opisanie klassa ili perechisleniya. Dlya rezervirovaniya pamyati operaciya new obrashchaetsya k funkcii operator new() ($$R.12.5). Pri razmeshchenii ob容kta tipa T ej v kachestve pervogo parametra peredaetsya sizeof(T). Konstrukciya parametry-new ispol'zuetsya dlya peredachi dopolnitel'nyh parametrov. Naprimer, operaciya new T privodit k vyzovu operator new(sizeof(T)), a operaciya new(2,f) T privodit k vyzovu operator new(sizeof(T),2,f). Konstrukciya parametry-new mozhet ispol'zovat'sya tol'ko, esli opisana funkciya operator new() s parametrami sootvetstvuyushchih tipov. Esli s pomoshch'yu operacii new sozdaetsya ob容kt ne tipa klass (v tom chisle i massiv ob容ktov tipa klass), to vyzyvaetsya global'naya funkciya ::operator new(). Esli s pomoshch'yu new sozdaetsya ob容kt klassa T, vyzyvaetsya funkciya T::operator new(), esli ona sushchestvuet (ispol'zuya obychnye pravila prosmotra pri poiske chlenov klassa i ego bazovyh klassov, $$R.10.1.1), inache vyzyvaetsya global'naya funkciya ::operator new(). Ispol'zovanie operacii ::new() garantiruet, chto budet vyzyvat'sya global'naya funkciya ::operator new(), dazhe esli sushchestvuet T::operator new(). Konstrukciya vyrazhenie-razmeshcheniya mozhet soderzhat' inicializator-new. Dlya ob容ktov klassov s konstruktorami ($$R.12.1) zadavaemyj eyu spisok parametrov budet ispol'zovat'sya pri vyzove konstruktora, v drugih sluchayah konstrukciya inicializator-new dolzhna imet' vid ( vyrazhenie ) ili ( ). Esli vyrazhenie prisutstvuet, ono ispol'zuetsya dlya inicializacii ob容kta, esli ego net, ob容kt nachnet sushchestvovanie s neopredelennym znacheniem.\ Esli klass imeet konstruktor, ob容kt etogo klassa mozhno sozdat' s pomoshch'yu new tol'ko pri uslovii, chto zadany podhodyashchie parametry, ili, chto klass imeet standartnyj konstruktor ($$R.12.1). Otvodit li pamyat' pri sozdanii ob容kta tipa klass sama funkciya operator new, ili ostavlyaet eto na konstruktor, zavisit ot realizacii. Kak dlya konstruktora, tak i dlya funkcii operator new() provoditsya proverka vozmozhnosti dostupa i odnoznachnosti ($$R.12). Dlya massivov nel'zya zadavat' inicializatory. Massivy ob容ktov tipa klassa s konstruktorom mozhno sozdavat' s pomoshch'yu operacii new tol'ko, esli konstruktor klassa yavlyaetsya standartnym ($$R.12.1). V etom sluchae standartnyj konstruktor budet vyzyvat'sya dlya kazhdogo elementa massiva. Inicializaciya proizvoditsya tol'ko v tom sluchae, kogda funkciya operator new() vozvrashchaet nenul'. Esli ona vozvrashchaet 0 (pustoj ukazatel'), znachenie vyrazheniya est' 0. Poryadok vychisleniya vyrazheniya vyzova operator new() dlya polucheniya pamyati i poryadok vychisleniya parametrov konstruktora neopredelen. Tak zhe neopredeleno vychislyayutsya li parametry konstruktora, esli funkciya operator new() vozvratila 0. V konstrukcii imya-tipa-new skobki ispol'zovat' neobyazatel'no. Togda obrashchenie new int (*[10])(); // error mozhet privesti k oshibke, t.k. operacii primenyayutsya v takom poryadke (new int) (*[10])(); // error Ob容kty slozhnogo tipa mozhno zadat' v operacii new s pomoshch'yu yavno ukazannyh skobok, naprimer, obrashchenie new (int (*[10])()); razmeshchaet massiv iz 10 ukazatelej na funkcii (ne imeyushchie parametrov i vozvrashchayushchie int). Konstrukcii imya-tipa-new v vyrazhenie-razmeshcheniya dolzhna byt' samoj dlinnoj iz vozmozhnyh posledovatel'nostej konstrukcij opisatel'-new. |to predotvrashchaet kollizii mezhdu operaciyami iz opisatelej &, *, [] i ih dvojnikami iz vyrazheniya, naprimer, new int* i; // syntax error: parsed as `(new int*) i' // not s `(new int)*i' Simvol * ispol'zuetsya v opisatele ukazatelya, a ne v kachestve operacii umnozheniya. R.5.3.4 Operaciya delete Operaciya delete unichtozhaet ob容kt, sozdannyj s pomoshch'yu new. vyrazhenie-osvobozhdeniya: ::opt delete vyrazhenie-privedeniya ::opt delete [] vyrazhenie-privedeniya Rezul'tat imeet tip void. Operandom delete dolzhen byt' ukazatel', kotoryj vozvrashchaet new. |ffekt primeneniya operacii delete k ukazatelyu, kotoryj ne poluchen v rezul'tate operacii new bez zadaniya parametry-new, schitaetsya neopredelennym i obychno privodit k opasnym posledstviyam. Odnako garantiruetsya, chto udalenie po ukazatelyu s nulevym znacheniem bezopasno. Rezul'tat popytki dostupa k udalennomu ob容ktu neopredelen, a udalenie ob容kta mozhet izmenit' ego znachenie. Bolee togo, esli vyrazhenie, zadayushchee ob容kt, yavlyaetsya izmenyaemym adresom, ego znachenie posle udaleniya neopredeleno. Nel'zya udalyat' ukazatel' na konstantu. Operaciya delete vyzyvaet destruktor (esli on est' $$12.4) dlya ob容kta, na kotoryj nastroen ee operand. Dlya osvobozhdeniya pamyati, otvedennoj pod ukazyvaemyj ob容kt, operaciya delete vyzyvaet funkciyu operator delete ($$R.12.5). Dlya ob容ktov, ne imeyushchih tip klass (v tom chisle i dlya massivov klassov), ispol'zuetsya global'naya funkciya ::operator delete(). Dlya ob容kta tipa klass T vyzyvaetsya funkciya T::operator delete(), esli ona est' (ispol'zuya obychnye pravila prosmotra pri poiske chlenov klassa i proizvodnyh ot nego klassov, $$R.10.1.1), v protivnom sluchae vyzyvaetsya global'naya funkciya ::operator delete(). Obrashchenie ::delete garantiruet, chto budet vyzyvat'sya global'naya funkciya ::operator delete(), dazhe esli sushchestvuet T::operator delete(). Dlya udaleniya massivov ispol'zuetsya obrashchenie vida delete [ ] vyrazhenie-privedeniya Zdes' vyrazhenie dolzhno ukazyvat' na massiv. Esli est' destruktory, oni budut vyzyvat'sya dlya udaleniya ukazannyh ob容ktov. Rezul'tat udaleniya massiva s pomoshch'yu prostogo obrashcheniya delete neopredelen, tak zhe kak i udalenie odinochnogo ob容kta s pomoshch'yu delete []. R.5.4 YAvnoe preobrazovanie tipa YAvnoe preobrazovanie tipa mozhno zadat' s pomoshch'yu funkcional'noj zapisi ($$R.5.2.3) ili s pomoshch'yu operacii privedeniya. vyrazhenie-privedeniya: unarnoe-vyrazhenie ( imya-tipa ) vyrazhenie-privedeniya Zadanie s pomoshch'yu operacii privedeniya ispol'zuetsya dlya oboznacheniya preobrazovaniya k tipu, kotoryj ne yavlyaetsya konstrukciej imya-prostogo-tipa. V operacii privedeniya nel'zya opredelyat' tipy. Vsyakoe preobrazovanie tipa, ne upomyanutoe zdes' i ne yavlyayushcheesya preobrazovaniem yavno opredelennym pol'zovatelem ($$R.12.3), schitaetsya oshibkoj. Lyuboj tip, kotoryj mozhno preobrazovat' v drugoj s pomoshch'yu standartnogo preobrazovaniya ($$R.4), mozhno takzhe preobrazovat' s pomoshch'yu yavnogo preobrazovaniya (privedeniya) i smysl preobrazovaniya budet tot zhe. Ukazatel' mozhno preobrazovat' k lyubomu celochislennomu tipu, dostatochno bol'shomu, chtoby vmestit' znachenie ukazatelya. Algoritm preobrazovaniya zavisit ot realizacii, no predpolagaetsya, chto on budet estestvennym dlya togo, kto znaet sistemu adresacii, ispol'zuemoj mashiny. Znachenie celochislennogo tipa mozhet byt' yavno preobrazovano v ukazatel'. Ukazatel', preobrazovannyj v celoe dostatochnogo razmera (esli takie est' v realizacii), i preobrazovannyj obratno k tipu ukazatelya, dolzhen imet' svoe pervonachal'noe znachenie. Vse drugie detali perevoda ukazatelya v celoe i obratno zavisyat ot realizacii. Ukazatel' na ob容kt odnogo tipa mozhet byt' preobrazovan v ukazatel' na ob容kt drugogo tipa (s soblyudeniem ogranichenij, ukazannyh zdes'). Ispol'zovanie poluchivshegosya ukazatelya mozhet vyzvat' osobuyu adresnuyu situaciyu ("nevernyj adres"), esli preobrazuemyj ukazatel' ne nastroen na ob容kt, pravil'nym obrazom vyravnennyj v pamyati. Garantiruetsya, chto ukazatel' na ob容kt dannogo razmera mozhno preobrazovat' v ukazatel' na ob容kt ravnogo ili men'shego razmera i provesti obratnoe preobrazovanie bez izmeneniya znacheniya ukazatelya. Na razlichnyh mashinah dvoichnoe predstavlenie ukazatelej mozhet byt' razlichno kak i trebovaniya na vyravnivaniya ob容ktov. Sostavnye ob容kty vyravnivayutsya po samoj strogoj granice, trebuemoj ih sostavlyayushchimi. Ukazatel' tipa void* schitaetsya sovmestimym s ukazatelem na ob容kt lyubogo tipa. Ukazatel' na klass B mozhno preobrazovat' v ukazatel' na klass D, dlya kotorogo klass B yavlyaetsya pryamo ili oposredovanno bazovym klassom, esli sushchestvuet odnoznachnoe preobrazovanie iz D v B ($$R.4.6, $$.R10.1.1) i esli B yavlyaetsya virtual'nym bazovym klassom ($$R.10.1). Takoe privedenie ot bazovogo klassa k proizvodnomu klassu predpolagaet, chto ob容kt bazovogo klassa yavlyaetsya vlozhennym po otnosheniyu k ob容ktu proizvodnogo klassa. V rezul'tate poluchitsya ukazatel', nastroennyj na ob容mlyushchij ob容kt proizvodnogo klassa. Esli ob容kt bazovogo klassa ne soderzhitsya ni v kakom ob容kte proizvodnogo klassa, takaya operaciya privedeniya mozhet vyzvat' osobuyu situaciyu. Pustoj ukazatel' (0) preobrazuetsya sam v sebya. Poka eshche neopredelennyj klass mozhno ispol'zovat' v operacii privedeniya ukazatelya, v etom sluchae nikakih dopushchenij o strukture klassa ne delaetsya ($$R.10.1). Lyuboj ob容kt mozhno yavno preobrazovat' k tipu ssylki X&, esli ukazatel' na etot ob容kt mozhno yavno preobrazovat' v tip X*. V rezul'tate privedeniya k ssylke ne proishodit vyzovov konstruktorov ili funkcij preobrazovanij. Preobrazovanie ssylki na bazovyj klass v ssylku na proizvodnyj klass rassmatrivaetsya analogichno preobrazovaniyu ukazatelya na bazovyj klass v ukazatel' na proizvodnyj klass, uchityvaya voprosy odnoznachnosti, virtual'nyh klassov i t.d. Rezul'tatom privedeniya k ssylke yavlyaetsya adres, v otlichie ot vseh ostal'nyh privedenij. Rezul'tat privedeniya ukazatelya ili ssylki nastroen na tot zhe ob容kt, chto i ishodnoe vyrazhenie bez operacii privedeniya. Ukazatel' na funkciyu mozhno yavno preobrazovat' v ukazatel' na nekotoryj ob容kt pri uslovii, chto tip ukazatelya na etot ob容kt dostatochno velik, chtoby hranit' ukazatel' na funkciyu. Ukazatel' na nekotoryj ob容kt mozhno yavno preobrazovat' v ukazatel' na funkciyu pri uslovii, chto tip ukazatelya na funkciyu dostatochno velik, chtoby hranit' ukazatel' na etot ob容kt. V oboih sluchayah, ispol'zovanie ukazatelya, poluchivshegosya v rezul'tate preobrazovaniya, mozhet vyzvat' osobuyu adresnuyu situaciyu, ili chto-nibud' pohuzhe, esli ishodnyj ukazatel' ne nastroen na sootvetstvuyushchij ob容kt. Ukazatel' na funkciyu odnogo tipa mozhno yavno preobrazovat' v ukazatel' na funkciyu drugogo tipa. Rezul'tat vyzova funkcii s pomoshch'yu ukazatelya na funkciyu, tip kotoroj otlichen ot tipa, ispol'zovannogo pri opredelenii pervoj funkcii, neopredelen (sm. tak zhe $$R.4.6). Ob容kt ili znachenie mozhno preobrazovat' v ob容kt tipa klass tol'ko pri uslovii, chto opredelen podhodyashchij konstruktor ili operaciya preobrazovaniya ($$R.12.3). Ukazatel' na chlen mozhno yavno preobrazovat' v ukazatel' na drugoj chlen, esli oba uchastvuyushchih tipa yavlyayutsya tipami ukazatelej na chleny odnogo klassa, ili, esli oba tipa yavlyayutsya ukazatelyami na funkciyu-chlen klassov, odin iz kotoryh poluchaetsya kak odnoznachnoe proizvodnoe ot drugogo ($$R.4.8). Ukazatel' na ob容kt s tipom, imeyushchim specifikaciyu const, mozhno privesti k ukazatelyu s tipom bez specifikacii const. Poluchivshijsya v rezul'tate ukazatel' budet nastroen na ishodnyj ob容kt. Ob容kt s tipom, imeyushchim specifikaciyu const, ili ssylku na ob容kt takogo tipa mozhno privesti v ssylku na ob容kt s tipom bez const. Poluchivshayasya v rezul'tate ssylka budet nastroena na ishodnyj ob容kt. V rezul'tate popytki izmenit' etot ob容kt s pomoshch'yu takoj ssylki ili ukazatelya mozhet vozniknut' osobaya situaciya ili on budet takim zhe, kak pri obrashchenii s pomoshch'yu ishodnoj ssylki ili ukazatelya k ob容ktu, tip kotorogo ne soderzhit const. Vozniknet li osobaya adresnaya situaciya zavisit ot realizacii. Ukazatel' na ob容kt tipa so specifikaciej volatile mozhno privesti k ukazatelyu na ob容kt tipa bez volatile. V rezul'tate poluchitsya ukazatel', nastroennyj na ishodnyj ob容kt. Ob容kt tipa s volatile ili ssylku na takoj ob容kt mozhno privesti k ssylke na ob容kt s tipom bez volatile. R.5.5 Operacii ukazatel'-na-chlen Operacii ukazatel'-na-chlen primenyayutsya sleva napravo. vyrazhenie-pm: vyrazhenie-privedeniya vyrazhenie-pm .* vyrazhenie-privedeniya vyrazhenie-pm ->* vyrazhenie-privedeniya Binarnaya operaciya .* svyazyvaet svoj vtoroj operand, kotoryj dolzhen imet' tip "ukazatel' na chlen klassa T", s pervym operandom, imeyushchim tip klass T ili takoj klass, dlya kotorogo T yavlyaetsya odnoznachno opredelennym i dostizhimym bazovym klassom. Rezul'tatom budet ob容kt ili funkciya s tipom, zadavaemym vtorym operandom. Binarnaya operaciya ->* svyazyvaet svoj vtoroj operand, kotoryj dolzhen imet' tip "ukazatel' na chlen klassa T", s pervym operandom, imeyushchim tip "ukazatel' na T" ili tip "ukazatel' na klass, dlya kotorogo T yavlyaetsya odnoznachno opredelennym i dostizhimym bazovym klassom". Rezul'tatom budet ob容kt ili funkciya s tipom, zadavaemym vtorym operandom. Esli rezul'tat .* ili ->* est' funkciya, to ego mozhno ispol'zovat' tol'ko v kachestve operanda operacii vyzova funkcii (), naprimer, operaciya (ptr_to_obj->*ptr_to_mfct)(10); privodit k vyzovu funkcii-chlena, oboznachennoj ptr_to_mfct, dlya ob容kta, na kotoryj nastroen ukazatel' ptr_to_obj. Rezul'tat operacii .* ili ->* yavlyaetsya adresom, esli vtoroj operand est' adres. R.5.6 Mul'tiplikativnye operacii Mul'tiplikativnye operacii *, /, i % vypolnyayutsya sleva napravo. Mul'tiplikativnoe-vyrazhenie: vyrazhenie-pm mul'tiplikativnoe-vyrazhenie * vyrazhenie-pm mul'tiplikativnoe-vyrazhenie / vyrazhenie-pm mul'tiplikativnoe-vyrazhenie % vyrazhenie-pm Operandy operacij * i / dolzhny imet' arifmeticheskij tip, operandy dlya % dolzhny byt' celochislennogo tipa. Obychnye arifmeticheskie preobrazovaniya ($$R.4.5) proizvodyatsya nad operandami i opredelyayut tip rezul'tata. Binarnaya operaciya * oboznachaet umnozhenie. Binarnaya operaciya / vychislyaet chastnoe, a binarnaya operaciya % vychislyaet ostatok ot deleniya pervogo vyrazheniya na vtoroe. Esli vtoroj operand u / ili % est' 0, rezul'tat neopredelen, inache (a/b)*b + a%b dolzhno ravnyat'sya a. Esli oba operanda neotricatel'ny, to takim zhe budet i rezul'tat, v protivnom sluchae znak rezul'tata opredelyaetsya realizaciej. R.5.7 Additivnye operacii Additivnye operacii + i - vypolnyayutsya sleva napravo, pri etom proishodyat obychnye arifmeticheskie preobrazovaniya ($$R.4.5) operandov arifmeticheskogo tipa. additivnoe-vyrazhenie: mul'tiplikativnoe-vyrazhenie additivnoe vyrazhenie + mul'tiplikativnoe-vyrazhenie additivnoe-vyrazhenie - mul'tiplikativnoe-vyrazhenie Operandy dolzhny byt' arifmeticheskogo tipa ili tipa ukazatelya. Rezul'tatom operacii + yavlyaetsya summa operandov. Mozhno skladyvat' ukazatel' na ob容kt v massive i znachenie lyubogo celochislennogo tipa. Rezul'tatom budet ukazatel' togo zhe tipa, chto i ishodnyj ukazatel', no on budet nastroen na drugoj ob容kt massiva s zadannym smeshcheniem ot ishodnogo ob容kta. Tak, esli P est' ukazatel' na ob容kt massiva, vyrazhenie P+1 yavlyaetsya ukazatelem na sleduyushchij ob容kt massiva. Esli zhe poluchivshijsya v rezul'tate slozheniya ukazatel' vyshel za granicy massiva, rezul'tat budet neopredelennym, krome sluchaya, kogda ukazatel' nastroen na pervyj adres bol'shij verhnej granicy massiva. Rezul'tatom operacii - budet raznost' operandov. Znachenie lyubogo celochislennogo tipa mozhno vychitat' iz ukazatelya, pri etom primenyayutsya te zhe preobrazovaniya, chto i dlya operacii +. Nikakie drugie sochetaniya tipov dlya ukazatelej ne dopustimy. Esli vychitayutsya dva ukazatelya na ob容kty odnogo tipa, rezul'tatom budet celochislennoe znachenie so znakom, kotoroe pokazyvaet na skol'ko ob容ktov etogo tipa otstoyat drug ot druga ukazuemye ob容kty. Ukazateli na sosednie elementy massiva otstoyat na 1. Tip rezul'tata zavisit ot realizacii, no on dolzhen byt' opredelen kak ptrdiff_t v standartnom zagolovochnom fajle <stddef.h>. Rezul'tat ne opredelen, esli ukazateli ne nastroeny na elementy odnogo massiva. Esli P est' ukazatel' na poslednij element massiva, to (P+1) - 1 est' P. R.5.8 Operacii sdviga Operacii sdvigov << i >> vypolnyayutsya sleva napravo. sdvigovoe-vyrazhenie: additivnoe-vyrazhenie sdvigovoe-vyrazhenie << additivnoe vyrazhenie sdvigovoe-vyrazhenie >> additivnoe vyrazhenie Operandy dolzhny byt' celochislennogo tipa, i nad nimi proizvodyatsya standartnye celochislennye preobrazovaniya. Tip rezul'tata sovpadaet s tipom preobrazovannogo levogo operanda. Rezul'tat ne opredelen, esli pravyj operand otricatelen ili bol'she ili raven chislu razryadov v dvoichnom predstavlenii preobrazovannogo levogo operanda. Znacheniem vyrazheniya E1<<E2 budet E1 (rassmatrivaemoe kak nabor razryadov), sdvinutoe vlevo na E2 razryadov, prichem osvobodivshiesya razryady zapolnyayutsya nulyami. Znacheniem vyrazheniya E1>>E2 budet E1, sdvinutoe vpravo na E2 razryadov. Esli E1 bezznakovogo tipa ili imeet neotricatel'noe znachenie, garantiruetsya, chto sdvig vpravo - logicheskij (zapolnenie nulyami), inache rezul'tat zavisit ot realizacii. R.5.9 Operacii otnosheniya Operacii otnosheniya vypolnyayutsya sleva napravo, no etot fakt malo chto daet, ibo vyrazhenie a<b<c oznachaet (a<b)<c, a vovse ne (a<b)&&(b<c). vyrazhenie-otnosheniya: sdvigovoe-vyrazhenie vyrazhenie-otnosheniya < sdvigovoe-vyrazhenie vyrazhenie-otnosheniya > sdvigovoe-vyrazhenie vyrazhenie-otnosheniya <= sdvigovoe-vyrazhenie vyrazhenie-otnosheniya >= sdvigovoe-vyrazhenie Operandy dolzhny byt' arifmeticheskogo tipa ili tipa ukazatelej. Operacii < (men'she chem), > (bol'she chem), <= (men'she ili ravno) i >= (bol'she ili ravno) dayut rezul'tat 0, esli ukazannoe otnoshenie ne vypolnyaetsya, i 1, esli ono vypolnyaetsya. Tip rezul'tata int. Nad arifmeticheskimi operandami vypolnyayutsya obychnye arifmeticheskie preobrazovaniya. Nad ukazatelyami vypolnyayutsya obychnye preobrazovaniya ukazatelej. Predpolagaetsya, chto lyuboj ukazatel' mozhno sravnit' s vyrazheniem, imeyushchim rezul'tat 0, i lyuboj ukazatel' mozhno sravnit' s ukazatelem, imeyushchim tip void* (v etom sluchae ukazatel' snachala preobrazuetsya k tipu void*). Ukazateli na ob容kty ili funkcii odnogo tipa (posle preobrazovaniya ukazatelej) mozhno sravnivat', rezul'tat zavisit ot vzaimnogo raspolozheniya v pamyati ob容ktov ili funkcij. Dva ukazatelya na odin i tot zhe ob容kt schitayutsya ravnymi. Esli dva ukazatelya nastroeny na nestaticheskie chleny odnogo ob容kta, to ukazatel', nastroennyj na chlen, opisannyj pozdnee, schitaetsya bol'shim, pri uslovii, chto chleny ne imeyut raznyh specifikacij ukazatel'-dostupa ($$R.11.1), a klass ne yavlyaetsya ob容dineniem. Esli dva ukazatelya nastroeny na nestaticheskie chleny odnogo ob容kta i specifikacii ukazatelej-dostupa ($$R.11.1) etih chlenov razlichny, rezul'tat budet ne opredelen. Esli dva ukazatelya nastroeny na chleny (dannye) odnogo i togo zhe ob容dineniya, oni schitayutsya ravnymi. Esli dva ukazatelya nastroeny na elementy odnogo massiva ili smotryat za granicu massiva, to ukazatel', nastroennyj na element s bol'shim indeksom, budet bol'shim. Vse drugie sravneniya ukazatelej opredelyayutsya realizaciej. R.5.10 Operacii sravneniya na ravenstvo vyrazhenie-ravenstva: vyrazhenie-otnosheniya vyrazhenie-ravenstva == vyrazhenie-otnosheniya vyrazhenie-ravenstva != vyrazhenie-otnosheniya Operacii == (ravno) i != (ne ravno) analogichny operaciyam otnosheniya, za isklyucheniem togo, chto ih prioritet nizhe. (Takim obrazom, operaciya a<b == c<d daet rezul'tat 1, esli vyrazheniya a<b i c<d imeyut odno i to zhe znachenie.) Krome etogo, mozhno sravnivat' ukazateli na chleny odnogo tipa. Proizvodyatsya preobrazovaniya ukazatelya na chlen ($$R.4.8). Ukazatel' na chlen mozhno sravnit' s vyrazheniem-konstantoj, kotoroe daet rezul'tat 0. R.5.11 Porazryadnaya operaciya I vyrazhenie-I: vyrazhenie-ravenstva vyrazhenie-I & vyrazhenie-ravenstva Vypolnyayutsya obychnye arifmeticheskie preobrazovaniya, rezul'tat - porazryadnaya funkciya I ot operandov. Operaciya primenima tol'ko k celochislennym operandam. R.5.12 Porazryadnaya (isklyuchayushchaya) operaciya ILI vyrazhenie-isklyuchayushchego-ILI: vyrazhenie-I vyrazhenie-isklyuchayushchego-ILI ^ vyrazhenie-I Vypolnyayutsya obychnye arifmeticheskie preobrazovaniya, rezul'tat - porazryadnaya isklyuchayushchaya funkciya ILI ot operandov. Operaciya primenima tol'ko k celochislennym operandam. R.5.13 Porazryadnaya (vklyuchayushchaya) operaciya ILI vyrazhenie-ILI: vyrazhenie-isklyuchayushchego-ILI vyrazhenie-ILI | vyrazhenie-isklyuchayushchego-ILI Vypolnyayutsya obychnye arifmeticheskie preobrazovaniya, rezul'tat - porazryadnaya funkciya ILI ot operandov. Operaciya primenima tol'ko k celochislennym tipam. R.5.14 Logicheskaya operaciya I logicheskoe-vyrazhenie-I: vyrazhenie-ILI logicheskoe-vyrazhenie-I && vyrazhenie-ILI Operacii && vypolnyayutsya sleva napravo. Takaya operaciya daet rezul'tat 1, esli oba operanda ee otlichny ot nulya, inache rezul'tat - 0. V otlichie ot & pri operacii && garantiruetsya vychislenie sleva napravo, bolee togo, vtoroj operand ne vychislyaetsya, esli pervyj operand raven 0. Operandy ne obyazatel'no imeyut odinakovyj tip, no kazhdyj dolzhen byt' arifmeticheskogo tipa ili tipa ukazatelya. Tip rezul'tata int. Vse pobochnye effekty vychisleniya pervogo vyrazheniya mogut voznikat' do vychisleniya vtorogo vyrazheniya. R.5.15 Logicheskaya operaciya ILI logicheskoe-vyrazhenie-ILI: logicheskoe-vyrazhenie-I logicheskoe-vyrazhenie-ILI || logicheskoe-vyrazhenie-I Operacii || vypolnyayutsya sleva napravo. Rezul'tat operacii 1, esli odin iz ee operandov otlichen ot nulya, inache rezul'tat - 0. V otlichie ot | pri operacii || garantiruetsya vychislenie sleva napravo, bolee togo, vtoroj operand ne vychislyaetsya, esli znachenie pervogo operanda otlichno ot nulya. Operandy ne obyazatel'no imeyut odinakovyj tip, no kazhdyj dolzhen byt' arifmeticheskogo tipa ili tipa ukazatelya. Tip rezul'tata int. Vse pobochnye effekty vychisleniya pervogo vyrazheniya mogut voznikat' do vychisleniya vtorogo vyrazheniya. R.5.16 Operaciya usloviya vyrazhenie-usloviya: logicheskoe-vyrazhenie-ILI logicheskoe-vyrazhenie-ILI ? vyrazhenie : vyrazhenie-usloviya Uslovnye vyrazheniya vypolnyayutsya sleva napravo. Pervoe vyrazhenie dolzhno byt' arifmeticheskogo tipa ili tipa ukazatelya. Ono vychislyaetsya, i, esli rezul'tat ego otlichen ot nulya, to rezul'tatom uslovnogo vyrazheniya budet znachenie vtorogo vyrazheniya, inache rezul'tat - znachenie tret'ego vyrazheniya. Vse pobochnye effekty vychisleniya pervogo vyrazheniya mogut voznikat' do vychisleniya vtorogo ili tret'ego vyrazheniya. Esli vtoroe i tret'e vyrazhenie arifmeticheskogo tipa, i tipy ih sovpadayut, to takim zhe budet i tip rezul'tata, esli oni razlichayutsya, to vypolnyayutsya obychnye arifmeticheskie preobrazovaniya, chtoby privesti ih k obshchemu tipu. Esli vtoroe i tret'e vyrazhenie yavlyayutsya ukazatelyami ili vyrazheniem-konstantoj, dayushchim rezul'tat 0, vypolnyayutsya preobrazovaniya ukazatelej, chtoby privesti rezul'taty vyrazhenij k obshchemu tipu. Esli vtoroe i tret'e vyrazhenie yavlyayutsya ssylkami, vypolnyaetsya preobrazovanie ssylok, chtoby privesti ih k obshchemu tipu. Esli vtoroe i tret'e vyrazhenie imeyut tip void, obshchij tip budet void. Esli vtoroe i tret'e vyrazhenie imeyut odin tip klass T, obshchim tipom budet T. Inache, vyrazhenie schitaetsya nedopustimym. Tip rezul'tata est' obshchij tip. Vychislyaetsya tol'ko vtoroe ili tret'e vyrazhenie (no ne oba). Rezul'tat budet adresom, esli vtoroj i tretij operand odnogo tipa i yavlyayutsya adresami. R.5.17 Operacii prisvaivaniya Sushchestvuet neskol'ko operacij prisvaivaniya, vse oni vypolnyayutsya sprava nalevo. Dlya vseh nih trebuetsya, chtoby levym operandom byl izmenyaemyj adres. Tip vyrazheniya prisvaivaniya sovpadaet s tipom levogo operanda. Rezul'tat operacii prisvaivanie - znachenie, hranyashcheesya v levom operande posle togo kak proizoshlo prisvaivanie. Rezul'tat yavlyaetsya adresom. vyrazhenie-prisvaivaniya: vyrazhenie-usloviya unarnoe-vyrazhenie operaciya-prisvaivaniya vyrazhenie-prisvaivaniya operaciya-prisvaivaniya: odin iz = *= /= %= += -= >>= <<= &= ^= |= Pri prostom prisvaivanii (=) znachenie vyrazheniya zamenyaet soboj znachenie ob容kta, s kotorym sopostavlyaetsya levyj operand. Esli oba operanda arifmeticheskogo tipa, pravyj operand, prezhde chem proizojdet prisvaivanie, preobrazuetsya k tipu levogo operanda. Neyavnye preobrazovaniya k tipu perechisleniya ($$R.7.2) ne proizvodyatsya, poetomu esli levyj operand imeet tip perechisleniya, pravyj operand dolzhen byt' takim zhe. Esli levyj operand imeet tip ukazatelya, pravyj operand dolzhen byt' tipa ukazatelya ili vyrazheniem-konstantoj, dayushchim rezul'tat 0. Pravyj operand preobrazuetsya k tipu levogo operanda, prezhde vypolneniya prisvaivaniya. Ukazatel' tipa T* const mozhno prisvaivat' ukazatelyu tipa T*, no obratnoe prisvaivanie schitaetsya nezakonnym ($$R.7.1.6). Ob容kty tipa const T ili volatile T mozhno prisvaivat' po adresu tipa T ili volatile T (sm. tak zhe $$R.8.4). Esli levyj operand imeet tip ukazatelya na chlen, pravyj operand dolzhen byt' tipa ukazatel' na chlen ili vyrazheniem-konstantoj, dayushchim rezul'tat 0; pered prisvaivaniem pravyj operand preobrazuetsya k tipu levogo operanda. Prisvaivanie ob容ktam klassa X ($$R.9) zadaetsya funkciej X::operator=() ($$R.13.4.3). Esli pol'zovatel' ne opredelil svoyu funkciyu X::operator=(), dlya prisvaivaniya ispol'zuetsya standartnyj variant ($$R.12.8). Otsyuda sleduet, chto ob容kt klassa, kotoryj yavlyaetsya pryamym ili nepryamym proizvodnym ot X, i odnoznachno opisan kak proizvodnyj v chasti public ($$R.4.6), mozhno prisvoit' ob容ktu X. Ukazatel' na chlen klassa B mozhno prisvaivat' ukazatelyu na chlen togo zhe tipa klassa D pri uslovii, chto D yavlyaetsya pryamym ili nepryamym proizvodnym klassa B, i odnoznachno opisan kak proizvodnyj v chasti public ($$R.10.1.1). Prisvaivanie ob容ktu tipa "ssylka na T" svoditsya k prisvaivaniyu ob容ktu tipa T, kotoryj oboznachaetsya ssylkoj. Vypolnenie vyrazhenie vida E1 op= E2 ekvivalentno vypolneniyu E1 = E1 op (E2), odnako E1 vychislyaetsya lish' odin raz. V operaciyah += i -= levyj operand mozhet byt' ukazatelem, v etom sluchae pravyj (celochislennyj) operand preobrazuetsya tak, kak ob座asnyalos' v $$R.5.7. Vse pravye operandy i vse levye operandy, ne yavlyayushchiesya ssylkami, dolzhny byt' arifmeticheskogo tipa. Dlya ob容ktov klassa prisvaivanie v obshchem sluchae ne sovpadaet s inicializaciej ($$R.8.4, $$R.12.1, $$R.12.6, $$R.12.8). R.5.18 Operaciya zapyataya Operacii zapyataya vypolnyayutsya sleva napravo. vyrazhenie: vyrazhenie-prisvaivaniya vyrazhenie, vyrazhenie-prisvaivaniya Para vyrazhenij, razdelennyh zapyatoj, vychislyaetsya sleva napravo i znachenie levogo vyrazheniya unichtozhaetsya. Vse pobochnye effekty vychisleniya levogo vyrazheniya mogut voznikat' do vychisleniya pravogo vyrazheniya. Tip i znachenie rezul'tata sovpadayut s tipom i znacheniem pravogo vyrazheniya. Rezul'tat yavlyaetsya adresom, esli takovym yavlyaetsya pravoe vyrazhenie. V kontekstah, gde zapyataya imeet special'noe znachenie, skazhem v spiske fakticheskih parametrov funkcii ($$R.5.2.2) ili v spiske inicializatorov ($$R.8.4),