void put(T); // overflow(T), T get(); // underflow(T), }; template<class T> class circular_buffer : public buffer<T> { //... int overflow(T); // , int underflow(); }; template<class T> class expanding_buffer : public buffer<T> { //... int overflow(T); // , int underflow(); }; - ($$10.5.3). 12.2.4  , X: [1] X. [2] X* X&. , : class X { //... public: X(int); //... }; class C { X a; X* p; public: C(int i, int j) : a(i), p(new X(j)) { } ~C() { delete p; } }; , X::a , , . $$12.4 $$13.9. , , , "-" "-". : class C2 { X* p; public: C(int i) : p(new X(i)) { } ~C() { delete p; } X* change(X* q) { X* t = p; p = q; return t; } }; , "-" : class C3 { X* p; public: C(X* q) : p(q) { } // ... } , , " ". . $$12.2.2, : . , . , . : class XX : public X { /*...*/ }; class XXX : public X { /*...*/ }; void f() { C3* p1 = new C3(new X); // C3 "" X C3* p2 = new C3(new XX); // C3 "" XX C3* p3 = new C3(new XXX); // C3 "" XXX //... } C3 X, C3, X, . , , , Shape ($$1.1.2.5), ($$13.3). , , -, - , : class C4 { X& r; public: C(X& q) : r(q) { } // ... }; 12.2.5  , , . D B, , D B: class B { /* ... */ ; class D : public B /* ... */ }; // D B : - "", , D B, - D B. , D B, , D "" B: class D { // D B // ... public: B b; // ... }; , - "" D B : D B. B D, ? . : . , "" , "" . , , "" . ( , ), , . " ..?" . , . , , , . , , , . , , , . : class B { public: virtual void f(); void g(); }; class D1 { // D1 B public: B b; void f(); // b.f() }; void h1(D1* pd) { B* pb = pd; // : D1* B* pb = &pd->b; pb->q(); // B::q pd->q(); // : D1 q() pd->b.q(); pb->f(); // B::f ( D1::f ) pd->f(); // D1::f } , , , , . , : class D2 : public B { // D2 B public: void f(); // B::f() }; void h2(D2* pd) { B* pb = pd; // : D2* B* pb->q(); // B::q pd->q(); // B::q pb->f(); // : D2::f pd->f(); // D2::f } , D2, D1, , . , B D2 (. $$12.2.3). , D2 B. , . , "", , . , , , . cfield (controled field - ), , , field. cfield field: class cfield : public field { // ... }; , cfield, , field, , field cfield, , , cfield field. , cfield* field*, cfield, field: void q(cfield* p) { *p = "asdf"; // field // cfield: // p->cfield::operator=("asdf") field* q = p; // cfield* field* *q = "asdf"; // ! } cfield , field , cfield field. private ( ): class cfield : private field { /* ... */ } , ( ) , . , , , ($$13.3). , , , , " ", , . " ". , ( ), . : . horizontal_scrollbar vertical_scrollbar scrollbar, , , . , , - scrollbar, . scrollbar , . , : enum orientation { horizontal, vertical }; , , . , . , ( ), , , , . , " " ( ) . , . " ", - " ", - " ". - , , , , . , , , , : _ _ _ " ". - . , : . , . , , . , . , : void helper(orientation oo) { //... p = new scrollbar(oo); //... } void me() { helper(horizontal); } . , . , , . . window_with_scrollbar (__) , window scrollbar, : class window_with_scrollbar : public window, public scrollbar { // ... }; window_with_scrollbar window, scrollbar, scrollbar. , , window_with_scrollbar window, scrollbar, : class window_with_scrollbar : public window { // ... scrollbar* sb; public: window_with_scrollbar(scrollbar* p, /* ... */) : window(/* ... */), sb(p) { // ... } // ... }; . (window) . , window_with_scrollbar scrollbar, : window_with_scrollbar :: operator scrollbar&() { return *sb; } 12.2.6  , . ++ . , - , ++, . (, , ). , X Y: - X Y - X Y - X - Y - X Y - X Y - X Y - X auto static Y - X Y new - X Y , . , Y, , Y* , Y: class Y; // Y - Y* p; extern Y f(const Y&); Y new , ++, Y new Y. . ++ , , . , , , , #include. , , , . , , , . , , , . 12.2.7  , , ($$11.3.3.2), , . : ++ , , . , "" , . , . ( ), , , . , " ", , $$12.2.4. $$7.6: class String { int sz; char* p; public: String(const char* q); ~String(); //... }; String : 12.2.7.1  , , ( ). - : (), , . , , . - , . , . , . , String::String(const char*) , p , , sz , sz v[sz-1]==0. . , , . , , , . "" , , . , . , , , . , , - -, 20 . C++. , - . , , , . . ++? - , , . : class String { int sz; int* p; public: class Range {}; class Invariant {}; void check(); String(const char* q); ~String(); char& operator[](int i); int size() { return sz; } //... }; void String::check() { if (p==0 || sz<0 || TOO_LARGE<=sz || p[sz-1]) throw Invariant; } char& String::operator[](int i) { check(); // if (i<0 || i<sz) throw Range; // check(); // return v[i]; } . String . : inline void String::check() { if (!NDEBUG) if (p==0 || sz<0 || TOO_LARGE<=sz || p[sz]) throw Invariant; } NDEBUG, , assert(). NDEBUG , . , check() , , , NDEBUG , . Assert() , : template<class T, class X> inline void Assert(T expr,X x) { if (!NDEBUG) if (!expr) throw x; } x, expr , NDEBUG. Assert() : class Bad_f_arg { }; void f(String& s, int i) { Assert(0<=i && i<s.size(),Bad_f_arg()); //... } Assert() assert() . i , Bad_f_arg. - . , , , , . .8 $$13.11. , "" . . , , , , . , , . , . $$11.3.3.5, . . , , , , . . , , , . 12.2.7.2  , ++ , , , ( ). : class list { list* next; public: int on(list*); }; int list::on(list* p) { list* q = this; for(;;) { if (p == q) return 1; if (q == 0) return 0; q = q->next; } } list::next , list::on() list, . , , - , : int list::on(list* p) { if (p == this) return 1; if (p == 0) return 0; return next->on(p); } , , . 12.2.8  . , , , . , , , , A, p B, . ++ . , ++, : class A { B* p; //... void f(); void ff(); }; class B { //... void f(); void g(); void h(); }; , A A::p, : class A { B* p; // p //... void f(); void ff(); void g() { p->g(); } // q() void h() { p->h(); } // h() }; , , . "" , . , "" B A A::p B*. - , , . , , . , , : X::operator Y() , , Y, X. Y::Y(X). , ( ) , . Y - , Y. , , , . , . , , , , . : class Big_int { //... friend Big_int operator+(Big_int,Big_int); //... operator Rational(); //... }; class Rational { //... friend Rational operator+(Rational,Rational); //... operator Big_int(); }; Rational Big_int , : void f(Rational r, Big_int i) { //... g(r+i); // , : // operator+(r,Rational(i)) // operator+(Big_int(r),i) g(r,Rational(i)); // g(Big_int(r),i); // } "" , . , Big_int Rational make_Rational() , g(BIg_int(r),i). "" , ( ), ( +). 12.3  ++ , , .. . , ( ..) . (), , (), . , , , , , " " . . , ++ , "" , .. , ++ . , f() v. f v . , , "" : - f v f v, " " . : [1] "" , . [2] , , (static). [3] , , , . , : // compX, // compX: extern void compX_f(T2*, const char*); extern T3 compX_v; // ... compX_f compX_v , , , , , , . , . , . , : // compX: static void compX_f(T2* a1, const char *a2) { /* ... */ } static T3 compX_v; // ... , , , , , , . , ++ . . : class compX_details { // compX public: static void f(T2*, const char*); static T3 v; // ... }; compX_details , . , . , "" , : class compX_details { // compX. public: // ... class widget { // ... }; // ... }; , widget . , , , , , . , , , , , , , . , , , : class Car { class Wheel { // ... }; Wheel flw, frw, rlw, rrw; // ... }; (Car) ( Wheel), , . , Wheel , Car: class Wheel { // ... }; class Car { Wheel flw, frw, rlw, rrw; // ... }; ? . , . , , . , , , . . . , , . , , , . , , "" "" , . , , ($$6.5.4). , . . 12.4  - , - , - , - , - , - , - . , , , , : class X { // Y a; Z b; public: void f(const char* ...); void g(int[],int); void set_a(Y&); Y& get_a(); }; : - Y Z , Y Z . - X::f (, - " ", ). - X::g int[]. , , . , . - set_a() get_a(), , X, X::a. - . , - . , . : . ++ . ( private protected), , () , .. , . Y Z , , Y Z. , complex String, . , . Y Z (, ), . , : class X { Y* a; Z& b; // ... }; X Y Z, .. X Y Z. X, , - Y Z, X. : , ( ), , , . , X Y Z. , - X, Y Z, Y Z . . , . ,