×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 691 из 714 Настройки
.

Упражнение 19.23. Добавьте в класс >Token конструктор перемещения и присвоения.

Упражнение 19.24. Объясните, что происходит при присвоении объекта класса >Token самому себе.

Упражнение 19.25. Напишите операторы присвоения, получающие значения каждого типа в объединении.

19.7. Локальные классы

Класс, определенный в теле функции, называют локальным классом (local class). Локальный класс определяет тип, видимый только в той области видимости, в которой он определен. В отличие от вложенных классов, члены локального класса жестко ограничены.

Все члены локального класса, включая функции, должны быть полностью определены в теле класса. В результате локальные классы гораздо менее полезны, чем вложенные.

На практике требование полностью определять члены в самом классе, существенно ограничивает сложность, а следовательно, и возможности функций-членов локального класса. Функции локальных классов редко имеют размер, превышающий несколько строк кода. Более длинный код функций труднее прочитать и понять.

Кроме того, в локальном классе нельзя объявлять статические переменные-члены, поскольку нет никакого способа определить их.

Локальные классы не могут использовать переменные из области видимости функции

Локальный класс может обращаться далеко не ко всем именам из окружающей области видимости. Он может обращаться только к именам типов, статических переменных (см. раздел 6.1.1) и перечислений, определенных в окружающей локальной области видимости. Локальный класс не может использовать обычные локальные переменные той функции, в которой определен класс:

>int a, val;

>void foo(int val) {

> static int si;

> enum Loc { a = 1024, b }; // Bar локальна для foo

> struct Bar {

>  Loc locVal; // ok: используется локальное имя типа

>  int barVal;

>  void fooBar(Loc l = a) // ok: аргумент по умолчанию Loc::a

>  {

>   barVal = val;   // ошибка: val локален для foo

>   barVal = ::val; // ok: используется глобальный объект

>   barVal = si; // ok: используется статический локальный объект

>   locVal = b;    // ok: используется перечислитель

>  }

> };

> // ...

>}

К локальным классам применимы обычные правила доступа

Содержащая функция не имеет никаких специальных прав доступа к закрытым членам локального класса. Безусловно, локальный класс вполне может сделать содержащую функцию дружественной. Как правило, локальный класс определяет свои члены как открытые. Та часть программы, которая может обращаться к локальному классу, весьма ограниченна. Локальный класс сосредоточен (инкапсулирован) в своей локальной области видимости. Дальнейшая инкапсуляция, подразумевающая сокрытие информации, безусловно, является излишней.

Поиск имен в локальном классе

Поиск имен в теле локального класса осуществляется таким же образом, как и у остальных классов. Имена, используемые в объявлениях членов класса, должны быть объявлены в области видимости до их применения. Имена, используемые в определениях членов, могут располагаться в любой части области видимости локального класса. Поиск имен, не найденных среди членов класса, осуществляется сначала в содержащей локальной области видимости, а затем вне области видимости, заключающей саму функцию.