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

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

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

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ Π°ΠΏΠΏΡ€Π°Ρ‚ inline-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Ѐункция, опрСдСлСнная (Π° Π½Π΅ просто опсанная) Π² описании класса, считаСтся inline. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Π½Π°Ρ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ Π² функциях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ char_stack, Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄Π°! Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π·Π°Ρ‚Ρ€Π°Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ стоит ΠΏΡ€ΠΈΠ½ΠΌΠ°Ρ‚ΡŒ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ класса. Π›ΡŽΠ±ΠΎΠ΅, Π΄Π°ΠΆΠ΅ самоС млСнькоС дСйствиС, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ эффСктивно. Π­Ρ‚ΠΎ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ снимаСт Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‡Π°Ρ‰Π΅ всСго приводят Ρ‡Π°Ρ‰Π΅ всСго Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‡Π»Π΅Π½ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ inline Π²Π½Π΅ описания класса. НапримСр: char char_stack (* int size; char* top;

char* s; public: char pop(); // ... *);

inline char char_stack::pop() (* return *–top; *)

5.3 Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ ΠΈ Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Π§Ρ‚ΠΎ прСдставляСт собой Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ класс? НСчто, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅ нбольшоС ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ мноТСство дСйствий. НСчто, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Β«Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ ящик», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ посрСдством этого мноТСства дСйствий. НСчто, Ρ‡ΡŒΠ΅ фатичСскоС прСдставлСниС ΠΌΠΎΠΆΠ½ΠΎ Π»ΡŽΠ±Ρ‹ΠΌ мыслимым способом ΠΈΠ·ΠΌΠ½ΠΈΡ‚ΡŒ, Π½Π΅ повлияв Π½Π° способ использования мноТСства дСйствий. НСчто, Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΈΠΌΠ΅Ρ‚ΡŒ большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ.

Для всСх Π²ΠΈΠ΄ΠΎΠ² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹: Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, мноТСства, списки, Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, словари ΠΈ Ρ‚.Π΄. Π’Π°ΠΊΠΎΠΉ класс ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Β«Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒΒ», ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Ρ†ΠΈΠΈ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, Π±Ρ‹Π» Π»ΠΈ вставлСн Π΄Π°Π½Π½Ρ‹ΠΉ элСмСнт. Π’ Π½Π΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ дСйствия для осущСствлСния ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ всСх элСмСнтов Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ порядкС, ΠΈ ΠΊΡ€ΠΎΠΌΠ΅ всСго ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ, Π² Π½Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒΡΡ опСрация для удалСния элСмСнта. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π½Ρ‹Π΅ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Π²ΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΠΈΠ΅) классы ΠΈΠΌΠ΅ΡŽΡ‚ конструкторы ΠΈ дСструкторы.

Π‘ΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½Π½Ρ‹ΠΉ интСрфСйс ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ коцСпция модуля (см. Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ #4.4: Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠ°ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ). Класс, ΠΎΠ΄Π½Π°ΠΊΠΎ, являСтся Ρ‚ΠΈΠΏΠΎΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этого класса, ΠΈ Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π²Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, сколько Π½ΡƒΠΆΠ½ΠΎ. ΠœΠΎΠ΄ΡƒΠ»ΡŒ ΠΆΠ΅ сам являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, Π΅Π³ΠΎ Π½Π°Π΄ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½.

5.3.1 ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Пока описаниС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ части класса ΠΈ описаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‡Π»Π΅Π½ΠΎΠ² ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ класса ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡ„Ρ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ влияя Π½Π° Π΅Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Как ΠΏΡ€ΠΈΠΌΠ΅Ρ€ этого расмотрим Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈΠΌΠ΅Π½, которая использовалась Π² Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½ΠΎΠΌ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π΅ Π² Π“Π»Π°Π²Π΅ 3. Π­Ρ‚ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΠΌΠ΅Π½:

struct name (* char* string; char* next; double value; *);

Π’ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ класса table:

// Ρ„Π°ΠΉΠ» table.h

class table (* name* tbl; public: table() (* tbl = 0; *)

name* look(char*, int = 0); name* insert(char* s) (* return look(s,1); *) *);

Π­Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° отличаСтся ΠΎΡ‚ Ρ‚ΠΎΠΉ, которая ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Π“Π»Π²Π΅ 3 Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ это настоящий Ρ‚ΠΈΠΏ. МоТно ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄Π½Ρƒ

table, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° table ΠΈ Ρ‚.Π΄. НапримСр:

#include Β«table.hΒ»

table globals; table keywords; table* locals;

main() (* locals = new table; // ... *)

Π’ΠΎΡ‚ рСализация table::look(), которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π»ΠΈΠ½Π΅Π½Ρ‹ΠΉ поиск Π² связанном спискС ΠΈΠΌΠ΅Π½ name Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅:

#include Β«string.hΒ»

name* table::look(char* p, int ins) (* for (name* n = tbl; n; n=n-Β»next) if (strcmp(p,n-Β»string) == 0) return n;

if (ins == 0) error(«имя нС найдСно»);

name* nn = new name; nn-Β»string = new char[strlen(p)+1]; strcpy(nn-Β»string,p); nn-Β»value = 1; nn-Β»next = tbl; tbl = nn; return nn; *)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим класс table, ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ просмотр, ΠΊΠ°ΠΊ это дСлалось Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ΠΎΠΌ. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π΅ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ ограничСния, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ написанныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… использовалась Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ опрСдСлСнная вСрсия класа table, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π²Π΅Ρ€Π½Ρ‹ΠΌΠΈ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ:

class table (* name** tbl; int size; public: table(int sz = 15); ~table();

name* look(char*, int = 0); name* insert(char* s) (* return look(s,1); *) *);

Π’ структуру Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ конструктор внСсСны измСнСния, ΠΎΡ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π½ΠΈΡ Ρ‚Π°Π±Π»ΠΈΡ†Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€. Π—Π°Π΄Π°Π½ΠΈΠ΅ конструктора с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ обСспСчиваСт, Ρ‡Ρ‚ΠΎ страя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ указывался Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, остнСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π² стуации, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ класс Π½Π΅ повлияв Π½Π° старыС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’Π΅ΠΏΠ΅Ρ€ΡŒ конструктор ΠΈ дСструктор ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΆΠ°ΡŽΡ‚ Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

table::table(int sz) (* if (sz Β« 0) error(β€žΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹β€œ); tbl = new name*[size=sz];

for (int i = 0; iΒ«sz; i++) tbl[i] = 0; *)

table::~table() (* for (int i = 0; iΒ«size; i++) for (name* n = tbl[i]; n; n=n-Β»next) (* delete n-Β»string; delete n; *) delete tbl; *)

Описав дСструктор для класса name ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ простой ΠΈ ясный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ table::~table(). Ѐункция просмотра практичСски ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° Ρ‚ΠΎΠΉ, которая использовалась Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° (#3.1.3):

#include Β«string.hΒ»

name* table::look(char* p, int ins) (* int ii = 0; char* pp = p; while (*pp) ii = ii««1 ^ *pp++; if (ii « 0) ii = -ii; ii %= size;

for (name* n=tbl[ii]; n; n=n-Β»next) if (strcmp(p,n-Β»string) == 0) return n;

if (ins == 0) error(«имя нС найдСно»);

name* nn = new name; nn-Β»string = new char[strlen(p)+1]; strcpy(nn-Β»string,p); nn-Β»value = 1; nn-Β»next = tbl[ii]; tbl[ii] = nn; return nn;

*)

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π»Π΅Π½Ρ‹ класса Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π½ΠΎΠ²ΠΎ ΠΊΠΎΠΌΠΏΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ всСгда, ΠΊΠΎΠ³Π΄Π° вносится ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² опсаниС класса. Π’ ΠΈΠ΄Π΅Π°Π»Π΅ Ρ‚Π°ΠΊΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡ‚Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΡ… класса. К соТалСнию, это Π½Π΅ Ρ‚Π°ΠΊ. Для размСщСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ классового Ρ‚ΠΈΠΏΠ° компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса. Если Ρ€Π°Π·ΠΌΠ΅Ρ€ этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² мСняСтся, Ρ‚ΠΎ Ρ„Π°ΠΉΠ»Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… класс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π½ΡƒΠΆΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½ΠΎΠ²ΠΎ. МоТно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ (ΠΈ ΠΎΠ½Π° ΡƒΠΆΠ΅ написана), которая опрСдСляСт мноТСство (минимальноС) Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π½ΠΎΠ²ΠΎ послС измСнСния описания класса, Π½ΠΎ ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ распространСния ΠΎΠ½Π° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π°.

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


Π­Ρ‚ΠΎΠΉ слоТности ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, прСдставив ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° «настоящий» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’Π°ΠΊ ΠΊΠ°ΠΊ всС эти ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€, Π° Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ «настящих» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² Ρ„Π°ΠΉΠ»Π΅, Π³Π΄Π΅ доступна закртая Ρ‡Π°ΡΡ‚ΡŒ, Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Однако Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ссылки ΠΏΠΎ памяти ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ класса, Π° Ρ‚Π°ΠΊΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с автоматичСским ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ класса Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ выдСлСния ΠΈ освобоТдСния свободной памяти. Π­Ρ‚ΠΎ сдСлало Π±Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ inline-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‡Π»Π½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ части. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ сдСлаСт Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚Π½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΡƒ C ΠΈ Π‘++ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ C компилятор ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ struct Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ это Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Π‘++ компилятор). Для Π‘++ это Π±Ρ‹Π»ΠΎ сочтСно Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹ΠΌ.

5.3.2 Π—Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π½Ρ‹ΠΉ Класс

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π΅Π· сокрытия Π΄Π°Π½Π½Ρ‹Ρ… (с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ структур) Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ мСньшСй продуманности, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ со сокрытиСм Π΄Π°Π½Π½Ρ‹Ρ… (с использованиСм классов). Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π΅ слишком Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡΡΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π΅Π΅ прСдплагаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. А ΠΊΠΎΠ³Π΄Π° опрСдСляСтся класс, всС Π²Π½ΠΈΠΌΠ½ΠΈΠ΅ сосрСдотачиваСтся Π½Π° обСспСчСнии Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΏΠΎΠ»Π½Ρ‹ΠΌ мнТСством ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ; это Π²Π°ΠΆΠ½ΠΎΠ΅ смСщСниС Π°ΠΊΡ†Π΅Π½Ρ‚Π°. ВрСмя, ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ окупаСтся ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈ тСстировании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° intset, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ понятиС «мноТСство Ρ†Π΅Π»Ρ‹Ρ…Β»:

class intset (* int cursize, maxsize; int *x; public: intset(int m, int n); // самоС большСС, m int'ов в 1..n ~intset();

int member(int t); // являСтся Π»ΠΈ t элСмСнтом? void insert(int t); // Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ "t" Π² мноТСство

void iterate(int amp; i) (* i = 0; *) int ok(int amp; i) (* return iΒ«cursize; *) int next(int amp; i) (* return x[i++]; *) *);

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот класс, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ Ρ€Π°ΡΠΏΡ‡Π°Ρ‚Π°Ρ‚ΡŒ мноТСство случайных Ρ†Π΅Π»Ρ‹Ρ… чисСл. Π’Π°ΠΊΠΎΠ΅ мноТСство ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ€ΠΎΠ·Ρ‹Π³Ρ€Ρ‹ΡˆΠ° Π»ΠΎΡ‚Π΅Ρ€Π΅ΠΈ. Π­Ρ‚ΠΎ простоС мноТСство ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ†Π»Ρ‹Ρ… Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Ρ‹. Но для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏ мноТСство Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΌ. Как всСгда, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ошибки:

#include Β«stream.hΒ»

void error(char* s) (* cerr Β«β€ž "set: " «« s «« Β«\nβ€œ; exit(1); *)

Класс intset ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² main(), которая ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π΄Π²Π° Ρ†Π΅Π»Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π·Π°Π΄Π°Π΅Ρ‚ число случайных чисСл, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π»Π΅ΠΆΠ°Ρ‚ΡŒ случайныС Ρ†Π΅Π»Ρ‹Π΅:


main(int argc, char* argv[]) (* if (argc != 3) error(«оТидаСтся Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Β»); int count = 0; int m = atoi(argv[1]); // число элСмСнтов мноТСства int n = atoi(argv[2]); // Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 1..n intset s(m,n);

while (countΒ«m) (* int t = randint(n); if (s.member(t)==0) (* s.insert(t); count++; *) *)

print_in_order( amp;s); *)

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ трСбуСтся Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, счСчик числа ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², argc, Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π²Π½ΡΡ‚ΡŒΡΡ Ρ‚Ρ€Π΅ΠΌ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ всСгда пСрСдаСтся ΠΊΠ°ΠΊ argv[0]. Ѐункция

extern int atoi(char*);

функция atoi() это стандартная библиотСчная функция для прСобразования прСдставлСния Ρ†Π΅Π»ΠΎΠ³ΠΎ Π² Π²ΠΈΠ΄Π΅ строки Π² Π΅Π³ΠΎ Π²Π½ΡƒΡ€Π΅Π½Π½ΡŽΡŽ (Π΄Π²ΠΎΠΈΡ‡Π½ΡƒΡŽ) Ρ„ΠΎΡ€ΠΌΡƒ. Π‘Π»ΡƒΡ‡Π°ΠΉΠ½Ρ‹Π΅ числа Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с ΠΏΠΌΠΎΡ‰ΡŒΡŽ стандартной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ rand():