13.12. Локальные классы A
13.12. Локальные классы A
Класс, определенный внутри тела функции, называется локальным. Он виден только в той локальной области, где определен. Не существует синтаксиса, позволяющего обратиться к члену такого класса, в отличие от вложенного, извне локальной области видимости, содержащей его определение. Поэтому функции-члены локального класса должны определяться внутри определения самого класса. На практике это ограничивает их сложность несколькими строками кода; помимо всего прочего, такой код становится трудно читать.
Поскольку невозможно определить член локального класса в области видимости пространства имен, то в таком классе не бывает статических членов.
Класс, вложенный в локальный, может быть определен вне определения объемлющего класса, но только в локальной области видимости, содержащей это определение. Имя вложенного класса в таком определении должно быть квалифицировано именем объемлющего класса. Объявление вложенного класса в объемлющем нельзя опускать:
void foo( int val )
{
class Bar {
public:
int barVal;
class nested; // объявление вложенного класса обязательно
};
// определение вложенного класса
class Bar::nexted {
// ...
};
}
У объемлющей функции нет никаких специальных прав доступа к закрытым членам локального класса. Разумеется, это можно обойти, объявив ее другом данного класса. Однако необходимость делать его члены закрытыми вообще сомнительна, поскольку часть программы, из которой разрешается обратиться к нему, весьма ограничена. Локальный класс инкапсулирован в своей локальной области видимости. Дальнейшая инкапсуляция путем сокрытия информации не требуется: вряд ли на практике найдется причина, по которой не все члены локального класса должны быть открыты.
У локального класса, как и у вложенного, ограничен доступ к именам из объемлющей области видимости. Он может обратиться только к именам типов, статических переменных и элементов перечислений, определенных в объемлющих локальных областях. Например:
int a, val;
void foo( int val )
{
static int si;
enum Loc { a = 1024, b };
class Bar {
public:
Loc locVal; // правильно
int barVal;
void fooBar ( Loc l = a ) { // правильно: Loc::a
barVal = val; // ошибка: локальный объект
barVal = ::val; // правильно: глобальный объект
barVal = si; // правильно: статический локальный объект
locVal = b; // правильно: элемент перечисления
}
};
// ...
}
Имена в теле локального класса разрешаются лексически путем поиска в объемлющих областях видимости объявлений, предшествующих определению такого класса. При разрешении имен, встречающихся в телах его функций-членов, сначала просматривается область видимости класса, а только потом – объемлющие области,
Как всегда, если первое найденное объявление таково, что употребление имени оказывается некорректным, поиск других объявлений не производится. Несмотря на то что использование val в fooBar() выше является ошибкой, глобальная переменная val не будет найдена, если только ее имени не предшествует оператор разрешения глобальной области видимости.
2014-09-07 13:25:31 Евгений
Вот это да, почитаю спасибо )
2013-11-01 03:57:59 Сергей
Спасибо за данное пособие, благодаря ему наконец то смог понять классы:)
2012-11-02 15:24:04 Pavel
спасибо за материал.ТО что нужно))
2012-06-08 07:31:08 cmd
Хороший материал
2012-03-27 20:42:52 Слава
Очень полезный материал и объяснено на доступном языке!!!
2012-01-31 09:33:40 Ivan
Пробуем:)
2012-01-03 03:10:13 Ion Botezatu
Супер, мне очень помог этот материа! Спосибо авторам!
2011-12-03 00:14:08 Makc
Отличный материал, спасибо за проделанную работу!
2011-10-05 21:44:13 Андрей
Отличный текст и всё нужно в одном месте. Часто пользуюсь! Спасибо.
2011-05-23 20:40:57 я
Спасибо!
2011-04-17 10:31:54 Аза
Спасибо за материал
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Локальные стили
Локальные стили То, что у каждого элемента-разделителя есть свое собственное содержание, делает эти элементы прекрасно подходящими для решений на Ajax. И снова HTML5 показывает свое происхождение из спецификации для веб-приложений.Однако если вы попытаетесь перенести
4.10 Локальные сети
4.10 Локальные сети Рассмотрим, как IP и другие протоколы пакетируют кадры для пересылки по локальным сетям. Классическая локальная сеть предполагает следующие свойства:? Станции совместно используют физический носитель.? Существуют правила управления доступом к
19.6.12 Ссылки на локальные документы
19.6.12 Ссылки на локальные документы Можно создать ссылку на документ локального хоста. Например, ссылка на локальный документ DOS выглядит как:<А HREF = "file:///c:webdocshome.htm">Документ локального хоста</А>Для извлечения такого документа нет надобности в протоколе HTTP. Отметим,
Локальные политики
Локальные политики Раздел Локальные политики содержит три политики: Политика аудита, Назначение прав пользователя и Параметры безопасности.? Политика аудита — позволяет определить события, факты происхождения которых будут записываться в журнал Безопасность
Локальные контексты
Локальные контексты В совете 35 приведена реализация сравнения строк без учета регистра символов с применением алгоритмов mismatch и lexicographical_compare, но в нем также указано, что полноценное решение должно учитывать локальный контекст. Книга посвящена STL, а не вопросам
Локальные контексты в С++
Локальные контексты в С++ В стандартной библиотеке С++ локальный контекст не является глобальной структурой данных, запрятанной где-то в недрах реализации библиотеки. Это объект типа std::locale, который можно создать и передать его другой функции, как любой другой объект.
5.2.7.1. Локальные переменные DECLARE
5.2.7.1. Локальные переменные DECLARE DECLARE var_name[,…] type [DEFAULT value]Эта инструкция используется, чтобы объявить локальные переменные. Чтобы обеспечивать значение по умолчанию для переменной, включите предложение DEFAULT. Значение может быть определено как выражение, оно не обязательно
ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ
ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ Мы уже несколько раз касались вопроса о том, что переменные в функции являются ее внутренними переменными и "не известны" вызывающей функции. Аналогично переменные вызывающей функции не известны вызываемой функции. Вот почему для связи с ней, т.
5.5.4. Локальные сокеты
5.5.4. Локальные сокеты Сокеты, соединяющие процессы в пределах одного компьютера, работают в локальном пространстве имен (PF_LOCAL или PF_UNIX, это синонимы). Такие сокеты называются локальными или UNIX-сокетами. Их адресами являются имена файлов, указываемые только при создании
8.3. Локальные объекты
8.3. Локальные объекты Объявление переменной в локальной области видимости вводит локальный объект. Существует три вида таких объектов: автоматические, регистровые и статические, различающиеся временем жизни и характеристиками занимаемой памяти. Автоматический
22.2. Локальные переменные
22.2. Локальные переменные Что такое "локальная" переменная?локальные переменныеПеременные, объявленные как локальные, имеют ограниченную область видимости, и доступны только в пределах блока, в котором они были объявлены. Для функций это означает, что локальная
14.2. Локальные переменные
14.2. Локальные переменные Переменные интерпретатора shell могут использоваться сценариями в период функционирования интерпретатора shell. После завершения выполнения интерпретатора действие этих переменных прекращается. Например, локальная переменная имя_файла может
10.4. Локальные сети
10.4. Локальные сети Локальная сеть создается, как правило, для совместного использования ресурсов ЭВМ или данных (обычно в одной организации). С технической точки зрения локальная сеть – совокупность компьютеров и каналов связи, объединяющих компьютеры в структуру с
Отложенные классы как частичные интерпретации: классы поведения
Отложенные классы как частичные интерпретации: классы поведения Не все отложенные классы так близки к АТД как STACK. В промежутке между полностью абстрактным классом, таким как STACK, в котором все существенные компоненты отложены, и эффективным классом, таким как FIXED_STACK,