Класс можно описать в описании другого класса. Такой класс называютвложенным. Имя вложенного класса локально по отношению кобъемлющему классу. Вложенный класс находится в области видимостиобъемлющего класса. Если не считать явного использования указателей,ссылок или имен объектов, то в описаниях вложенного класса допустимытолько имена типов, статических членов и элементов перечисленияиз объемлющего класса. 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).