mp; from) { // X } R.13.4.4  : - ( - opt ) , - , - ( ), - . , , operator(), x(arg1,arg2,arg3) x x.operator()(arg1,arg2,arg3). operator() - x. R.13.4.5  , : - [ ] . x[y] x x.operator[](y). operator[] - x. R.13.4.6  ->: - -> - . x x->m (x.operator->())->m. , operator->() , , , operator->(). - . R.13.4.7  operator++ ++. operator++ ++. ++ int, , , operator++ , . : class X { public: X operator++(); // ++a X operator++(int) // a++ }; void f(X a) { ++a; // a.operator++(); a++; // a.operator++(0); a.operator++(); // : ++a; a.operator++(0); // : a++; } -- . R.14 R.14.1 . --: template < ---> ---: -- --- , -- --: - - -: class -- . - - . . -- . . R.14.2  , , . vector : template<class T> class vector { T* v; int sz; public: vector(int); T& operator[](int); T& elem(int i) { return v[i] } // ... }; template<class T> , , - T, , vector - T. --: --: -- < --- > ---: -- --- , -- -: - -- - ($$R.9). , , , - --, . $$R.14.5. -- -- , . , , , , . , --- --, , --- -. ( , , - .) --- : -, , , . , , ($$R.13.2). vector: vector<int> v1(20); vector<complex> v2(30); typedef vector<complex> cvec; // cvec // vector<complex> cvec v3(40); // v2 v3 v1[3] = 7; v2[3] = v3.elem(4) = complex(7,8); vector<int> vector<complex> , vector. -- -, , -, : class vector<Shape*> vector<Window>* current_window; class svector : public vector<Shape*> { /* ... */ }; - $$R.14.6. R.14.3  -- , . , x y , z: template<class E, int size> class buffer; buffer<char, 2*512> x; buffer<char,1024> y; buffer<char,512> z; , x2 x3. x1 x4: template<class T, void(*err_fct)()> class list { /* ... */ }; list<int,&error_handler1> x1; list<int,&error_handler2> x2; list<int,&error_handler2> x3; list<char,&error_handler2> x4; R.14.4  . , sort : template<class T> void sort(vector<T>); . , , . , , , . $$R.14.5. , . : vector<complex> cv(100); vector<int> ci(200); void f(vector<complex>& cv, vector<int>& ci) { sort(cv); // sort(vector<complex>) sort(ci); // sort(vector<int>) } , . : [1] ($$R.13.2) , , . [2] , . , . [3] ($$R.13.2). , . , . , , . [2] ($$R.14.5), , . ($$R.13.2). ($$R.13.3). : template<class T> T max(T a, T b) { return a>b?a:b; }; void f(int a, int b, char c, char d) { int m1 = max(a,b); // max(int a, int b) char m2 = max(c,d); // max(char c, char b) int m3 = max(a,c); // : max(int,char) } int max(int,int); , , char int, max(a,c). . . --, --- . template<class T> T* create(); // template<class T> void f() { // T a; // ... } --, , -. R.14.5  . . , . -- . . : . , , , . , , . () , , . : template<class T> void sort(vector<T>& v) { /* ... */ } void sort(vector<char*>& v) { /* ... */ } sort sort, vector<char*>. vector . , , : template<class T> class stream { /* ... */ }; class stream<char> { /* ... */ }; (stream<char>). , . , , , . , , . R.14.6 -  - , - . , : template<class T> class vector { T* v; int sz; public: vector(int); T& operator[](int); T& elem(int i) { return v[i]; } // ... }; , , : template<class T> T& vector<T>::operator[](int i) { if (i<0 || sz>=i) error("vector: range error"); return v[i]; } vector<T>::operator[]() vector, . vector<int> v1(20); vector<complex> v2(30); v1[3] = 7; // vector<int>::operator[]() v2[3] = complex(7,8); // vector<complex>::operator[]() R.14.7  - , : template<class T> class task { // ... friend void next_time(); friend task<T>* preempt(task<T>*); friend task* prmt(task*); // // ... }; next_time() task, task preempt() c . preempt() . template<class T> task<T>* preempt(task<T>* t) { /* ... */ } prmt() , task , task<int>, task<record>, .. R.14.8  , , . : template<class T> class X { static T s; // ... }; X<int> aa; X<char*> bb; X<int> int, X<char> char*. , , f(int*) s int, f(char**) char**: template<class T> f(T* p) { static T s; // ... } void g(int a, char* b) { f(&a); f(&b); } R.15  R.15.1  . . -, - , -. -: try - - -: - opt : catch ( -- ) - --: -- -- - -- ... -: throw opt - ($$R.6), - - void ($$R.5). - " ", , -, , " . , . R.15.2  . , , . , throw "Help!"; char*: try { // ... } catch(const char* p) { // } Overflow (): class Overflow { // ... public: Overflow(char,double,double); }; void f(double x) { // ... throw Overflow('+',x,3.45e107); } try { // ... f(1.2); // ... } catch(Overflow& oo) { // Overflow } . "" - , - . "" $$R.15.4. - , throw, , , . (. $$R.15.4) , throw ($$R.5.2.2) return. , ($$R.12.1), , . - , . - , . , , , , : try { // ... } catch (...) { // // () throw; // } R.15.3  , , -. , . , , . , - -, " ". R.15.4  T, const T, T& const& -, E, : [1] T E ; [2] T ($$R.4.6) E ; [3] T , E , T ($$R.4.6). : class Matherr { /* ... */ virtual vf(); }; class Overflow : public Matherr { /* ... */ }; class Underflow : public Matherr { /* ... */ }; class Zerodivide : public Matherr { /* ... */ }; void f() { try { g(); } catch (Overflow oo) { // ... } catch (Matherr mm) { // ... } } Overflow Overflow, Matherr Matherr , Matherr, Underflow Zerodivide. - . , , . ... -- , , . , -. - , -. , terminate() ($$R.15.7). . " ". R.15.5  . , , . -- . --: throw ( - opt ) -: - - , - : void f() throw (X,Y) { // ... } , unexpected(), . $$R.15.8. , , - . . , --, . -- (throw()) . X, , X. -- . R.15.6  : terminate() unexpected(). R.15.6.1 terminate() , : - ; - ; - , , , . void terminate(); , set_terminate(): typedef void(*PFV)(); PFV set_terminate(PFV); , set_terminate(), . . terminate() abort(). terminate() , , , . R.15.6.2 unexpected() , --, , void unexpected(); , set_unexpected(): typedef void(*PFV)(); PFV set_unexpected(PFV); , set_unexpected(), . . unexpected() terminate(). terminate() abort(), . R.15.7  catch , , catch. , , throw. R.16  ++ , . , # ( ). , . , ( ++) ($$R.2). , , , . , , . . : ($$R.2.1), , #include , . R.16.1  . , , . . , , , . . () ($$R.16.2). : , . , . . . . , ($$R.16.3, $$R.16.4, $$R.16.5, $$R.16.6, $$R.16.7 $$R.16.8). ($$R.2.5.2). . , , . R.16.2  - , . ??= # ??( [ ??/ \ ??) [ ??' ^ ??! | , ??=define arraycheck(a,b) a??(b??) ??!??! b??(a??) #define arraycheck(a,b) a[b] || b[a] R.16.3  #define - . , , . , , . , #define SIDE 8 char chessboard[side][side]; char chessboard[8][8]; #define, , . , , . ( , ... ,) - "" . (. , , , , . , , . , , (, , , ), . , , . , , , . , . , , , . . . ( ) ($$R.16.3.3); , # ($$R.16.3.1), ## ($$R.16.3.2). . #define index_mask 0XFF00 #define extract(word,mask) word & mask index = extract(packed_data,index_mask); index = packed_data & 0XFF00; ($$R.16.3.3). R.16.3.1 # #, # , . , , \ " \. , #define path(logid,cmd) "/usr/" #logid "/bin/" #cmd char* mytool=path(joe,readmail); : char* mytool="/usr/" "joe" "/bin/" "readmail"; ($$R.16.1) : char* mytool="/usr/joe/bin/readmail"; R.16.3.2 ## , , ##, ## . , ## . , #define inherit(basenum) public Pubbase ## basenum, \ private Privbase ## basenum class D : inherit(1) { }; : class D : public Pubbase1, Privbase1 { }; , ##, , , . . : #define concat(a) a ## ball #define base B #define baseball sport concat(base) sport Bball R.16.3.3  , , . , . , . R.16.3.4 #undef ( ++) #undef. #undef : #undef "" . , #undef . R.16.4  : #include <> . . , : #include "" . () , . , , : #include <> , < > >. ', \, ", /* //, . , " ", > . ' \ /* //, . #include - , , , , . , . . #include , #include. #include , #include . R.16.5  . : : -if -elif opt -else opt -endif -if: -if -if: # if - # ifdef # ifndef -elif: -elif -elif -elif -elif: # elif - -else: -else -else: # else -endif: # endif #if #elif ( ) , . ++, , , . , . , , #elif #else (.. ++ ) . , . , #if #elif, , , #else. -, #if #elif defined, : defined defined () , #define, #undef, 1, 0. defined , . defined , . $$R.16.3. -, $$R.5.19 , int unsigned int long unsigned long , , sizeof . #ifdef #if defined #ifndef #if !defined , , , . R.16.6  , ++, : #line "" opt __LINE__ ($$R.16.10), ; : , . "", __FILE__ ($$R.16.10) . , __FILE__ . . R.16.7 error : #error - , . R.16.8 pragma : #pragma - "" . #pragma . R.16.9  # . R.16.10  . __LINE__ , ++. __FILE__ , . __DAT