|
||||
|
8.5.9 Видимость Имен Членов Члены класса, описанные с ключевым словом class, являюся закрытыми, то есть, их имена могут использоваться только функциями членами (#8.5.2) и друзьями (см. #8.5.10), если они не стоят после метки «public:». В этом случае они являются открытыми. Открытый член может использоваться любой функцией. Struct является классом, все члены которого общие, см. #8.5.12. Если производный класс описан как struct или если перед именем базового класса в описании производного класса стоит ключевое слово public, то общие члены базового класса являюся общими для производного класа; в остальных случаях они яляются закрытыми. Открытый член mem закрытого базового класса base может быть описан как общий для производного класса с помощью опиисания вида typedef-имя :: идентификатор ; в котором typedef-имя обозначает базовый класс, а идетификатор есть имя члена базового класса. Такое описание должно стоять в открытой части производного класса. Рассморим class base (* int a; public: int b, c; int bf(); *); class derived : base (* int d; public: base::c; int e; int df(); *); int ef(derived amp;); Внешняя функция ef может использовать только имена c, e и df. Являясь членом производного derived, функция df может использовать имена b, c, bf, d, e и df, но не a. Являясь члном базового base, функция bf может использовать члены a, b, c и bf. 8.5.10 Друзья Друг класса – это функция не-член, которая может исползовать имена закрытых членов. Друг не принадлежит области вдимости класса и не вызывается с помощью синтаксиса выбора члена (если он не является членом другого класса). Следующий пример иллюстрирует различия между членами и друзьями: class private (* int a; friend void friend_set(private*, int); public: void member_set(int); *); void friend_set (private* p, int i) (* p-»a = i; *) void private::member_set (int i) (* a = i; *) private obj; friend_set ( amp;obj,10); obj.member_set (10); Если описание friend отностися к перегруженному имени или операции, то другом становится только функция, задаваемая типами параметров. Член класса cl1 может быть другом класса cl2. Например: class cl2 (* friend char* cl1::foo(int); // ... *); Все функции класса cl1 могут быть сделаны друзьями класа cl2 с помощью одного описания class cl2 (* friend class cl1 ; // ... *); Функция член, определенная (#10) в описании класса, яляется inline. |
|
||