Справочное руководство по C++ | страница 61
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 спецификация-доступа