Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 55

Автор ΠœΡŽΡ€Ρ€Π΅ΠΉ Π₯ΠΈΠ»Π»

ΠŸΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса с дСструктором Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ число элСмСнтов. НапримСр:

class X (* ... ~X(); *); X* p = new X [size]; delete[size] p;

8.5.9 Π’ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ИмСн Π§Π»Π΅Π½ΠΎΠ²

Π§Π»Π΅Π½Ρ‹ класса, описанныС с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом class, являюся Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, ΠΈΡ… ΠΈΠΌΠ΅Π½Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ функциями Ρ‡Π»Π΅Π½Π°ΠΌΠΈ (#8.5.2) ΠΈ Π΄Ρ€ΡƒΠ·ΡŒΡΠΌΠΈ (см. #8.5.10), Ссли ΠΎΠ½ΠΈ Π½Π΅ стоят послС ΠΌΠ΅Ρ‚ΠΊΠΈ Β«public:Β». Π’ этом случаС ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Ρ‡Π»Π΅Π½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ любой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. Struct являСтся классом, всС Ρ‡Π»Π΅Π½Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰ΠΈΠ΅, см. #8.5.12.

Если ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс описан ΠΊΠ°ΠΊ struct ΠΈΠ»ΠΈ Ссли ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Π² описании ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса стоит ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово public, Ρ‚ΠΎ ΠΎΠ±Ρ‰ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса являюся ΠΎΠ±Ρ‰ΠΈΠΌΠΈ для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класа; Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаях ΠΎΠ½ΠΈ ΡΠ»ΡΡŽΡ‚ΡΡ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Ρ‡Π»Π΅Π½ mem Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса base ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ описан ΠΊΠ°ΠΊ ΠΎΠ±Ρ‰ΠΈΠΉ для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ опиисания Π²ΠΈΠ΄Π°

typedef-имя :: ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ;

Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ typedef-имя ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс, Π° ΠΈΠ΄Π΅Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π΅ΡΡ‚ΡŒ имя Ρ‡Π»Π΅Π½Π° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. Π’Π°ΠΊΠΎΠ΅ описаниС Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΡ‚ΠΎΡΡ‚ΡŒ Π² ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ части ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса. Рассморим

class base (* int a; public: int b, c; int bf(); *);

class derived : base (* int d; public: base::c; int e; int df(); *);

int ef(derived amp;);

Π’Π½Π΅ΡˆΠ½ΡΡ функция ef ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠΌΠ΅Π½Π° c, e ΠΈ df. Являясь Ρ‡Π»Π΅Π½ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ derived, функция df ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° b, c, bf, d, e ΠΈ df, Π½ΠΎ Π½Π΅ a. Являясь Ρ‡Π»Π½ΠΎΠΌ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ base, функция bf ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π»Π΅Π½Ρ‹ a, b, c ΠΈ bf.


8.5.10 Π”Ρ€ΡƒΠ·ΡŒΡ

Π”Ρ€ΡƒΠ³ класса – это функция Π½Π΅-Ρ‡Π»Π΅Π½, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ². Π”Ρ€ΡƒΠ³ Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ области вдимости класса ΠΈ Π½Π΅ вызываСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ синтаксиса Π²Ρ‹Π±ΠΎΡ€Π° Ρ‡Π»Π΅Π½Π° (Ссли ΠΎΠ½ Π½Π΅ являСтся Ρ‡Π»Π΅Π½ΠΎΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса). Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ различия ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ ΠΈ Π΄Ρ€ΡƒΠ·ΡŒΡΠΌΠΈ:

class private (* int a; friend void friend_set(private*, int); public: void member_set(int); *);

void friend_set (private* p, int i) (* p-Β»a = i; *)

void private::member_set (int i) (* a = i; *)

private obj; friend_set ( amp;obj,10); obj.member_set (10);

Если описаниС friend отностися ΠΊ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌ становится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ функция, задаваСмая Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π§Π»Π΅Π½ класса cl1 ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΌ класса cl2. НапримСр:

class cl2 (* friend char* cl1::foo(int); // ... *);

ВсС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ класса cl1 ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сдСланы Π΄Ρ€ΡƒΠ·ΡŒΡΠΌΠΈ класа cl2 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ описания

class cl2 (* friend class cl1 ; // ... *);

Ѐункция Ρ‡Π»Π΅Π½, опрСдСлСнная (#10) Π² описании класса, яляСтся inline.

8.5.11 Ѐункция ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π² качСствС ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса.

имя_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ_ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: operator опСрация

опСрация: ΠΎΠ΄Π½Π° ΠΈΠ· new delete + – * / % ^ amp; ! ~ ! = Β« Β» += -= *= /= %= ^= amp;= != Β«β€ž β€œΒ» Β«β€ž= β€œΒ»= == != Β«= Β»= amp; amp; !! ++ – () []

ПослСдниС Π΄Π²Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ – это Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ индСксирваниС. Ѐункция опСрация (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ operator new ΠΈ operator delete; см. #7.2) Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Ρ‡Π»Π΅Π½ΠΎΠΌ, ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ классовый ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅ #7.16. 8.5.12 Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΅ΡΡ‚ΡŒ класс, всС Ρ‡Π»Π΅Π½Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰ΠΈΠ΅. Π­Ρ‚ΠΎ Π·Π½Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ

struct s (* ... *); эквивалСнтно

class s (* public: ... *);

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π»Π΅Π½Ρ‹ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ конструктры ΠΈ дСструкторы). Π‘Π°Π·ΠΎΠ²ΠΉ класс ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ struct являСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ

struct s : d (* ... *);

эквиволСнтно

class s : public b (* public: ... *);

8.5.13 ОбъСдинСния

ОбъСдинСниС ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ структурой, всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‡Π»Π΅Π½Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ со смСщСния 0, ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ достаточСн для содСрТания любого ΠΈΠ· Π΅Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‡Π»Π΅Π½ΠΎΠ². Π’ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² объСдинСии ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π½Π΅ большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠ±Π΅ΠΊΡ‚ΠΎΠ² Ρ‡Π»Π΅Π½ΠΎΠ². ОбъСдинСниС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π»Π΅Π½Ρ‹ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ конструкторы ΠΈ дСструкторы). Из объСдинСния Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π²Π΅Ρ‚ΠΈ класс. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ класса с конструктором ΠΈΠ»ΠΈ дСструктором Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π»Π΅Π½ΠΎΠΌ объСдинСния.

ОбъСдинСниС вида

union (* список_Ρ‡Π»Π΅Π½ΠΎΠ² *);

называСтся бСзымянным объСдинСниСм; ΠΎΠ½ΠΎ опрСдСляСт Π½Π΅ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ИмСна Ρ‡Π»Π΅Π½ΠΎΠ² бСзымянного объСдинСния Π΄ΠΎΠ»Π½Ρ‹ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈΠΌΠ΅Π½ Π² области видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ объСдинСниС описано; Π² этой области видимости ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСпосрСдствСнно, Π±Π΅Π· ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ синтаксиса доступа ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ (#8.5). НапримСр:

union (* int a; char* p; *); a = 1; // ... p = Β«asdfΒ»;

Π—Π΄Π΅ΡΡŒ a ΠΈ p ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ простыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (Π½Π΅-Ρ‡Π»Π½Ρ‹), Π½ΠΎ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ объСдинСния, ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ адрСс.

8.5.14 Поля Π‘ΠΈΡ‚

ΠžΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ_Ρ‡Π»Π΅Π½Π° Π²ΠΈΠ΄Π°

ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ opt : константноС_Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

опрСдСляСт ΠΏΠΎΠ»Π΅; Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Π° отдСляСтся ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ поля Π΄Π²Π΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ. Поля ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ Ρ†Π΅Π»Ρ‹Π΅; ΠΎΠ½ΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ слов. ПолС , Π½Π΅ Π²Π»Π΅Π·Π°ΡŽΡ‰Π΅Π΅ Π² ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π΅ΡΡ Π² Ρ†Π΅Π»ΠΎΠΌ мСсто, помСщаСтся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ слово. ПолС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡˆΠΈΡ€Π΅ слова. На Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… ΠΎΠ½ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ справа Π½Π°Π»Π΅Π²ΠΎ, Π° Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ, см. #2.6.

НСимСнованныС поля ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ ΠΏΡ€ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ для согласовния внСшнС прСдписанных Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΉ (Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ²). Π’ особых слчаях Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ поля Π΄Π»ΠΈΠ½Ρ‹ 0 Π·Π°Π΄Π°ΡŽΡ‚ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π³ΠΎ поля ΠΏΠΎ Π³Ρ€Π°Π½ΠΈΡ†Π΅ слова. НС трСбуСтся Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π»ΡŽΠ±Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ†Π΅Π»Ρ‹Ρ…. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π΄Π°ΠΆΠ΅ Ρ†Π΅Π»Ρ‹Π΅ поля ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ unsigned. По этим ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ рСкомСндуСтся ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ поля ΠΊΠ°ΠΊ unsigned. К полям Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ опСрация получСния адрСса amp;, поэтому Π½Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° поля.

Поля Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ объСдинСния.

8.5.15 Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠšΠ»Π°ΡΡΡ‹

Класс ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ описан Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса. Π­Ρ‚ΠΎ, ΠΎΠ½Π°ΠΊΠΎ, лишь соглашСниС ΠΎ записи, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ класс ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ области видимости. НапримСр:

int x;

class enclose (* // ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ int x; class inner (* // Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ int y; void f(int); *); int g(inner*); *);

inner a; void inner::f(int i) (* x = i; *) // присваиваСт ::x int enclose::g(inner* p) (* return p-Β»y; *) // ошибка

8.6 Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ

ΠžΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ описываСмого ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°.

ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€: = Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ = (* список_ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² , opt *) ( список_Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ) список_ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²: Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ список_ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² , список_ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² (* список_ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² *)

ВсС выраТСния Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ статичСской ΠΈΠ»ΠΈ внСшнСй ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ константными выраТСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ опсаны Π² #12, ΠΈΠ»ΠΈ выраТСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сводятся ΠΊ адрСсам Ρ€Π°Π½Π΅Π΅ описанных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ со смСщСниСм Π½Π° константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. АвтоматичСскиС ΠΈ рСгистровыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ½Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π»ΡŽΠ±Ρ‹ΠΌΠΈ выраТСниями, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‰ΠΈΠΌΠΈ константы, Ρ€Π½Π΅Π΅ описанныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ГарантируСтся, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ статичСскиС ΠΈ внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π² качСствС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния 0. ГарантируСтся, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ автоматичСскиС ΠΈ ргистровыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π² качСствС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния «пустоС мСсто»*.

– * Π’ английском – Β«garbageΒ», ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅Π΅ Π·Π°Ρ‚Π΅Ρ€Ρ‚ΠΎΠ΅ мСсто [памяти], Ρ‚.Π΅. Ссли пСрСмСнная цСлая, Ρ‚ΠΎ 0, Ссли char, Ρ‚ΠΎ '\0', Ссли ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π’, Ρ‚ΠΎ (Π’*) NULL. (ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².)

Когда ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ примСняСтся ΠΊ скаляру (ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ арифмСтичСского Ρ‚ΠΈΠΏΠ°), ΠΎΠ½ состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ выраТСния, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки. ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° находится ΠΈΠ· выраТСния; Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ‚Π΅ ΠΆΠ΅ прСобразвания, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈ присваивании.

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ () Π½Π΅ являСтся ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ, Ρ‚ΠΎ X a(); являСтся Π½Π΅ описаниСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса X, Π° описаниСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉ X.

8.6.1 Бписок Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²

Когда описанная пСрСмСнная являСтся составной (класс ΠΈΠ»ΠΈ массив), Ρ‚ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ запятыми списка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² для Ρ‡Π»Π΅Π½ΠΎΠ² составного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π² порядкС возрастания индСкса ΠΈΠ»ΠΈ ΠΏΠΎ порядку Ρ‡Π»Π΅Π½ΠΎΠ². Если массив содСрхит составныС ΠΏΠΎΠ΄ΠΎΠ±Π΅ΠΊΡ‚Ρ‹, Ρ‚ΠΎ это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ рСкурсивно примСняСтся ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ состаного ΠΏΠΎΠ΄ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Если ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² спискС мСньшС, Ρ‡Π΅ΠΌ Ρ‡Π»Π΅Π½ΠΎΠ² Π² составном ΠΏΠΎΠ΄ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, Ρ‚ΠΎ составной ΠΏΠΎΠ΄ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ допоняСтся нулями.

Π€ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Если ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ начинаСтся с Π»Π΅Π²ΠΎΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΎΠΉ скобки, Ρ‚ΠΎ слСдущий Π·Π° Π½Π΅ΠΉ список ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‡Π»Π΅Π½Ρ‹ сотавного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°; Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ числа ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², большСго, Ρ‡Π΅ΠΌ число Ρ‡Π»Π΅Π½ΠΎΠ², считаСтся ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΌ. Если, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Ρ‚ΠΎΡ€ Π½Π΅ начинаСтся с Π»Π΅Π²ΠΎΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΎΠΉ скобки, Ρ‚ΠΎ ΠΈΠ· списка брутся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ элСмСнты, достаточныС для сопоставлСния элСмСтам составного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°; всС ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ΡΡ элСмСнты ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта составного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ составной ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

НапримСр,

int x[] = (* 1, 3, 5 *);

описываСт ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ x ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив, ΠΈΠΌΡŽΡ‰ΠΈΠΉ Ρ‚Ρ€ΠΈ элСмСнта, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π΅ Π±Ρ‹Π» ΡƒΠΊΠ°Π·Π°Π½ ΠΈ Π΄Π°Π½ΠΎ Ρ‚Ρ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°.

float y[4][3] = (* (* 1, 3, 5 *), (* 2, 4, 6 *), (* 3, 5, 7 *) *);

являСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ снабТСнной ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ скобками ΠΈΠ½Ρ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ: 1,3 ΠΈ 5 ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ряд массива y[0], Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, y[0][0], y[0][1] ΠΈ y[0][2]. Аналогично, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ строки ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ y[1] ΠΈ y[2]. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ заканчваСтся Ρ€Π°Π½ΡŒΡˆΠ΅, поэтому y[3] инициализируСтся 0-ями. Π’ Ρ‚ΠΎΠ½ΠΎcΡ‚ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ эффСкт ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ достигнут с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ

float y[4][3] = (* 1, 3, 5, 2, 4, 6, 3, 5, 7 *);

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для y начинаСтся с Π»Π΅Π²ΠΎΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΎΠΉ скобки, Π½ΠΎ Π½Π΅ начинаСтся с Π½Π΅Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для y[0], поэтому ΠΈΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Ρ€ΠΈ значСния ΠΈΠ· списка. Аналогично, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для y[1] ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ для y[2]. Π’Π°ΠΊ ΠΆΠ΅