4. Имена и Типы
видимости. Имя имеет тип, определяю-
щий его использование. Объект - это область памяти. Объект
имеет класс памяти, определяющий его время жизни. Смысл зна-
чения, обнаруженного в объекте, определяется типом имени, ис-
пользованного для доступа к нему.
4.1 Область Видимости
Есть четыре вида областей видимости: локальная, файл,
программа и класс.
Локальная: Имя, описанное в блоке (#9.2), локально в
этом блоке и может использоваться только в нем после места
описания и в охватываемых блоках. Исключение составляют метки
(#9.12), которые могут использоваться в любом месте функции,
в которой они описаны. Имена формальных параметров функции
рассматриваются так, как если бы они были описаны в самом
внешнем блоке этой функции.
Файл: Имя, описанное вне любого блока (#9.2) или класса
(#8.5), может использоваться в файле, где оно описано, после
места описания.
Класс: Имя члена класса локально для его класса и может
использоваться только в функции члене этого класса (#8.5.2),
после примененной к объекту его класса (#7.1) операции . или
после примененной к указателю на объект его класса (#7.1)
операции ->. На статические члены класса (#8.5.1) и функции
члены можно также ссылаться с помощью операции :: там, где
имя их класса находится в области видимости. Класс, описанный
внутри класса (#8.5.15), не считается членом, и его имя при-
надлежит охватывающей области видимости.
Имя может быть скрыто посредством явного описания того
же имени в блоке или классе. Имя в блоке или классе может
быть скрыто только именем, описанным в охватываемом блоке или
классе. Скрытое нелокальное имя также может использоваться,
когда его область видимости указана операцией :: (#7.1). Имя
класса, скрытое именем, которое не является именем типа, все
равно может использоваться, если перед ним стоит class,
struct или union (#8.2). Имя перечисления enum, скрытое име-
нем, которое не является именем типа, все равно может исполь-
зоваться, если перед ним стоит enum (#8.2).
4.2 Определения
Описание (#8) является определением, за исключением тех
случаев, когда оно описывает функци, не задавая тела функции
(#10), когда оно содержит спецификатор extern (1) и в нем нет
инициализатора или тела функции, или когда оно является опи-
санием класса (#8.8).
4.3 Компоновка
Имя в файловой области видимости, не описанное явно как
static, является общим для каждого файла многофайловой прог-
раммы. Таковым же является имя функции. О таких именах гово-
рится, что они внешние. Каждое описание внешнего имени в
программе относится к тому же объекту (#5), функции (#8.7),
классу (#8.5), перечислению (#8.10) или значению перечислите-
ля (#8.10).
Типы, специфицированные во всех описаниях внешнего имени
должны быть идентичны. Может быть больше одного определения
типа, перечисления, inline-функции (#8.1) или несоставного
const (#8.2), при условии, что определения идентичны, пояля-
ются в разных файлах и все инициализаторы являются констант-
ными выражениями (#12). Во всех остальных случаях должно быть
ровно одно определение для внешнего имени в программе.
же ограничение может налагаться на inline
-функции.
4.4 Классы Памяти
Есть два описываемых класса памяти: автоматический и
статический.
Автоматические объекты локальны для каждого вызова блока
и сбрасываются по выходе из него.
Статические объекты существуют и сохраняют свое значение
в течение выполнения всей програмы.
Некоторые объекты не связаны с именами и их времена жиз-
ни явно управляются операторами new и delete, см. #7.2 и
#9.14
4.5 Основные Типы
равно целому коду этого символа.
В настоящий момент имеются целые трех размеров, описыва-
емые как short int, int и long int. Более длинные целые (long
int) предоставляют не меньше памяти, чем более короткие целые
(short int), но при реализации или длинные, или короткие, или
и те и другие могут стать эквивалентными обычным целым.
"Обычные" целые имеют естественный размер, задаваемый архи-
тектурой центральной мащины; остальные размеры делаются таки-
ми, чтобы они отвечали специальным потребностям.
Каждое перечисление (#8.9) является набором именованных
констант. Свойства enum идентичны свойствам int.
Целые без знака, описываемые как unsigned, подчиняются
правилам арифметики по модулю 2n, где n - число бит в их
представлении.
Числа с плавающей точкой одинарной (float) и двойной
(double) точности в некоторых машинных реализациях могут быть
синонимами.
называться целочисленными типами. Типы float
и double будут собирательно называться плавающими типами.
Тип данных void (пустой) определяет пустое множество
значений. Значение (несуществующее) объекта void нельзя ис-
пользовать никаким образом, не могут применяться ни явное, ни
неявное преобразования. Поскольку пустое выражение обозначает
несуществующее значение, такое выражение такое выражение мо-
жет использоваться только как оператор выражение (#9.1) или
как левый операнд в выражении с запятой (#7.15). Выражение
может явно преобразовываться к типу void (#7.2).
4.6 Производные Типы
Кроме основных арифметических типов концептуально су-
ществует бесконечно много производных типов, сконструирован-
ных из основных типов следующим образом:
массивы объектов данного типа;
функции, получающие аргументы данного типа и возвращаю-
щие объекты данного типа;
указатели на объекты данного типа;
ссылки на объекты данного типа;
константы, являющиеся значениями данного типа;
классы, содержащие последовательность объектов различных
типов, множество функций для работы с этими объектами и
набор ограничений на доступ к этим объектам и функциям;
структуры, являющиеся классами без ограничений доступа;
объединения, являющиеся структурами, которые могут в
разное время содержать объекты разных типов.
В целом эти способы конструирования объектов могут при-
меняться рекурсивно.
Объект типа void* (указатель на void) можно использовать
для указания на объекты неизвестного типа.
[Назад] [Содержание] [Вперед]
| Главная |