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

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

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

class task (* // ... task* next; static task* task_chain; void shedule(int); void wait(event); // ... *);

ОписаниС Ρ‡Π»Π΅Π½Π° task_chain (Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Π·Π°Π΄Π°Ρ‡) ΠΊΠ°ΠΊ static обСспСчиваСт, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ всСго лишь ΠΎΠ΄ΠΈΠ½, Π° Π½Π΅ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΏΠΈΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ task. Он всС Ρ€Π°Π²Π½ΠΎ остаСтся Π² области видимости класса task, ΠΈ Β«ΠΈΠ·Π²Π½Π΅Β» доступ ΠΊ Π½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»Ρ‡ΠΈΡ‚ΡŒ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΎΠ½ Π±Ρ‹Π» описан ΠΊΠ°ΠΊ public. Π’ этом случаС Π΅Π³ΠΎ имя Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΡ‚ΠΎΡ‡Π½ΡΡ‚ΡŒΡΡ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π΅Π³ΠΎ класса:

task::task_chain

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π»Π΅Π½Π΅ Π½Π° Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ просто task_chain. ИспользованиС статичСских Ρ‡Π»Π΅Π½ΠΎΠ² класса ΠΌΠΎΠΆΠ΅Ρ‚ Π·ΠΌΠ΅Ρ‚Π½ΠΎ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

5.4.5 Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Π§Π»Π΅Π½Ρ‹

МоТно Π±Ρ€Π°Ρ‚ΡŒ адрСс Ρ‡Π»Π΅Π½Π° класса. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ адрСса Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π»Π΅Π½Π° часто Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅ Ρ†Π΅Π»ΠΈ ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹, ΠΊΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π² #4.6.9 ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Ρ„ΡƒΠ½Ρ†ΠΈΠΈ, Π² Ρ€Π°Π²Π½ΠΎΠΉ стСпСни ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΈ ΠΊ функциям Ρ‡Π»Π΅Π½Π°ΠΌ. Однако, Π½Π° настоящСС врСмя Π² языкС имССтся Π΄Π΅Ρ„Π΅ΠΊΡ‚: Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏ указатСля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ получаСтся Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ приходится ΠΆΡƒΠ»Π½ΠΈΡ‡Π°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Ρ€ΡŽΠΊΠΈ. Π§Ρ‚ΠΎ касаСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ привдится Π½ΠΈΠΆΠ΅, Ρ‚ΠΎ Π½Π΅ гарантируСтся, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π˜ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‚Ρ€ΡŽΠΊ Π½Π°Π΄ΠΎ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ

ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ с использованиСм ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ языковой ΠΊΠΎΠ½Ρ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° появится такая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ. Π­Ρ‚ΠΎΡ‚ Ρ‚Ρ€ΡŽΠΊ исползуСт Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ this рСализуСтся ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ (скрытый) ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π»Π΅Π½Π°*: – * Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΠ΅ вСрсии Π‘++ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ понятиС ΡƒΠΊΠ°Π·Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‡Π»Π΅Π½: cl::* ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‡Π»Π΅Π½ класса clΒ». НапримСр:

typedef void (cl::*PROC)(int); PROC pf1 = amp;cl::print; // ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ Ρ‚ΠΈΠΏΡƒ Π½Π΅Π½ΡƒΠΆΠ½ΠΎ PROC pf2 = amp;cl::print;

Для Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‡Π»Π΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ . ΠΈ -Β». НапримСр:

(z1.*pf1)(2); (( amp;z2)-Β»*pf2)(4);

(ΠΏΡ€ΠΈΠΌ. Π°Π²Ρ‚ΠΎΡ€Π°)

#include Β«stream.hΒ»

struct cl (* char* val; void print(int x) (* cout Β«β€ž val «« x «« Β«\nβ€œ; *); cl(char* v) (* val = v; *) *);

// ``Ρ„Π°Π»ΡŒΡˆΠΈΠ²Ρ‹ΠΉ'' Ρ‚ΠΈΠΏ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‡Π»Π΅Π½ΠΎΠ²: typedef void (*PROC)(void*, int);

main() (* cl z1("z1 "); cl z2("z2 "); PROC pf1 = PROC( amp;z1.print); PROC pf2 = PROC( amp;z2.print); z1.print(1); (*pf1)( amp;z1,2); z2.print(3); (*pf2)( amp;z2,4); *)

Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ функциями (см. Π“Π»Π°Π²Ρƒ 7) Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΈΠ½Π°Ρ‡Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·Π²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

5.4.6 Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ ΠΈ ОбъСдинСния

По ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ struct – это просто класс, всС Ρ‡Π»Π΅Π½Ρ‹ ΠΊΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ

struct s (* ...

Π΅ΡΡ‚ΡŒ просто сокращСнная запись

class s (* public: ...

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° сокрытиС Π΄Π°Π½Π½Ρ‹Ρ… нСумСстно.

ИмСнованноС объСдинСниС опрСдСляСтся ΠΊΠ°ΠΊ struct, Π² ΠΊΠΎΡ‚Ρ€ΠΎΠΉ всС Ρ‡Π»Π΅Π½Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ адрСс (см. #с.8.5.13). Если извСстно, Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π·Π½Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· структуры, Ρ‚ΠΎ объСдинСниС ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ пространство. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ объСдинСниС для хранСния лСксичСских символов C компилятора: union tok_val (* char* p; // строка char v[8]; // ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ (максимум 8 char) long i; // Ρ†Π΅Π»Ρ‹Π΅ значСния double d; // значСния с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ *);

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ компилятор, Π²ΠΎΠΎΠ±Ρ‰Π΅ говоря, Π½Π΅ Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ Ρ‡Π»Π΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, пэтому надлСТащая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠ° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°. НапримСр:

void strange(int i) (* tok_val x; if (i) x.p = "2"; else x.d = 2; sqrt(x.d); // ошибка Ссли i != 0 *)

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, объСдинСниС, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ это, нСльзя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. НапримСр:


Π“Π»Π°Π²Π° 5 ΠšΠ»Π°ΡΡΡ‹

Π­Ρ‚ΠΈ Ρ‚ΠΈΠΏΡ‹ Π½Π΅ «абстрактны», ΠΎΠ½ΠΈ ΡΡ‚ΠΎΠ»ΡŒ ΠΆΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹, ΠΊΠ°ΠΊ int ΠΈ float. β€“ Π”ΡƒΠ³ ΠœΠ°ΠΊΠ˜Π»Ρ€ΠΎΠΉ

Π’ этой Π³Π»Π°Π²Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ возмоТности опрСдСлСния Π½ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² Π‘++, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ мноТСством Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ доступа. ΠžΠ±ΡŠΡΡΠ½ΡΡŽΡ‚ΡΡ способы Π·Π°Ρ‰ΠΈΡ‚Ρ‹ струтуры Π΄Π°Π½Π½Ρ‹Ρ…, Π΅Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, доступа ΠΊ Π½Π΅ΠΉ ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π΅Π΅ уничтоТСния. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ содСрТат простыС классы для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ ΠΈΠΌΠ΅Π½, манипуляции стСком, Ρ€Π°Π±ΠΎΡ‚Ρƒ с мноТСством ΠΈ Ρ€Π΅Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π΄ΠΈΡΠΊΡ€ΠΈΠΌΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Β«Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎΒ») объСдинСния. Π”Π²Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π³Π»Π°Π²Ρ‹ дополнят описаниС возмоТностСй опрСдСлния Π½ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² Π‘++ ΠΈ познакомят читатСля Π΅Ρ‰Π΅ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ интСрСсными ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ.

5.1 Знакомство ΠΈ ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠžΠ±Π·ΠΎΡ€

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

Π’ΠΈΠΏ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ прСдставлСниС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ (понятия). НапримСр, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉΡΡ Π² Π‘++ Ρ‚ΠΈΠΏ float с Π΅Π³ΠΎ опСрацями +, -, * ΠΈ Ρ‚.Π΄. обСспСчиваСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ, Π½ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ матСматичСского понятия Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ числа. Новый Ρ‚ΠΈΠΏ создаСтся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ понятия, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½ΠΈΡ‡Ρ‚ΠΎ прямо ΠΈ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ срСди встроСнных Ρ‚ΠΈΠΏΠΎΠ² Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚. НапримСр, Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ trunk_module (элСмСнт Π»ΠΈΠ½ΠΈΠΈ), Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ тСкстов – Ρ‚ΠΈΠΏ list_of_paragraphs (список ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„ΠΎΠ²). Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΡ‹, Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ понятиям прлоТСния, ΠΏΠΎΠ½ΡΡ‚ΡŒ Π»Π΅Π³Ρ‡Π΅, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ это Π½Π΅ дСлСтся. Π₯ΠΎΡ€ΠΎΡˆΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, опрСдСляСмыС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Π΄Π΅Π»Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅Ρ‚ΠΊΠΎΠΉ ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ позволяСт компилятору ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ нСдопустимыС использования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС останутся Π½Π΅ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ Π΄ΠΎ тСтирования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

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

Π­Ρ‚Π° Π³Π»Π°Π²Π° состоит ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… практичСски ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‡Π°Ρ‚Π΅ΠΉ:

#5.2 ΠšΠ»Π°ΡΡΡ‹ ΠΈ Π§Π»Π΅Π½Ρ‹. Π­Ρ‚ΠΎΡ‚ Ρ€Π°Π·Π΄Π΅Π» Π·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ с основным понятиСм Ρ‚ΠΈΠΏΠ°, опрСдСляСмого ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСся класс (class). Доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ класса ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π²Π°Ρ‚ΡŒΡΡ Π½Π°Π±ΠΎΡ€ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ описаны ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ этого класа. Π’Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ функциями Ρ‡Π»Π΅Π½Π°ΠΌΠΈ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ функциями Ρ‡Π»Π΅Π½Π°ΠΌΠΈ, ΡΠΏΠ΅Ρ†Π°Π»ΡŒΠ½ΠΎ для этой Ρ†Π΅Π»ΠΈ описанными. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠ½Ρ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ. Ѐункция Ρ‡Π»Π΅Π½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ опсана для «очистки» ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ классового ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΡ€ΠΈ Π΅Π³ΠΎ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ. Вакая функция называСтся дСструктором.

#5.3 Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ ΠΈ Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ приводится Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ класс проСктируСтся, рСализуСтся ΠΈ ΠΈΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

#5.4 Π”Ρ€ΡƒΠ·ΡŒΡ ΠΈ ОбъСдинСния. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ приводится ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… подробностСй, ΠΊΠ°ΡΠ°ΡŽΡ‰ΠΈΡ…ΡΡ классов. Π’ Π½Π΅ΠΌ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ доступ ΠΊ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ части класса Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая Π½Π΅ являСтся Ρ‡Π»Π΅Π½ΠΎΠΌ этого класса. Вакая фунция называСтся Π΄Ρ€ΡƒΠ³ (friend). Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄ΠΈΡΠΊΡ€ΠΈΠΌΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ объСдинСниС.

#5.5 ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ ΠΈ ДСструкторы. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ создаватся ΠΊΠ°ΠΊ автоматичСский, статичСский ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² свободной памяти. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π»Π΅Π½ΠΎΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ совокупности (Ρ‚ΠΈΠΏΠ° Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ класса), которая Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· этих Ρ‚Ρ€Π΅Ρ… способов. Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ обясняСтся использованиС конструкторов ΠΈ дСструкторов.

5.2 ΠšΠ»Π°ΡΡΡ‹ ΠΈ Π§Π»Π΅Π½Ρ‹

Класс – это опрСдСляСмый ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Ρ‚ΠΈΠΏ. Π­Ρ‚ΠΎΡ‚ Ρ€Π°Π·Π΄Π΅Π» Π·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ с основными срСдствами опрСдСлСния класса, создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса, Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, уничтТСния Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² послС использования.

5.2.1 Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π§Π»Π΅Π½Ρ‹

Рассмотрим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ понятия Π΄Π°Ρ‚Ρ‹ с использованиСм struct для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ прСдставлСниС Π΄Π°Ρ‚Ρ‹ date ΠΈ мноТСства Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ этого Ρ‚ΠΈΠΏΠ°:

struct date (* int month, day, year; *); // Π΄Π°Ρ‚Π°: мСсяц, дСнь, Π³ΠΎΠ΄ *) date today; void set_date(date*, int, int, int); void next_date(date*); void print_date(date*); // ...

Никакой явной связи ΠΌΠ΅ΠΆΠ΄Ρƒ функциями ΠΈ Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅Ρ‚. Π’Π°ΠΊΡƒΡŽ связь ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, описав Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ Ρ‡Π»Π΅Π½Ρ‹:

struct date (* int month, day, year;

void set(int, int, int); void get(int*, int*, int*); void next(); void print(); *);

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, описанныС Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ функциями Ρ‡Π»Π΅Π½Π°ΠΌΠΈ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° с использованиСм стандартного синтаксса для доступа ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ структуры. НапримСр:

date today; // сСгодня date my_burthday; // ΠΌΠΎΠΉ дСнь роТдСния

void f() (* my_burthday.set(30,12,1950); today.set(18,1,1985);

my_burthday.print();

today.next(); *)

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π°Π·Π½Ρ‹Π΅ структуры ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π»Π΅Π½Ρ‹ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π»Π΅Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ имя структуры:

void date::next() (* if ( ++day Β» 28 ) (* // Π΄Π΅Π»Π°Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ *) *)

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π»Π΅Π½Π΅ ΠΈΠΌΠ΅Π½Π° Ρ‡Π»Π΅Π½ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±Π΅Π· явной ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’ этом случаС имя относится ΠΊ Ρ‡Π»Π΅Π½Ρƒ Ρ‚ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ функция Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π°.

5.2.2 ΠšΠ»Π°ΡΡΡ‹

ОписаниС date Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅ Π΄Π°Π΅Ρ‚ мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с date, Π½ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ СдинствСнными для доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Ρ‚ΠΈΠΏΠ° date. Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ вмСсто struct class: