╤σ≡Γσ≡ ╚φ⌠ε≡∞α÷Φεφφ√⌡ ╥σ⌡φεδεπΦΘ ±εΣσ≡µΦ≥ ∞ε≡σ(!) αφαδΦ≥Φ≈σ±ΩεΘ Φφ⌠ε≡∞α÷ΦΦ |
╤σ≡Γσ≡ ∩εΣΣσ≡µΦΓασ≥± |
---|
┬ ²≥εΘ πδαΓσ ε∩Φ±√Γα■≥± Γετ∞εµφε±≥Φ ε∩≡σΣσδσφΦ φεΓ√⌡ ≥Φ∩εΓ Γ C++, Σδ Ωε≥ε≡√⌡ Σε±≥≤∩ Ω Σαφφ√∞ επ≡αφΦ≈σφ ταΣαφφ√∞ ∞φεµσ±≥Γε∞ ⌠≤φΩ÷ΦΘ Σε±≥≤∩α. ╬ß· ±φ ■≥± ±∩ε±εß√ τα∙Φ≥√ ±≥≡≤Ω≥≤≡√ Σαφφ√⌡, σσ ΦφΦ÷ΦαδΦτα÷ΦΦ, Σε±≥≤∩α Ω φσΘ Φ, φαΩεφσ÷, σσ ≤φΦ≈≥εµσφΦ . ╧≡Φ∞σ≡√ ±εΣσ≡µα≥ ∩≡ε±≥√σ Ωδα±±√ Σδ ≡αßε≥√ ± ≥αßδΦ÷σΘ Φ∞σφ, ∞αφΦ∩≤δ ÷ΦΦ ±≥σΩε∞, ≡αßε≥≤ ± ∞φεµσ±≥Γε∞ Φ ≡σαδΦτα÷Φ■ ΣΦ±Ω≡Φ∞ΦφΦ≡≤■∙σπε (≥ε σ±≥ⁿ, "φαΣσµφεπε") εß·σΣΦφσφΦ . ─Γσ ±δσΣ≤■∙Φσ πδαΓ√ Σε∩εδφ ≥ ε∩Φ±αφΦσ Γετ∞εµφε±≥σΘ ε∩≡σΣσδσφΦ φεΓ√⌡ ≥Φ∩εΓ Γ C++ Φ ∩ετφαΩε∞ ≥ ≈Φ≥α≥σδ σ∙σ ± φσΩε≥ε≡√∞Φ Φφ≥σ≡σ±φ√∞Φ ∩≡Φ∞σ≡α∞Φ.
╧≡σΣφατφα≈σφΦσ ∩εφ ≥Φ Ωδα±±α, Ωε≥ε≡ε∞≤ ∩ε±Γ ∙σφ√ ²≥α Φ ΣΓσ
∩ε±δσΣ≤■∙Φσ πδαΓ√, ±ε±≥εΦ≥ Γ ≥ε∞, ≈≥εß√ ∩≡σΣε±≥αΓΦ≥ⁿ ∩≡επ≡α∞∞Φ±≥≤
Φφ±≥≡≤∞σφ≥ Σδ ±ετΣαφΦ φεΓ√⌡ ≥Φ∩εΓ, ±≥εδⁿ µσ ≤Σεßφ√⌡ Γ εß≡α∙σφΦΦ
±Ωεδⁿ Φ Γ±≥≡εσφφ√σ ≥Φ∩√. ┬ ΦΣσαδσ ≥Φ∩, ε∩≡σΣσδ σ∞√Θ ∩εδⁿτεΓα≥σδσ∞,
±∩ε±εßε∞ Φ±∩εδⁿτεΓαφΦ φσ Σεδµσφ ε≥δΦ≈α≥ⁿ± ε≥ Γ±≥≡εσφφ√⌡ ≥Φ∩εΓ,
≥εδⁿΩε ±∩ε±εßε∞ ±ετΣαφΦ .
╥Φ∩ σ±≥ⁿ ΩεφΩ≡σ≥φεσ ∩≡σΣ±≥αΓδσφΦσ φσΩε≥ε≡εΘ Ωεφ÷σ∩÷ΦΦ (∩εφ ≥Φ ).
═α∩≡Φ∞σ≡, Φ∞σ■∙ΦΘ± Γ C++ ≥Φ∩ float ± σπε ε∩σ≡α÷Φ ∞Φ +, -, * Φ ≥.Σ.
εßσ±∩σ≈ΦΓασ≥ επ≡αφΦ≈σφφ≤■, φε ΩεφΩ≡σ≥φ≤■ Γσ≡±Φ■ ∞α≥σ∞α≥Φ≈σ±Ωεπε
∩εφ ≥Φ ΣσΘ±≥ΓΦ≥σδⁿφεπε ≈Φ±δα. ═εΓ√Θ ≥Φ∩ ±ετΣασ≥± Σδ ≥επε, ≈≥εß√
Σα≥ⁿ ±∩σ÷Φαδⁿφεσ Φ ΩεφΩ≡σ≥φεσ ε∩≡σΣσδσφΦσ ∩εφ ≥Φ , Ωε≥ε≡ε∞≤ φΦ≈≥ε
∩≡ ∞ε Φ ε≈σΓΦΣφε ±≡σΣΦ Γ±≥≡εσφφ√⌡ ≥Φ∩εΓ φσ ε≥Γσ≈ασ≥. ═α∩≡Φ∞σ≡, Γ
∩≡επ≡α∞∞σ, Ωε≥ε≡α ≡αßε≥ασ≥ ± ≥σδσ⌠εφε∞, ∞εµφε ß√δε ß√ ±ετΣα≥ⁿ ≥Φ∩
trunk_module (²δσ∞σφ≥ δΦφΦΦ), α Γ ∩≡επ≡α∞∞σ εß≡αßε≥ΩΦ ≥σΩ±≥εΓ - ≥Φ∩
list_of_paragraphs (±∩Φ±εΩ ∩α≡απ≡α⌠εΓ). ╩αΩ ∩≡αΓΦδε, ∩≡επ≡α∞∞≤, Γ
Ωε≥ε≡εΘ ±ετΣα■≥± ≥Φ∩√, ⌡ε≡ε°ε ε≥Γσ≈α■∙Φσ ∩εφ ≥Φ ∞ ∩≡ΦδεµσφΦ ,
∩εφ ≥ⁿ δσπ≈σ, ≈σ∞ ∩≡επ≡α∞∞≤, Γ Ωε≥ε≡εΘ ²≥ε φσ Σσδασ≥± . ╒ε≡ε°ε
Γ√ß≡αφφ√σ ≥Φ∩√, ε∩≡σΣσδ σ∞√σ ∩εδⁿτεΓα≥σδσ∞, Σσδα■≥ ∩≡επ≡α∞∞≤ ßεδσσ
≈σ≥ΩεΘ Φ Ωε≡ε≥ΩεΘ. ▌≥ε ≥αΩµσ ∩ετΓεδ σ≥ Ωε∞∩Φδ ≥ε≡≤ εßφα≡≤µΦΓα≥ⁿ
φσΣε∩≤±≥Φ∞√σ Φ±∩εδⁿτεΓαφΦ εß·σΩ≥εΓ, Ωε≥ε≡√σ Γ ∩≡ε≥ΦΓφε∞ ±δ≤≈ασ
ε±≥αφ≤≥± φσεßφα≡≤µσφφ√∞Φ Σε ≥σ±≥Φ≡εΓαφΦ ∩≡επ≡α∞∞√.
┬ ε∩≡σΣσδσφΦΦ φεΓεπε ≥Φ∩α ε±φεΓφα ΦΣσ - ε≥ΣσδΦ≥ⁿ φσ±≤∙σ±≥Γσφφ√σ
∩εΣ≡εßφε±≥Φ ≡σαδΦτα÷ΦΦ (φα∩≡Φ∞σ≡, ⌠ε≡∞α≥ Σαφφ√⌡, Ωε≥ε≡√σ
Φ±∩εδⁿτ≤■≥± Σδ ⌡≡αφσφΦ εß·σΩ≥α ≥Φ∩α) ε≥ ≥σ⌡ Ωα≈σ±≥Γ, Ωε≥ε≡√σ
±≤∙σ±≥Γσφφ√ Σδ σπε ∩≡αΓΦδⁿφεπε Φ±∩εδⁿτεΓαφΦ (φα∩≡Φ∞σ≡, ∩εδφ√Θ
±∩Φ±εΩ ⌠≤φΩ÷ΦΘ, Ωε≥ε≡√σ Φ∞σ■≥ Σε±≥≤∩ Ω Σαφφ√∞). ╥αΩεσ ≡ατΣσδσφΦσ
∞εµφε ε∩Φ±α≥ⁿ ≥αΩ, ≈≥ε ≡αßε≥α ±ε ±≥≡≤Ω≥≤≡εΘ Σαφφ√⌡ Φ Γφ≤≥≡σφφΦ∞Φ
αΣ∞ΦφΦ±≥≡α≥ΦΓφ√∞Φ ∩εΣ∩≡επ≡α∞∞α∞Φ ε±≤∙σ±≥Γδ σ≥± ≈σ≡στ ±∩σ÷Φαδⁿφ√Θ
Φφ≥σ≡⌠σΘ± (ΩαφαδΦ≡≤σ≥± ).
▌≥α πδαΓα ±ε±≥εΦ≥ Φτ ≈σ≥√≡σ⌡ ∩≡αΩ≥Φ≈σ±ΩΦ ε≥Σσδⁿφ√⌡ ≈α±≥σΘ:
5.2.1 ╘≤φΩ÷ΦΦ ╫δσφ√ | |
5.2.2 ╩δα±±√ | |
5.2.3 ╤±√δΩΦ φα ╤σß | |
5.2.4 ╚φΦ÷ΦαδΦτα÷Φ | |
5.2.5 ╬≈Φ±≥Ωα | |
5.2.6 Inline |
╩δα±± - ²≥ε ε∩≡σΣσδ σ∞√Θ ∩εδⁿτεΓα≥σδσ∞ ≥Φ∩. ▌≥ε≥ ≡ατΣσδ τφαΩε∞Φ≥ ± ε±φεΓφ√∞Φ ±≡σΣ±≥Γα∞Φ ε∩≡σΣσδσφΦ Ωδα±±α, ±ετΣαφΦ εß·σΩ≥α Ωδα±±α, ≡αßε≥√ ± ≥αΩΦ∞Φ εß·σΩ≥α∞Φ Φ, φαΩεφσ÷, ≤φΦ≈≥εµσφΦ ≥αΩΦ⌡ εß·σΩ≥εΓ ∩ε±δσ Φ±∩εδⁿτεΓαφΦ .
╨α±±∞ε≥≡Φ∞ ≡σαδΦτα÷Φ■ ∩εφ ≥Φ Σα≥√ ± Φ±∩εδⁿτεΓαφΦσ∞ 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 ) { // Σσδασ≥ ±δεµφ≤■ ≈α±≥ⁿ ≡αßε≥√ } }
╬∩Φ±αφΦσ date Γ ∩≡σΣ√Σ≤∙σ∞ ∩εΣ≡ατΣσδσ Σασ≥ ∞φεµσ±≥Γε ⌠≤φΩ÷ΦΘ Σδ ≡αßε≥√ ± date, φε φσ ≤Ωατ√Γασ≥, ≈≥ε ²≥Φ ⌠≤φΩ÷ΦΦ Σεδµφ√ ß√≥ⁿ σΣΦφ±≥Γσφφ√∞Φ Σδ Σε±≥≤∩α Ω εß·σΩ≥α∞ ≥Φ∩α date. ▌≥ε επ≡αφΦ≈σφΦσ ∞εµφε φαδεµΦ≥ⁿ Φ±∩εδⁿτ≤ Γ∞σ±≥ε struct class:
class date { int month, day, year; public: void set(int, int, int); void get(int*, int*, int*); void next(); void print(); };
void date::ptinr() // ∩σ≈α≥ασ≥ Γ τα∩Φ±Φ, ∩≡Φφ ≥εΘ Γ ╤╪└ { cout << month << "/" << day << "/" year; }
void backdate() { today.day--; // ε°ΦßΩα }
┬ ⌠≤φΩ÷ΦΦ ≈δσφσ φα ≈δσφ√ εß·σΩ≥α, Σδ Ωε≥ε≡επε εφα ß√δα Γ√τΓαφα, ∞εµφε ±±√δα≥ⁿ± φσ∩ε±≡σΣ±≥Γσφφε. ═α∩≡Φ∞σ≡:
class x { int m; public: int readm() { return m; } }; x aa; x bb; void f() { int a = aa.readm(); int b = bb.readm(); // ... }
x* this;
class x { int m; public: int readm() { return this->m; } };
class dlink { dlink* pre; // ∩≡σΣ°σ±≥Γ≤■∙ΦΘ dlink* suc; // ±δσΣ≤■∙ΦΘ public: void append(dlink*); // ... }; void dlink::append(dlink* p) { p->suc = suc; // ≥ε σ±≥ⁿ, p->suc = this->suc p->pre = this; // Γφεσ Φ±∩εδⁿτεΓαφΦσ this suc->pre = p; // ≥ε σ±≥ⁿ, this->suc->pre = p suc = p; // ≥ε σ±≥ⁿ, this->suc = p } dlink* list_head; void f(dlink*a, dlink *b) { // ... list_head->append(a); list_head->append(b); }
╚±∩εδⁿτεΓαφΦσ Σδ εßσ±∩σ≈σφΦ ΦφΦ÷ΦαδΦτα÷ΦΦ εß·σΩ≥α Ωδα±±α ⌠≤φΩ÷ΦΘ Γ≡εΣσ set_date() (≤±≥αφεΓΦ≥ⁿ Σα≥≤) φσ²δσπαφ≥φε Φ ≈≡σΓα≥ε ε°ΦßΩα∞Φ. ╧ε±ΩεδⁿΩ≤ φΦπΣσ φσ ≤≥Γσ≡µΣασ≥± , ≈≥ε εß·σΩ≥ Σεδµσφ ß√≥ⁿ ΦφΦ÷ΦαδΦτΦ≡εΓαφ, ≥ε ∩≡επ≡α∞∞Φ±≥ ∞εµσ≥ ταß√≥ⁿ ²≥ε ±Σσδα≥ⁿ, ΦδΦ (≈≥ε ∩≡ΦΓεΣΦ≥, ΩαΩ ∩≡αΓΦδε, Ω ±≥εδⁿ µσ ≡ατ≡≤°Φ≥σδⁿφ√∞ ∩ε±δσΣ±≥ΓΦ ∞) ±Σσδα≥ⁿ ²≥ε ΣΓαµΣ√. ┼±≥ⁿ ßεδσσ ⌡ε≡ε°ΦΘ ∩εΣ⌡εΣ: Σα≥ⁿ Γετ∞εµφε±≥ⁿ ∩≡επ≡α∞∞Φ±≥≤ ε∩Φ±α≥ⁿ ⌠≤φΩ÷Φ■, Γφε ∩≡σΣφατφα≈σφφ≤■ Σδ ΦφΦ÷ΦαδΦτα÷ΦΦ εß·σΩ≥εΓ. ╧ε±ΩεδⁿΩ≤ ≥αΩα ⌠≤φΩ÷Φ Ωεφ±≥≡≤Φ≡≤σ≥ τφα≈σφΦ Σαφφεπε ≥Φ∩α, εφα φατ√Γασ≥± Ωεφ±≥≡≤Ω≥ε≡ε∞. ╩εφ±≥≡≤Ω≥ε≡ ≡α±∩ετφασ≥± ∩ε ≥ε∞≤, ≈≥ε Φ∞σσ≥ ≥ε µσ Φ∞ , ≈≥ε Φ ±α∞ Ωδα±±. ═α∩≡Φ∞σ≡:
class date { // ... date(int, int, int); };
date today = date(23,6,1983); date xmas(25,12,0); // ±εΩ≡α∙σφφα ⌠ε≡∞α // (xmas - ≡εµΣσ±≥Γε) date my_burthday; // φσΣε∩≤±≥Φ∞ε, ε∩≤∙σφα ΦφΦ÷ΦαδΦτα÷Φ
class date { int month, day, year; public: // ... date(int, int, int); // Σσφⁿ ∞σ± ÷ πεΣ date(char*); // Σα≥α Γ ±≥≡εΩεΓε∞ ∩≡σΣ±≥αΓδσφΦΦ date(int); // Σσφⁿ, ∞σ± ÷ Φ πεΣ ±σπεΣφ °φΦσ date(); // Σα≥α ∩ε ≤∞εδ≈αφΦ■: ±σπεΣφ };
date today(4); date july4("╚■δⁿ 4, 1983"); date guy("5 ═ε "); date now; // ΦφΦ÷ΦαδΦτΦ≡≤σ≥± ∩ε ≤∞εδ≈αφΦ■
class date { int month, day, year; public: // ... date(int d =0, int m =0, int y =0); date(char*); // Σα≥α Γ ±≥≡εΩεΓε∞ ∩≡σΣ±≥αΓδσφΦΦ }; date::date(int d, int m, int y) { day = d ? d : today.day; month = m ? m : today.month; year = y ? y : today.year; // ∩≡εΓσ≡Ωα, ≈≥ε Σα≥α Σε∩≤±≥Φ∞α // ... }
date d = today; // ΦφΦ÷ΦαδΦτα÷Φ ∩ε±≡σΣ±≥Γε∞ ∩≡Φ±ΓαΦΓαφΦ
╬∩≡σΣσδ σ∞√Θ ∩εδⁿτεΓα≥σδσ∞ ≥Φ∩ ≈α∙σ Φ∞σσ≥, ≈σ∞ φσ Φ∞σσ≥, Ωεφ±≥≡≤Ω≥ε≡, Ωε≥ε≡√Θ εßσ±∩σ≈ΦΓασ≥ φαΣδσµα∙≤■ ΦφΦ÷ΦαδΦτα÷Φ■. ─δ ∞φεπΦ⌡ ≥Φ∩εΓ ≥αΩµσ ≥≡σß≤σ≥± εß≡α≥φεσ ΣσΘ±≥ΓΦσ, Σσ±≥≡≤Ω≥ε≡, ≈≥εß√ εßσ±∩σ≈Φ≥ⁿ ±εε≥Γσ≥±≥Γ≤■∙≤■ ε≈Φ±≥Ω≤ εß·σΩ≥εΓ ²≥επε ≥Φ∩α. ╚∞ Σσ±≥≡≤Ω≥ε≡α Σδ Ωδα±±α X σ±≥ⁿ ~X() ("Σε∩εδφσφΦσ Ωεφ±≥≡≤Ω≥ε≡α"). ┬ ≈α±≥φε±≥Φ, ∞φεπΦσ ≥Φ∩√ Φ±∩εδⁿτ≤■≥ φσΩε≥ε≡√Θ εß·σ∞ ∩α∞ ≥Φ Φτ ±ΓεßεΣφεΘ ∩α∞ ≥Φ (±∞. #3.2.6), Ωε≥ε≡√Θ Γ√Σσδ σ≥± Ωεφ±≥≡≤Ω≥ε≡ε∞ Φ ε±ΓεßεµΣασ≥± Σσ±≥≡≤Ω≥ε≡ε∞. ┬ε≥, φα∩≡Φ∞σ≡, ≥≡αΣΦ÷Φεφφ√Θ ±≥σΩεΓ√Θ ≥Φ∩, Φτ Ωε≥ε≡επε Σδ Ω≡α≥Ωε±≥Φ ∩εδφε±≥ⁿ■ Γ√ß≡ε°σφα εß≡αßε≥Ωα ε°ΦßεΩ:
class char_stack { int size; char* top; char* s; public: char_stack(int sz) { top=s=new char[size=sz]; } ~char_stack() { delete s; } // Σσ±≥≡≤Ω≥ε≡ void push(char c) { *top++ = c; } char pop() { return *--top;} }
void f() { char_stack s1(100); char_stack s2(200); s1.push('a'); s2.push(s1.pop()); char ch = s2.pop(); cout << chr(ch) << "\n"; }
╧≡Φ ∩≡επ≡α∞∞Φ≡εΓαφΦΦ ± Φ±∩εδⁿτεΓαφΦσ∞ Ωδα±±εΓ ε≈σφⁿ ≈α±≥ε
Φ±∩εδⁿτ≤σ≥± ∞φεπε ∞αδσφⁿΩΦ⌡ ⌠≤φΩ÷ΦΘ. ╧ε ±≤≥Φ, ΓστΣσ, πΣσ Γ
∩≡επ≡α∞∞σ ≥≡αΣΦ÷ΦεφφεΘ ±≥≡≤Ω≥≤≡√ ±≥ε δε ß√ ∩≡ε±≥ε ΩαΩεσ-φΦß≤Σⁿ
εß√≈φεσ Φ±∩εδⁿτεΓαφΦσ ±≥≡≤Ω≥≤≡√ Σαφφ√⌡, Σασ≥± ⌠≤φΩ÷Φ . ╥ε, ≈≥ε
ß√δε ±επδα°σφΦσ∞, ±≥αδε ±≥αφΣα≡≥ε∞, Ωε≥ε≡√Θ ≡α±∩ετφασ≥ Ωε∞∩Φδ ≥ε≡.
▌≥ε ∞εµσ≥ ±≥≡α°φε ∩εφΦτΦ≥ⁿ ²⌠⌠σΩ≥ΦΓφε±≥ⁿ, ∩ε≥ε∞≤ ≈≥ε ±≥εΦ∞ε±≥ⁿ
Γ√τεΓα ⌠≤φΩ÷ΦΦ (⌡ε≥ Φ ΓεΓ±σ φσ Γ√±εΩα ∩ε ±≡αΓφσφΦ■ ± Σ≡≤πΦ∞Φ
τ√Ωα∞Φ) Γ±σ ≡αΓφε φα∞φεπε Γ√°σ, ≈σ∞ ∩α≡α ±±√δεΩ ∩ε ∩α∞ ≥Φ,
φσεß⌡εΣΦ∞α Σδ ≥σδα ⌠≤φΩ÷ΦΦ.
╫≥εß√ ±∩≡αΓΦ≥ⁿ± ± ²≥εΘ ∩≡εßδσ∞εΘ, ß√δ ≡ατ≡αßε≥αφ α∩∩α≡α≥ 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.1 └δⁿ≥σ≡φα≥ΦΓφ√σ ╨σαδΦτα÷ΦΦ | |
5.3.2 ╟αΩεφ≈σφφ√Θ ╩δα±± |
╫≥ε ∩≡σΣ±≥αΓδ σ≥ ±εßεΘ ⌡ε≡ε°ΦΘ Ωδα±±? ═σ≈≥ε, Φ∞σ■∙σσ φσßεδⁿ°εσ Φ
⌡ε≡ε°ε ε∩≡σΣσδσφφεσ ∞φεµσ±≥Γε ΣσΘ±≥ΓΦΘ. ═σ≈≥ε, ≈≥ε ∞εµφε
≡α±±∞α≥≡ΦΓα≥ⁿ ΩαΩ "≈σ≡φ√Θ ∙ΦΩ", Ωε≥ε≡√∞ ∞αφΦ∩≤δΦ≡≤■≥ ≥εδⁿΩε
∩ε±≡σΣ±≥Γε∞ ²≥επε ∞φεµσ±≥Γα ΣσΘ±≥ΓΦΘ. ═σ≈≥ε, ≈ⁿσ ⌠αΩ≥Φ≈σ±Ωεσ
∩≡σΣ±≥αΓδσφΦσ ∞εµφε δ■ß√∞ ∞√±δΦ∞√∞ ±∩ε±εßε∞ Φτ∞σφΦ≥ⁿ, φσ ∩εΓδΦ Γ φα
±∩ε±εß Φ±∩εδⁿτεΓαφΦ ∞φεµσ±≥Γα ΣσΘ±≥ΓΦΘ. ═σ≈≥ε, ≈σπε ∞εµφε ⌡ε≥σ≥ⁿ
Φ∞σ≥ⁿ ßεδⁿ°σ εΣφεπε.
─δ Γ±σ⌡ ΓΦΣεΓ Ωεφ≥σΘφσ≡εΓ ±≤∙σ±≥Γ≤■≥ ε≈σΓΦΣφ√σ ∩≡Φ∞σ≡√: ≥αßδΦ÷√,
∞φεµσ±≥Γα, ±∩Φ±ΩΦ, ΓσΩ≥ε≡α, ±δεΓα≡Φ Φ ≥.Σ. ╥αΩεΘ Ωδα±± Φ∞σσ≥
ε∩σ≡α÷Φ■ "Γ±≥αΓΦ≥ⁿ", εß√≈φε εφ ≥αΩµσ Φ∞σσ≥ ε∩σ≡α÷ΦΦ Σδ ∩≡εΓσ≡ΩΦ
≥επε, ß√δ δΦ Γ±≥αΓδσφ Σαφφ√Θ ²δσ∞σφ≥. ┬ φσ∞ ∞επ≤≥ ß√≥ⁿ ΣσΘ±≥ΓΦ Σδ
ε±≤∙σ±≥ΓδσφΦ ∩≡εΓσ≡ΩΦ Γ±σ⌡ ²δσ∞σφ≥εΓ Γ ε∩≡σΣσδσφφε∞ ∩ε≡ ΣΩσ, Φ
Ω≡ε∞σ Γ±σπε ∩≡ε≈σπε, Γ φσ∞ ∞εµσ≥ Φ∞σ≥ⁿ± ε∩σ≡α÷Φ Σδ ≤ΣαδσφΦ
²δσ∞σφ≥α. ╬ß√≈φε Ωεφ≥σΘφσ≡φ√σ (≥ε σ±≥ⁿ, Γ∞σ∙α■∙Φσ) Ωδα±±√ Φ∞σ■≥
Ωεφ±≥≡≤Ω≥ε≡√ Φ Σσ±≥≡≤Ω≥ε≡√.
╤Ω≡√≥Φσ Σαφφ√⌡ Φ ∩≡εΣ≤∞αφφ√Θ Φφ≥σ≡⌠σΘ± ∞εµσ≥ Σα≥ⁿ Ωεφ÷σ∩÷Φ
∞εΣ≤δ (±∞. φα∩≡Φ∞σ≡ #4.4: ⌠αΘδ√ ΩαΩ ∞εΣ≤δΦ). ╩δα±±, εΣφαΩε,
Γδ σ≥± ≥Φ∩ε∞. ╫≥εß√ Φ±∩εδⁿτεΓα≥ⁿ σπε, φσεß⌡εΣΦ∞ε ±ετΣα≥ⁿ εß·σΩ≥√
²≥επε Ωδα±±α, Φ ≥αΩΦ⌡ εß·σΩ≥εΓ ∞εµφε ±ετΣαΓα≥ⁿ ±≥εδⁿΩε, ±ΩεδⁿΩε
φ≤µφε. ╠εΣ≤δⁿ µσ ±α∞ Γδ σ≥± εß·σΩ≥ε∞. ╫≥εß√ Φ±∩εδⁿτεΓα≥ⁿ σπε, σπε
φαΣε ≥εδⁿΩε ΦφΦ÷ΦαδΦτΦ≡εΓα≥ⁿ, Φ ≥αΩΦ⌡ εß·σΩ≥εΓ ≡εΓφε εΣΦφ.
╧εΩα ε∩Φ±αφΦσ ε≥Ω≡√≥εΘ ≈α±≥Φ Ωδα±±α Φ ε∩Φ±αφΦσ ⌠≤φΩ÷ΦΘ ≈δσφεΓ ε±≥α■≥± φσΦτ∞σφφ√∞Φ, ≡σαδΦτα÷Φ■ Ωδα±±α ∞εµφε ∞εΣΦ⌠Φ÷Φ≡εΓα≥ⁿ φσ ΓδΦ φα σσ ∩εδⁿτεΓα≥σδσΘ. ╩αΩ ∩≡Φ∞σ≡ ²≥επε ≡α±±∞ε≥≡Φ∞ ≥αßδΦ÷≤ Φ∞σφ, Ωε≥ε≡α Φ±∩εδⁿτεΓαδα±ⁿ Γ φα±≥εδⁿφε∞ ΩαδⁿΩ≤δ ≥ε≡σ Γ ├δαΓσ 3. ▌≥ε ≥αßδΦ÷α Φ∞σφ:
struct name { char* string; char* next; double value; };
// ⌠αΘδ table.h class table { name* tbl; public: table() { tbl = 0; } name* look(char*, int = 0); name* insert(char* s) { return look(s,1); } };
#include "table.h" table globals; table keywords; table* locals; main() { locals = new table; // ... }
#include 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; }
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; inext) { delete n->string; delete n; } delete tbl; }
#include 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; }
╧≡επ≡α∞∞Φ≡εΓαφΦσ ßστ ±Ω≡√≥Φ Σαφφ√⌡ (± ∩≡Φ∞σφσφΦσ∞ ±≥≡≤Ω≥≤≡)
≥≡σß≤σ≥ ∞σφⁿ°σΘ ∩≡εΣ≤∞αφφε±≥Φ, ≈σ∞ ∩≡επ≡α∞∞Φ≡εΓαφΦσ ±ε ±Ω≡√≥Φσ∞
Σαφφ√⌡ (± Φ±∩εδⁿτεΓαφΦσ∞ Ωδα±±εΓ). ╤≥≡≤Ω≥≤≡≤ ∞εµφε ε∩≡σΣσδΦ≥ⁿ φσ
±δΦ°Ωε∞ ταΣ≤∞√Γα ±ⁿ ε ≥ε∞, ΩαΩ σσ ∩≡σΣ∩εδαπασ≥± Φ±∩εδⁿτεΓα≥ⁿ. └
ΩεπΣα ε∩≡σΣσδ σ≥± Ωδα±±, Γ±σ ΓφΦ∞αφΦσ ±ε±≡σΣε≥α≈ΦΓασ≥± φα
εßσ±∩σ≈σφΦΦ φεΓεπε ≥Φ∩α ∩εδφ√∞ ∞φεµσ±≥Γε∞ ε∩σ≡α÷ΦΘ; ²≥ε Γαµφεσ
±∞σ∙σφΦσ αΩ÷σφ≥α. ┬≡σ∞ , ∩ε≥≡α≈σφφεσ φα ≡ατ≡αßε≥Ω≤ φεΓεπε ≥Φ∩α,
εß√≈φε ∞φεπεΩ≡α≥φε εΩ≤∩ασ≥± ∩≡Φ ≡ατ≡αßε≥Ωσ Φ ≥σ±≥Φ≡εΓαφΦΦ
∩≡επ≡α∞∞√.
┬ε≥ ∩≡Φ∞σ≡ ταΩεφ≈σφφεπε ≥Φ∩α 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& i) { i = 0; } int ok(int& i) { return i void error(char* s) { cerr << "set: " << s << "\n"; exit(1); }
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 maxsize) error("±δΦ∙Ωε∞ ∞φεπε ²δσ∞σφ≥εΓ"); int i = cursize-1; x[i] = t; while (i>0 && x[i-1]>x[i]) { int t = x[i]; // ∩σ≡σ±≥αΓΦ≥ⁿ x[i] Φ [i-1] x[i] = x[i-1]; x[i-1] = t; i--; } }
int intset::member(int t) // ΣΓεΦ≈φ√Θ ∩εΦ±Ω { int l = 0; int u = cursize-1; while (l <= u) { int m = (l+u)/2; if (t < x[m]) u = m-1; else if (t > x[m]) l = m+1; else return 1; // φαΘΣσφε } return 0; // φσ φαΘΣσφε }
class intset { // ... void iterate(int& i) { i = 0; } int ok(int& i) { return iiterate(var); while (set->ok(var)) cout << set->next(var) << "\n"; }