|
|
Класс можно описать в описании другого класса. Такой класс называют вложенным. Имя вложенного класса локально по отношению к объемлющему классу. Вложенный класс находится в области видимости объемлющего класса. Если не считать явного использования указателей, ссылок или имен объектов, то в описаниях вложенного класса допустимы только имена типов, статических членов и элементов перечисления из объемлющего класса.
int x; int y; class enclose { public: int x; static int s; class inner { void f(int i) { x = i; // ошибка: присваивание enclose::x s = i; // нормально: присваивание enclose ::s ::x = i; // нормально: присваивание глобальному x y = i; // нормально: присваивание глобальному y } void g(enclose* p, int i) { p->x = i; // нормально: присваивание enclose ::x } }; }; inner* p = 0; // ошибка: `inner' вне области видимости
Функции-члены вложенного класса не имеют особых прав доступа к членам объемлющего класса, они подчиняются обычным правилам доступа ($$R.11). Аналогично, функции-члены объемлющего класса не имеют особых прав доступа к членам вложенного класса и подчиняются обычным правилам доступа, например:
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).
| |