/ X(int); }; class Y { /* ... */ Y(X); }; Y a = 1; // : Y(X(1)) // R.12.3.2  - X, , --: operator -- --: -- opt -ptr opt X , --. - . -- , -typedef, . : class X { // ... public: operator int(); }; void f(X a) { int i = int(a); i = (int)a; i = a; } X::operator int(). , : void g(X a, X b) { int i = (a) ? 1+a : 0; int j = (a&&b) ? a+b : i; if (a) { // ... } } . . ( ), : class X { // ... public: operator int(); }; class Y { // ... public: operator X(); }; Y a; int b = a; // : // a.operator X().operator int() int c = X(a); // : a.operator X().operator int() . , , : class X { public: // ... operator int(); }; class Y : public X { public: // ... operator void*(); }; void f(Y& a) { if (a) { // : } } R.12.4  - cl ~cl, cl , . ( void). . const volatile, ($$R.9.3.1). . . , - , , . public. , . , , , . , . , . , - . "-" , . , . . -, . $$R.12.7. . : (1) auto ($$R.3.5) ($$R.12.2, $$R.8.4.3); (2) ($$R.3.4) ($$R.3.5); (3) delete ($$R.5.3.4) , new ($$R.5.3.3); (4) . delete, ($$R.12.6.2) , delete() ($$R.5.3.4), : class X { // ... public: X(int); ~X(); }; void g(X*); void f() // { X* p = new X(111); // g(p); delete p; // } . , new. . : void* operator new(size_t, void* p) { return p; } void f(X* p); static char buf[sizeof(X)]; void g() // , { X* p = new(buf) X(222); // buf[] f(p); p->X::~X(); // } , , , , int* p; // ... p->int::~int(); , , . , , , . R.12.5  new, () operator new() ($$R.5.3.3). operator new() , 0. X X::operator new() , static. size_t, - , <stddef.h>, void*, : class X { // ... void* operator new(size_t); void* operator new(size_t, Arena*); }; operator new() $$R.5.3.3. X X::operator delete() , static. void* size_t. - void, : class X { // ... void operator delete(void*); }; class Y { // ... void operator delete(void*, size_t); }; operator delete(), . operator delete() void*. , , . ( ) () . , , , ( , , ) , . operator new() operator delete() ($$R.5.3.3, $$R.5.3.4). X::operator new() X::operator delete() , . operator delete(), , , : struct B { virtual ~B(); void* operator new(size_t); void operator delete(void*); }; struct D : B { ~D(); void* operator new(size_t); void operator delete(void*); }; void f() { B* p = new D; delete p; } D D::operator new(), , D::operator delete(). R.12.6  , , ($$R.8.4.1). ($$R.12.1). , . R.12.6.1  ($$R.12.1) , . , . , = . . , : class complex { // ... public: complex(); complex(double); complex(double,double); // ... }; complex sqrt(complex,complex); complex a(1); // // complex(double) complex b = a; // `a' complex c = complex(1,2); // complex(1,2) // complex(double,double) // `c' complex d = sqrt(b,c); // sqrt(complex,complex), // `d' complex e; // complex f = 3; // complex(3), // complex(double) // `f' = . , , T x = a; , new ($$R.5.3.3) , T x(a); ($$R.12.1) . , , , ($$R.12.1). , . : complex cc = { 1, 2 }; // : // complex v[6] = { 1,complex(1,2),complex(),2 }; v[0] v[3] complex::complex(double), v[1] complex::complex(double,double), v[2], v[4] v[5] complex::complex(). M X : (1) M ; (2) M ; (3) X -ctor ($$R.12.6.2) M. 2 . , . , , , . $$R.3.4, $$R.6.7, $$R.9.4. R.12.6.2  , . , , . -ctor -ctor: : -- --: - - , -- -: -- ( - opt ) . , const, : struct B1 { B1(int); /* ... */ }; struct B2 { B2(int); /* ... */ }; struct D : B1, B2 { D(int); B1 b; const c; }; D::D(int a) : B2(a+1), B1(a+2), c(a+3), b(a+4) { /* ... */ } D d(10); ( -), , D::D() ($$R.12.1). , , , . . , , - . "-" - , . , , . . . - , , . - , , . : class V { public: V(); V(int); // ... }; class A : public virtual V { public: A(); A(int); // ... }; class B : public virtual V { public: B(); B(int); // ... }; class C : public A, public B, private virtual V { public: C(); C(int); // ... }; A::A(int i) : V(i) { /* ... */ } B::B(int i) { /* ... */ } C::C(int i) { /* ... */ } V v(1); // use V(int) A a(2); // use V(int) B b(3); // use V() C c(4); // use V() - , . , class X { int a; public: const int& r; X()::r(a) { } }; X::r X X::a. R.12.7  -. , ( ) . , , . , . : class X { public: virtual void f(); X() { f(); } // X::f() ~X() { f(); } // X::f() }; class Y : public X { int& r; public: void f() { r++; // , `r' } Y(int& rr) ::r(rr) { } }; , ($$R.10.3). R.12.8  : ($$R.5.17), ($$R.12.1, $$R.8.4), ($$R.5.2.2) ($$R.6.6.3). X ($$R.12.1). , . , X . X , const, X const X& : X::X(const X&) , X&: X::X(X&) const X . , X , const, X const X& : X& X::operator=(const X&) , X&: X& X::operator=(X&) X const . , . , , . , , . : X M, M M . const, , , , operator=() , . , M , . , (.. ). , X::operator=() , , X X , X, X::operator=(). . , - X , X& , . X X::operator=(), X, . - , . : class X { // ... public: X(int); X(const X&, int = 1); }; X a(1); // X(int) X b(a,0); // X(const X&,int) X c = b; // X(const X&,int) X X::operator=(const X&). ($$R.12.3), , : class X { public: int b; }; class Y : public X { public: int c; }; void f() { X x1; Y y1; x1 = y1; // y1 = x1; // } y1.b x1.b, x1.c . . : struct s { virtual f(); // ... }; struct ss : public s { f(); // ... }; void f() { s a; ss b; a = b; // a.s::operator=(b) b = a; // a.f(); // s::f b.f(); // ss::f (s&)b = a; // a b // ((s&)b).s::operator=(a) b.f(); // ss::f } a.f() s::f() ( s ($$R.10.2)), b.f() ss::f() ( ss). R.13  , , . , : double abs(double); int abs(int); abs(1); // abs(int) abs(1.0); // abs(double) T T , T& , , , , , : int f(int i) { // ... } int f(int& r) // : { // // ... } , T T, const T volatile T , , , . , const T&, volatile T& T& , , . , , const T*, volatile T* T*. , . -, , ($$R.9.4). typedef , ($$R.7.1.3), , , typedef, . : typedef int Int; void f(int i) { /* ... */ } void f(Int i) { /* ... */ } // : f , , : enum E { a }; void f(int i) { /* ... */ } void f(E i) { /* ... */ } , , *, [], . , ($$R.8.2.4). : f(char*); f(char[]); // f(char*); f(char[7]); // f(char*); f(char[9]); // f(char*); g(char(*)[10]); g(char[5][10]); // g(char(*)[10]); g(char[7][10]); // g(char(*)[10]); g(char(*)[20]); // g(char(*)[10]); R.13.1  , ($$R.13). - , - . : class B { public: int f(int); }; class D : public B { public: int f(char*); }; D::f(char*) B::f(int), . void h(D* pd) { pd->f(1); // : D::f(char*) B::f(int) pd->B::f(1); // pd->f("Ben"); // , D::f } , , , . int f(char*); void g() { extern f(int); f("asdf"); // : f(int) f(char*) // f(char*) } - , : class buffer { private: char* p; int size; protected: buffer(int s, char* store) { size = s; p = store; } // ... public: buffer(int s) { p = new char[size = s]; } }; R.13.2  , , , . , . , . , . , , , ( ). , . ($$R.8.2.6), n, n+1 . - , , , . , , - ($$R.5.2.4), operator ($$R.13.4). , . X, ->, , const* X const, volatile* X volatile X* . -, ., , operator ($$R.9.4), , : const X& const, volatile X& volatile X& . ->* .* , -> . . ($$R.8.2.5) . , . , , , , . . , int->float->double int double, , int->double. , T : T T& T& T T[] T* T() T(*)() T const T T volatile T T* const T* T* volatile T* , , . , T, const T, volatile T, T&, const T& volatile T& . const volatile, [1] . T& , : , , T, volatile. . , , .. , const ($$R.8.4.3). : [1] . . , T* const T*, T* volatile T*, T& const T& T& volatile T&. [2] . , [1], , ($$R.4.1), float double . [3] . , [2], , ($$R.4.1, $$R.4.2, $$R.4.3, $$R.4.4, $$R.4.5, $$R.4.6, $$R.4.7, $$R.4.8) . A B, B* A* B* void* const void*. , B C, C* B*, C* A*, C& B&, C& A&. ($$R.4.8). [4] . , [3], , ($$R.12.3), ($$R.4) . [5] . , , . , , . class Y { // ... public: operator int(); operator double(); }; void f(Y y) { int i = y; // Y::operator int() double d; d = y; // Y::operator double() float f = y; // : } ($$R.4) , , . struct S { S(long); operator int(); }; void f(long), f(char*); void g(S), g(char*); void h(const S&), h(char*); void k(S& a) { f(a); // f(long(a.operator int())) g(1); // g(S(long(1))) h(1); // h(S(long(1))) } , , , : class x { public: x(int); }; class y { public: y(long); }; void f(x); void f(y); void g() { f(1); // } f(1) . , f(y(long(1))) , f(x(1)), . ($$R.12.1) ($$R.12.3.2) . struct X { operator int(); }; struct Y { Y(X); }; Y operator+(Y,Y); void f(X a, X b) { a+b; // , : // operator+(Y(a), Y(b)) // a.operator int() + b.operator int() } R.13.3  , , . : ($$R.8.4); ($$R.5.17); ($$R.5.2.2); ($$R.13.4); , ($$R.8.2.5). , f() g() , f(&g) f(g) f() g(). : int f(double); int f(int); int (*pfd)(double) = &f; int (*pfi)(int) = &f; int (*pfe)(...) = &f; // : , - , , f() int(...). , ($$R.4) ($$R.4.6). , B D, : D* f(); B* (*p1)() = &f; // void g(D*); void (*p2)(B*) = &g; // R.13.4  . --: operator : new delete + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* -> () [] - ($$R.5.2.2) ($$R.5.2.1). ( , ) : + - * & : . .* :: ?: sizeof # ## ($$R.16). , (-) , ($$R.13.4.1, $$R.13.4.2). , , : complex z = a.operator+(b); // complex z = a+b void* p = operator new(sizeof(int)*n); new delete $$R.5.3.3 $$R.5.3.4 . - - . , , : =, & ,(), . operator=(), - . operator=() $$R.12.8. (, ++a a+=1) . , (, +=). , . ($$R.8.2.6). , $$R.13.4.3-$$R.13.4.7, , , $$R.13.4.1 $$R.13.4.2. R.13.4.1  - ($$R.9.3), , , . , @, @x x.operator@() operator@(x). - , , ($$R.13.2). , ++ -- , $$R.13.4.7. R.13.4.2  - ($$R.9.3), , , , . , @ x@y x.operator@(y) operator@(x,y). - , , ($$R.13.2). R.13.4.3  operator=() -. ($$R.12.8). , X operator=, operator=, X. X& X::operator=(const X&a