, : class E { int x; class I { int y; void f(E* p, int i) { p->x = i; // : E::x } }; int g(I* p) { return p->y; // : I::y } }; - , , : class enclose { class inner { static int x; void f(int i); }; }; typedef enclose::inner ei; int ei::x = 1; void enclose::inner::f(int i) { /* ... */ } - , , . , - ( $$R.10.4), ($$R.11). R.9.8  , . , . , , , . : int x; void f() { static int s; int x; extern int g(); struct local { int h() { return x; } // : `x' int j() { return s; } // int k() { return ::x; } // int l() { return g(); } // } } , ($$R.11). - . , . R.9.9  , . , , , , : class X { public: typedef int I; class Y { /* ... */ } I a; }; I b; // Y c; // X::Y d; // , , . , - -typedef . , - -typedef - -typedef, . : typedef int c; enum { i = 1 }; class X { char v[i]; int f() { return sizeof(c); } char c; // : typedef // enum { i = 2 }; // : `i' // `char[i]' }; typedef char* T; struct Y { T a; typedef long T; // : T T b; }; R.10  : -: : - -: - - , - -: -- virtual - opt -- - virtual opt -- -: private protected public - - ($$R.9), . , . - $$R.11. , , , . , . :: ($$R.5.1) . , . , . $$R.11.2. ($$R.4.6). ($$R.4.7). : class base { public: int a, b; }; class derived : public base { public: int b, c; }; void f() { derived d; d.a = 1; d.base::b = 2; d.b = 3; d.c = 4; base* bp = &d; // derived* base* } d, bp d. , -, , , -. , - :: , . , . : class A { public: void f(); } class B : public A { }; class C : public B { public: void f(); } void C::f() { f(); // f() C A::f(); // f() A B::f(); // f() A } A::f(), f() B. , , , . $$R.12.6.2. R.10.1  . : class A { /* ... */ }; class B { /* ... */ }; class C { /* ... */ }; class D : public A, public B, public C { /* ... */ }; , . , , ($$R.12.1), ($$R.12.4) ($$r.5.4, $$R.9.2, $$R.11.1). . , . class B { /* ... */ }; class D : public B, public B { /* ... */ }; // class L { /* ... */ }; class A : public L { /* ... */ }; class B : public L { /* ... */ }; class C : public A, public B { /* ... */ }; // C L. virtual. V , V . : class V { /* ... */ }; class A : virtual public V { /* ... */ }; class B : virtual public V { /* ... */ }; class C : public A, public B { /* ... */ }; C V. , : class B { /* ... */ }; class X : virtual public B { /* ... */ }; class Y : virtual public B { /* ... */ }; class Z : public B { /* ... */ }; class AA : public X, public Y, public Z { /* ... */ }; AA B: Z , X Y. R.10.1.1  . , , , , , . ($$R.11). : class A { public: int a; int (*b)(); int f(); int f(int); int g(); }; class B { int a; int b(); public: int f(); int g(); int h(); int h(int); }; class C : public A, public B { }; void g(C* pc) { pc->a = 1; // : : A::a B::a pc->b(); // : : A::b B::b pc->f(); // : : A::f B::f pc->f(1); // : : A::f B::f pc->g(); // : : A::g B::g pc->g = 1; // : : A::g B::g pc->h(); // pc->h(1); // } , . , , , : class A { public: int f(); }; class B { public: int f(); }; class C : public A, public B { int f() { return A::f() + B::f(); } }; , , , , , . . , . : class V { public: int v; }; class A { public: int a; }; class B : public A, public virtual V { }; class C : public A, public virtual V { }; class D : public B, public C { public: void f(); }; void D::f() { v++; // a++; // , : `a' `D' } , , , , . , , , , . , .. . , B::f A::f, A B . , : . : class V { public: int f(); int x; }; class B : public virtual V { public: int f(); int x; }; class C : public virtual V { }; class D : public B, public C { void g(); }; void D::g() { x++; // : B::x V::x f(); // : B::f() V::f() } , , . : class V { }; class A { }; class B : public A, public virtual V { }; class C : public A, public virtual V { }; class D : public B, public C { }; void g() { D d; B* pb = &d; A* pa = &d; // , : A C A B? v* pv = &d; // : V } R.10.2  base ($$R.7.1.2) vf, derived vf , vf derived derived::vf, base. , . , ($$R.8.2.5) , (. $$R.13.1). , . : struct base { virtual void vf1(); virtual void vf2(); virtual void vf3(); void f(); }; class derived : public base { public: void vf1(); void vf2(int); // base::vf2() char vf3(); // : // } void g() { derived d; base* bp = &d; // : derived* base* bp->vf1(); // derived::vf1 bp->vf2(); // base::vf2 bp->f(); // base::f } d derived derived::vf1, base::vf2 base::f . , , , - . , bp->vf1() derived::vf1(), bp derived, derived::vf1() base::vf1(). virtual , , ( ) ($$R.7.1.2). , .. , , . . , , . virtual , . ($$R.10.3). , , : , . , ($$R.5.1), : class B { public: virtual void f(); }; class D : public B { public: void f(); }; void D::f() { /* ... */ B::f(); } f D B::f, D::f. R.10.3  , , , , , , . , . , , .. , . , . - ($$R.9.2). , - ($$R.5.1). : class point { /* ... */ }; class shape { // point center; // ... public: point where() { return center; } void move(point p) { center=p; draw(); } virtual void rotate(int) = 0; // virtual void draw() = 0; // // ... }; , , . , : shape x; // : shape* p; // shape f(); // void g(shape); // shape& h(shape&); // , : class ab_circle : public shape { int radius; public: void rotate(int) { } // ab_circle::draw() }; shape::draw() , ab_circle::draw(). circle , circle::draw() - . class circle : public shape { int radius: public: void rotate(int) { } void draw(); // - }; - , , , . R.10.4  ++. ( -typedef ($$R.7.1.3) - ($$R.9.1)) , . , $$R.3.3. $$R.3.2. ( ) ($$R.10.1.1). ($$R.11) , . , , , . , , :: ( :: -> .), , , , . , X:: obj., obj X X, , ptr->, ptr X, X X . , ptr-> ptr Y, operator->(), , ptr->operator() X ($$R.13.4.6). , , , , , , , . , . , ($$R.13.4). , , , , X, , , , X, X , . , . . , , , - X, , , , X, X , . , ($$R.8.3), , ( , ). , ($$R.8.2.5), , , . , ($$R.3.2) ; , ($$R.8.2.6). -ctor ($$R.12.6.2) , . , . R.11  : (private); , - , ; (protected); , - , , - , (. $$R.11.5); (public); , . , class, . , struct union, , : class X { int ; // X:: }; struct S { int a; // S::a }; R.11.1  ($$R.10): - : - opt - , -, , class X { int a; // X::a : 'class' public: int b; // X::b int c; // X::c }; , , struct S { int a; // S::a : `struct' protected: int b; // S::b private: int c; // S::c public: int d; // S:: d }; , , -, ($$R.9.2). R.11.2  ($$r.10) public, public protected . private, public protected private . , friend. -, , struct, public, class, - private, : class B { /* ... */ }; class D1 : private B { /* ... */ }; class D2 : public B { /* ... */ }; class D3 : B { /* ... */ }; // `B' struct D4 : public B { /* ... */ }; struct D5 : private B { /* ... */ }; struct D6 : B { /* ... */ }; // `B' (public) D2, D4 D6 (private) D1, D2 D5. private . , , , . - X X* , X. R.11.3  , public protected . . : class B { int a; public: int b, c; int bf(); }; class D : private B { int d; public: B::c; // adjust access to `B::c' int e; int df(); }; int ef(D&); ef c, e, df. df D, b, c, bf, d, e df, a. bf - B a, b, c bf. , , , , : class B { public: int a; private: int b; protected: int c; }; class D : private B { public: B::a; // `a' D B::b; // : , // `b' D protected: B::c; // `c' D B::a; // : , // `a' D }; , : class X { public: f(); f(int); }; class Y : private X { public: X::f; // makes X::f() and X::f(int) public in Y }; , , : class X { public: void f(); }; class Y : private X { public: void f(int); X::f; // : f }; R.11.4  , , . , ($$R.5.2.4), . : class X { int a; friend void friend_set(X*, int); public: void member_set(int); }; void friend_set(X* p, int i) { p->a = i; } void X::member_set(int i) { a = i; } void f() { X obj; friend_set(&obj,10); obj.member_set(10); } friend , , , . - X Y, : class Y { friend char* X::foo(int); // ... }; X Y -- ($$R.9.1): class Y { friend class X; // ... }; , , , , , : class X { enum { a=100 }; friend class Y; }; class Y { int v[X::a]; // Y X }; class Z { int v[X::a]; // : X::a }; , , , , , friend ($$R.9.1). , friend, , extern ($$R.3.3, $$r.7.1.1). - , inline - ($$R.9.3.2). -, , . -, , . friend - ($$R.9.2). , . : class A { friend class B; int a; }; class B { friend class C; }; class C { void f(A* p); { p->a++; // : C A, // A } }; class D : public B { void f(A* p) { p->a++; // : D A, // A } }; R.11.5  - . - , ( , ). : class B { protected: int i; }; class D1 : public B { }; class D2 : public B { friend void fr(B*, D1*, D2*); void mem(B*, D1*); }; void fr(B* pb, D1* p1, D2* p2) { pb->i = 1; // p1->i = 2; // p2->i = 3; // ( D2) } void D2::mem(B* pb, D1* p1) { pb->i = 1; // p1->i = 2; // i = 3; // ( this) } void g(B* pb, D1* p1, D2* p2) { pb->i = 1; // p1->i = 2; // p2->i = 3; // } R.11.6  ($$r.11) , . : class B { public: virtual f(); }; class D : public B { private: f(); }; void f() { D d; B* pb = &d; D* pd = &d; pb->f(); // : B::f() // D::f() pd->f(); // : D::f() } , , , - ( B*). - , (D ), . R.11.7  , , , . : class W { public: void f(); }; class A : private virtual W { }; class B : public virtual W { }; class C : public A, public B { void f() { W::f(); } // }; W::f() C::f() , B, . R.12 - - , , , , . . - ($$R.11). , protected , . R.12.1  -, , , . , , . $$R.12.6. const volatile. const volatile ($$R.9.3.1). virtual static. , , ($$R.12.8). . X X, . X , X . X , X, .. X. , X::X(const X&) X::X(X&, int=0) . , . X X, X::X(X) . ($$R.8.2.4). , , , . $$R.12.6.2 . . , void. return . . : - ( - opt ) : complex zz = complex(1,2.3); print( complex(7.8,1.2) ); , ( zz ), , , . $$R.12.2. -, . $$R.12.7. R.12.2  . . , . , , . : class X { // ... public: // ... X(int); X(X&); ~X(); }; X f(X); void g() { X a(1); X b = f(X(2)); a = f(b); } X(2), f() X(X&). , - X(2) , f(). , f(X(2)) , b X(X&), : f(X(2)) b. , f(), a=f(a) a, f(a), , a. . . : ( ) , . , . , , . , . $$R.8.4.3. R.12.3  . , , ($$R.4). , X X, T, T X. , : ($$R.8.4), ($$R.5.2.2), ($$R.6.6.3, $$R.8.2.5), ($$R.5), , ($$R.6.4,$$R.6.5) ($$R.5.2.3, $$R.5.4). ($$R.10.1.1, $$R.12.3.2). ($$R.11). ($$R.10.4). , , $$R.13.2. R.12.3.1  , , , : class X { // ... public: X(int); X(const char*, int = 0); }; void f(X arg) { X a = 1; // a = X(1); X b = "Jessie"; // b = X("Jessie",0) a = 2; // a = X(2) f(3); // f(X(3)) } X , , - , X, : class X { /* ... *