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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 286

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

Token &Token::operator=(const Token &t) {

 // Ссли этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ содСрТит строку, a t Π½Π΅Ρ‚, ΠΏΡ€Π΅ΠΆΠ½ΡŽΡŽ строку слСдуСт

 // ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ

 if (tok == STR && t.tok != STR) sval.~string();

 if (tok == STR && t.tok == STR)

  sval = t.sval; // Π½Π΅Ρ‚ нСобходимости ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ строку

 else

  copyUnion(t); // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ строку, Ссли t.tok содСрТит STR

 tok = t.tok;

 return *this;

}

Если объСдинСниС Π² Π»Π΅Π²ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π΅ содСрТит строку, Π° объСдинСниС Π² ΠΏΡ€Π°Π²ΠΎΠΌ β€” Π½Π΅Ρ‚, Ρ‚ΠΎ сначала слСдуСт ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΆΠ½ΡŽΡŽ ΡΡ‚Π°Ρ€ΡƒΡŽ строку, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρƒ объСдинСния. Если ΠΎΠ±Π° объСдинСния содСрТат строку, для копирования ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния класса string. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС происходит Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ copyUnion(), ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰Π΅ΠΉ присвоСниС. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ copyUnion(), Ссли ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ β€” строка, создаСтся новая строка Π² Ρ‡Π»Π΅Π½Π΅ объСдинСния Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°. Если Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ строкой, Ρ‚ΠΎ достаточно ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ присвоСния.

УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 19.6

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 19.21. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ класса Token.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 19.22. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² класс Token Ρ‡Π»Π΅Π½ Ρ‚ΠΈΠΏΠ° Sales_data.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 19.23. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² класс Token конструктор пСрСмСщСния ΠΈ присвоСния.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 19.24. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ присвоСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Token самому сСбС.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 19.25. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присвоСния, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ значСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² объСдинСнии.

19.7. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ классы

Класс, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ классом (local class). Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ класс опрСдСляСт Ρ‚ΠΈΠΏ, Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΉ области видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… классов, Ρ‡Π»Π΅Π½Ρ‹ локального класса ТСстко ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹.

ВсС Ρ‡Π»Π΅Π½Ρ‹ локального класса, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Ρ‚Π΅Π»Π΅ класса. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ классы Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, Ρ‡Π΅ΠΌ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅.

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ‡Π»Π΅Π½Ρ‹ Π² самом классС, сущСствСнно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈ возмоТности Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² локального класса. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… классов Ρ€Π΅Π΄ΠΊΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€, ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΠΉ нСсколько строк ΠΊΠΎΠ΄Π°. Π‘ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² локальном классС нСльзя ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ статичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ способа ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΡ….

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ классы Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ· области видимости Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ ΠΊΠΎ всСм ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΈΠ· ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ области видимости. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΈΠΌΠ΅Π½Π°ΠΌ Ρ‚ΠΈΠΏΠΎΠ², статичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (см. Ρ€Π°Π·Π΄Π΅Π» 6.1.1) ΠΈ пСрСчислСний, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ локальной области видимости. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ класс Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ класс:

int a, val;

void foo(int val) {

 static int si;

 enum Loc { a = 1024, b }; // Bar локальна для foo

 struct Bar {

  Loc locVal; // ok: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ локальноС имя Ρ‚ΠΈΠΏΠ°

  int barVal;

  void fooBar(Loc l = a) // ok: Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Loc::a

  {

   barVal = val;   // ошибка: val Π»ΠΎΠΊΠ°Π»Π΅Π½ для foo

   barVal = ::val; // ok: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

   barVal = si; // ok: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ статичСский Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

   locVal = b;    // ok: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ

  }

 };

 // ...

}

К Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ классам ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° доступа

БодСрТащая функция Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€Π°Π² доступа ΠΊ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ Ρ‡Π»Π΅Π½Π°ΠΌ локального класса. БСзусловно, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ класс Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ друТСствСнной. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ класс опрСдСляСт свои Ρ‡Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅. Π’Π° Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ классу, вСсьма ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Π°. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ класс сосрСдоточСн (инкапсулирован) Π² своСй локальной области видимости. Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ°Ρ инкапсуляция, ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽΡ‰Π°Ρ сокрытиС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, бСзусловно, являСтся излишнСй.

Поиск имСн в локальном классС

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

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ классы

Π’ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π»ΠΎΠΆΠΈΡ‚ΡŒ класс Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ класс. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ класса ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π²Π½Π΅ Ρ‚Π΅Π»Π° локального класса. Однако Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ класс слСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ локальной области видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ класс:

void foo() {

 class Bar {

 public:

  // ...

  class Nested; // объявлСниС класса Nested

 };

 // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса Nested

 class Bar::Nested {

  // ...

 };

}

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ‡Π»Π΅Π½Π° Π²Π½Π΅ класса слСдуСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΈΠΌΠ΅Π½ΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Bar::Nested ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ класс Nested, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… класса Bar.

Класс, Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ класс, сам являСтся Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ классом, со всСми ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ограничСниями. ВсС Ρ‡Π»Π΅Π½Ρ‹ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ класса Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Ρ‚Π΅Π»Π΅ самого Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ класса.

19.8. ВозмоТности, ΡΠ½ΠΈΠΆΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ

Для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ программирования язык Π‘++ опрСдСляСт Π½Π°Π±ΠΎΡ€ срСдств, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сниТаСт ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. НСпСрСносимоС (nonportable) срСдство спСцифично для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… машин. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΠ΅ срСдства ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»ΠΊΠΈ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈ пСрСносС с ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ. Одной ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½ нСвозмоТности пСрСноса являСтся Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ арифмСтичСских Ρ‚ΠΈΠΏΠΎΠ² Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… Ρ€Π°Π·Π½Ρ‹Π΅ (см. Ρ€Π°Π·Π΄Π΅Π» 2.1.1).

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄Π²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… срСдства, ΡΠ½ΠΈΠΆΠ°ΡŽΡ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ, унаслСдованных языком Π‘++ ΠΎΡ‚ языка Π‘: Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… полях ΠΈ спСцификаторС volatile. Π’Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΎΠΆΠ΅ ΡΠ½ΠΈΠΆΠ°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ.

19.8.1. Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ поля

Класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ (Π½Π΅ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½ ΠΊΠ°ΠΊ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ (bit-field). Π‘ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ количСство Π±ΠΈΡ‚ΠΎΠ². ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ поля ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ нСобходимости ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΠ»ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΌΡƒ устройству.

РасполоТСниС Π² памяти Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

Π£ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ поля Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ цСлочислСнный Ρ‚ΠΈΠΏ ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏ пСрСчислСния (см. Ρ€Π°Π·Π΄Π΅Π» 19.3). Для Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ поля ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ поля Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ‡Π»Π΅Π½ класса Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΏΠΎΠ»Π΅ΠΌ, послС Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ ΠΈ константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ количСство Π±ΠΈΡ‚ΠΎΠ²:

typedef unsigned int Bit;

class File {

 Bit mode: 2;       // mode ΠΈΠΌΠ΅Π΅Ρ‚ 2 Π±ΠΈΡ‚Π°

 Bit modified: 1;   // modified ΠΈΠΌΠ΅Π΅Ρ‚ 1 Π±ΠΈΡ‚

 Bit prot_owner: 3; // prot_owner ΠΈΠΌΠ΅Π΅Ρ‚ 3 Π±ΠΈΡ‚Π°

 Bit prot_group: 3; // prot_group ΠΈΠΌΠ΅Π΅Ρ‚ 3 Π±ΠΈΡ‚Π°

 Bit prot_world: 3; // prot_world ΠΈΠΌΠ΅Π΅Ρ‚ 3 Π±ΠΈΡ‚Π°

 // Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ класса File

public:

 // Ρ€Π΅ΠΆΠΈΠΌΡ‹ Ρ„Π°ΠΉΠ»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½Ρ‹Π΅

 // Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹; см. p. 2.1.3

 enum modes { READ = 01, WRITE = 02, EXECUTE = 03 };

 File &open(modes);

 void close();

 void write();

 bool isRead() const;

 void setWrite();

}

Π‘ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ mode ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π² Π΄Π²Π° Π±ΠΈΡ‚Π°, Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ modified β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½, Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ β€” ΠΏΠΎ Ρ‚Ρ€ΠΈ Π±ΠΈΡ‚Π°. Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ поля, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ порядкС Π² Ρ‚Π΅Π»Π΅ класса, Ссли это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² смСТных Π±ΠΈΡ‚Π°Ρ… Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ достигаСтся ΡƒΠΏΠ»ΠΎΡ‚Π½Π΅Π½ΠΈΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°. НапримСр, ΠΏΡΡ‚ΡŒ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ объявлСнии Π±ΡƒΠ΄ΡƒΡ‚ сохранСны Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° unsigned int, ассоциированной с ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΏΠΎΠ»Π΅ΠΌ mode. Бпособ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π±ΠΈΡ‚ΠΎΠ² Π² Ρ†Π΅Π»ΠΎΠ΅ число зависит ΠΎΡ‚ ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

К Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΌΡƒ полю Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ обращСния ΠΊ адрСсу (&), поэтому Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ поля классов.