srep() { n = 1; } }; srep *p; public: string(const char *); // string x = "abc" string(); // string x; string(const string &); // string x = string ... string& operator=(const char *); string& operator=(const string &); ~string(); char& operator[](int i); friend ostream& operator<<(ostream&, const string&); friend istream& operator>>(istream&, string&); friend int operator==(const string &x, const char *s) { return strcmp(x.p->s,s) == 0; } friend int operator==(const string &x, const string &y) { return strcmp(x.p->s,y.p->s) == 0; } friend int operator!=(const string &x, const char *s) { return strcmp(x.p->s,s) != 0; } friend int operator!=(const string &x, const string &y) { return strcmp(x.p->s,y.p->s) != 0; } }; : string::string() { p = new srep; p->s = 0; } string::string(const string& x) { x.p->n++; p = x.p; } string::string(const char* s) { p = new srep; p->s = new char[ strlen(s)+1 ]; strcpy(p->s, s); } string::~string() { if (--p->n == 0) { delete[] p->s; delete p; } } . , : string& string::operator=(const char* s) { if (p->n > 1) { // p->n--; p = new srep; } else // delete[] p->s; p->s = new char[ strlen(s)+1 ]; strcpy(p->s, s); return *this; } string& string::operator=(const string& x) { x.p->n++; // ``st = st'' if (--p->n == 0) { delete[] p->s; delete p } p = x.p; return *this; } . ( << , ): ostream& operator<<(ostream& s, const string& x) { return s << x.p->s << " [" << x.p->n << "]\n"; } ($$10.3.1): istream& operator>>(istream& s, string& x) { char buf[256]; s >> buf; // : buf // . $$10.3.1 x = buf; cout << "echo: " << x << '\n'; return s; } . : void error(const char* p) { cerr << p << '\n'; exit(1); } char& string::operator[](int i) { if (i<0 || strlen(p->s)<i) error(" "); return p->s[i]; } . , . , done, , . . int main() { string x[100]; int n; cout << " \n"; for ( n = 0; cin>>x[n]; n++) { if (n==100) { error(" "); return 99; } string y; cout << (y = x[n]); if (y == "done") break; } cout << " \n"; for (int i=n-1; 0<=i; i--) cout << x[i]; return 0; } 7.12  , -, -. , , ($$R.12), , . , , , -. X: class X { // ... X(int); int m1(); int m2() const; friend int f1(X&); friend int f2(const X&); friend int f3(X); }; , X::m1() X::m2() X. X(int) , X::m1() X::m2(): void g() { 1.m1(); // : X(1).m1() 1.m2(); // : X(1).m2() } f1() ($$4.6.3), - const. f2() f3() : void h() { f1(1); // : f1(X(1)) f2(1); // : f2(X(1)); f3(1); // : f3(X(1)); } , , - const. , (=, *, ++ ..), . , , , const . , , (+, -, || ..). , - - - . , , . , m inv(m), m.inv(). , inv() m, , m, , inv() . - -. . , - . , . - , , - . , - . , - this. , , , . 7.13  , . , , . , , + , . . , , int, . . , , , , , , . 7.14  1. (*2) string. + += , " ". ? 2. (*1.5) (). 3. (*3) string , . , , . 4. (*2) string , , .. string , . 5. (*3) string , . , , . , . 6. (*4) string, : , (.. ) . 7. (*2) ? struct X { int i; X(int); operator+(int); }; struct Y { int i; Y(X); operator+(X); operator int(); }; extern X operator*(X,Y); extern int f(X); X x = 1; Y y = x; int i = 2; int main() { i + 10; y + 10; y + 10 * y; x + y + i; x * X +i; f(7); f(y); y + y; 106 + y; } X Y . , . 8. (*2) INT, int. : INT::operator int(). 9. (*1) RINT, int, , : + ( ), - ( ), *, / %. : RINT::operator int(). 10. (*3) LINT, RINT, 64 . 11. (*4) , . : , string. 12. (*2) , . : INT + -, ; int INT. , , , . 13. (*3) [12] . , , . , , . 14. (*2) complex ($$7.3), tiny ($$7.3.2) string ($$7.11), . -. . , . 5.3. 15. (*2) vec4 . operator[]. : +, -, *, /, =, +=, -=, *= /=. 16. (*3) mat4 vec4. operator[], vec4. . mat4 , . 17. (*2) vector, vec4, vector::vector(int). 18. (*3) matrix, mat4, matrix::matrix(int,int). 19. (*3) CheckedPtrToT $$7.10 . , , , : *, ->, =, ++ --. , . 20. (*1.5) $$7.7 , .  * 8.  - . , , , . , () , , , sort (). . , sort(). , . 8.1  , .. , - . , , - . 5 7 , , . , $$5.3.2 . , , . , , -. (.. ) . Vector $$1.4.3. stack () . . , . . 8.2  , , . , : template<class T> class stack { T* v; T* p; int sz; public: stack(int s) { v = p = new T[sz=s]; } ~stack() { delete[] v; } void push(T a) { *p++ = a; } T pop() { return *--p; } int size() const { return p-v; } }; . , . template<class T> , T, , . , T , . T , template<class T>. , T , . , sc T char. , , <>, ( ), . , sc stack<char>: stack<char> sc(100); // , stack<char> : class stack_char { char* v; char* p; int sz; public: stack_char(int s) { v = p = new char[sz=s]; } ~stack_char() { delete[] v; } void push(char a) { *p++ = a; } char pop() { return *--p; } int size() const { return p-v; } }; , - , , , ++. , , , , . , - , "" . , . , , , stack_char, , stack<T>. , , int shape*, , . stack, : stack<shape*> ssp(200); // stack<Point> sp(400); // Point void f(stack<complex>& sc) // ` // complex' { sc.push(complex(1,2)); complex z = 2.5*sc.pop(); stack<int>*p = 0; // p = new stack<int>(800); // // for ( int i = 0; i<400; i++) { p->push(i); sp.push(Point(i,i+400)); } // ... } - stack , . , stack : template<class T> class stack { T* v; T* p; int sz; public: stack(int); ~stack(); void push(T); T pop(); int size() const; }; - stack - , - , . , , . , : template<class T> void stack<T>::push(T a) { *p++ = a; } template<class T> stack<T>::stack(int s) { v = p = new T[sz=s]; } , stack<T> <T> , stack<T>::stack - . , , . stack<shape*>, stack<Point> stack<int>, stack<shape*> stack<Point>, push() stack<complex>, stack<int> stack<Point> pop() stack<complex>. -, : void stack<complex>::push(complex a) { *p++ = a; } - . , - , - . - , - . , . , . , . , , , , . , , , . 8.3  , , , . , ($$12.2). , . 8.3.1  , , . , . , . , . slink, : struct slink { slink* next; slink() { next = 0; } slink(slink* p) { next = p; } }; , , slink, : class slist_base { // ... public: int insert(slink*); // int append(slink*); // slink* get(); // // ... }; , , slink, slist_base. slist_base ( ) , . , , . , , . slist_base : void f() { slist_base slb; slb.insert(new slink); // ... slink* p = slb.get(); // ... delete p; } slink , . slist_base, , slink, . , name (), : class name : public slink { // ... }; void f(const char* s) { slist_base slb; slb.insert(new name(s)); // ... name* p = (name*)slb.get(); // ... delete p; } , slist_base slink, slink*, slist_base::get(), name*. . , slink , . slist_base: template<class T> class Islist : private slist_base { public: void insert(T* a) { slist_base::insert(a); } T* get() { return (T*) slist_base::get(); } // ... }; Islist::get() , Islist , T T . , slist_base Islist. , . Islist (intrusive singly linked list) . : void f(const char* s) { Islist<name> ilst; ilst.insert(new name(s)); // ... name* p = ilst.get(); // ... delete p } : class expr : public slink { // ... }; void g(expr* e) { Islist<name> ilst; ilst.insert(e); // : Islist<name>::insert(), // name* // ... } . -, ( , , Islist). -, , Islist . -, slist_base ( ), , , .. slist_base, . . , , . , . , , , . , Islist , slink. Islist int, - , slink. , , Islist ($$6.5.1). 8.3.2  "" . , , . , , : template<class T> struct Tlink : public slink { T info; Tlink(const T& a) : info(a) { } }; Tlink<T> T , slink. , info(a), info=a. , ($$7.11). (, String) Tlink(const T& a) { info = a; } , String, . , , Islist, : template<class T> class Slist : private slist_base { public: void insert(const T& a) { slist_base::insert(new Tlink<T>(a)); } void append(const T& a) { slist_base::append(new Tlink<T>(a)); } T get(); // ... }; template<class T> T Slist<T>::get() { Tlink<T>* lnk = (Tlink<T>*) slist_base::get(); T i = lnk->info; delete lnk; return i; } Slist , Ilist. , Slist , slink, : void f(int i) { Slist<int> lst1; Slist<int> lst2; lst1.insert(i); lst2.insert(i); // ... int i1 = lst1.get(); int i2 = lst2.get(); // ... } , , Islist, . , Slist Tlink, Slist Tlink, T. , . -, Tlink (. $$5.5.6). . -, , "" , , , : void f(name* p) { Islist<name> lst1; Slist<name*> lst2; lst1.insert(p); // `*p' lst2.insert(p); // `p' // // ... } , , . , . Slist insert(), Slist , , . , , . f() lst2. , Slist::insert() , insert(), , , ( ) : class smiley : public circle { /* ... */ }; void g1(Slist<circle>& olist, const smiley& grin) { olist.insert(grin); // ! } circle smiley. , , . , , "" : void g2(Slist<shape>& olist, const circle& c) { olist.insert(c); // : // } "" : void g3(Slist<shape*>& plist, const smiley& grin) { olist.insert(&grin); // } - : void g4(Slist<shape&>& rlist, const smiley& grin) { rlist.insert(grin); // : , // (shape&&) } , , . Slist::insert(T&); Slist::insert(shape&&); , . , : template<class T> class Splist : private Slist<void*> { public: void insert(T* p) { Slist<void*>::insert(p); } void append(T* p) { Slist<void*>::append(p); } T* get() { return (T*) Slist<void*>::get(); } }; class Isplist : private slist_base { public: void insert(T* p) { slist_base::insert(p); } void append(T* p) { slist_base::append(p); } T* get() { return (T*) slist_base::get(); } }; . , , , . , , , : typedef Slist< Slist<date> > dates; . > , , >> typedef Slist<Slist<date>> dates; . , typedef , . typedef , . , , , . , T T, : template<class T> class mytemplate { T ob; Slist<T> slst; // ... }; : template<class T, class Slist<t> > class mytemplate { T obj; Slist<T> slst; // ... }; $$8.6 $$R.14.2 , . 8.3.3  slist_base . . , get() . slist_handler(). , , 9. slist_base: class slist_base { slink* last; // last->next public: void insert(slink* a); // void append(slink* a); // slink* get(); // // void clear() { last = 0; } slist_base() { last = 0; } slist_base(slink* a) { last = a->next = a; } friend class slist_base_iter; }; insert append, : void slist_base_insert(slink* a) // { if (last) a->next = last->next; else last = a; last->next = a; } , last->next - . void slist_base::append(slink* a) // { if (last) { a->next = last->next; last = last->next = a; } else last = a->next = a; } slist* slist_base::get() // { if (last == 0) slist_handler(" "); slink* f = last->next; if (f== last) last = 0; else last->next = f->next; return f; } , slist_handler - , . slist_handler(" "); (*slist_handler)(" "); new_handler ($$3.2.6), , : typedef void (*PFV)(const c