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