Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП лекции Раздел 4.doc
Скачиваний:
16
Добавлен:
28.09.2019
Размер:
2.56 Mб
Скачать

Область действия имен

Большинство элементов языка, именуемых с помощью идентификаторов, долж­ны быть объявлены до их первого использования в программе. Все идентифика­торы действительны в некоторой области текста программы, называемой облас­тью действия имен. Идентификатор, объявленный внутри функции, имеет область действия от точки объявления до конца функции. Глобальный, объявленный вне функции, идентификатор имеет область действия от точки объявления до конца файла. В программах на языке C++ может быть только одно определение каждого глобальною идентификатора и произвольное количество его повторных объявле­ний. Компилятор проверяет идентичность всех его объявлений. Если она наруше­на, то генерируется сообщение об ошибке, и процесс трансляции прекращается.

В C++ любая программная переменная создается, то есть ей отводится па­мять, в точке программы, где она определяется, и уничтожается (освобождается память ею занятая) в точке, где кончается область действия ее имени. Перемен­ные, объявленные вне функций (глобальные), создаются и инициализируются в этой точке программы и живут в течение работы всей программы. То же самое происходит с переменными, снабженными описателем static (но они могут быть и локальными). Все глобальные переменные видны (действуют) во всех моду­лях программы. Область действия локальных переменных ограничивается функ­цией или блоком {...}, внутри которых они были определены. По умолчанию все глобальные переменные и переменные static автоматически инициализиру­ются нулями в точке их определения, если нет какой-либо другой явной инициа­лизации в этой точке. Значения локальных переменных после их объявления не определены. Использование таких переменных (до явного присвоения им како­го-либо значения) не сулит ничего хорошего и чаще других причин является источником ошибок.

Если какая-то локальная переменная имеет такое же имя, что и глобальная переменная, то глобальная становится невидимой (к ней нет досту­па) в области действия локальной переменной, так же, как и в большинстве дру­гих языков программирования. Но C++ дает способ доступа к глобальной пере­менной в этом случае. Операция обзора :: (scope operator) позволяет увидеть скрытую глобальную переменную.

Рассмотрим пример программы, состоящей из двух моду­лей, которая иллюстрирует доступ к скрытой (hidden) глобальной переменной в языке C++.

#include <stdiо.h> // Подключение файла заголовков

int i=16; // Глобальная переменная

void рrос() // Внешняя функция

{

int i=l; // Локальная переменная

printf ("\n\t Proc: i=%d",i);

printf ("\n\t Proc: global i=%d",::i);

{

int i=2;

printf ("\n\t Proc: i=%d",i);

printf ("\n\t Proc: global i=%d",::i); // Присвоение глобальной I

}

}

void main (void) // Главная функция. С нее начинается выполнение программы

{

printf ("\n\t Main: i=%d",i):

ргос():

printf ("\n\t Main: i=%d\n",i);

}

Результат работы программы примера выглядит следующим образом:

Main: i=16

Proc: i=l

Proc: global i=16

Proc: i=2

Proc: global i=16

Main: i=16

Выведенные значения иллюстрируют возможности операции обзора (:: — scope operator), позволяющей видеть глобально объявленную переменную i в облас­ти, где действуют две локально объявленные переменные i, каждая в своем бло­ке {...} функции рrос. Внутри main действует только одна переменная i — глобальная. Говорят, что внутри ргос локальная i скрывает (hides) глобальную, однако операция :: позволяет получить доступ (access) к ней. Первая строка программы есть директива препроцессора, которая предписывает ему перед ком­пиляцией всего модуля включить содержимое файла с именем stdio.h в данное место программы. Файлы заголовков (header files) имеют расширение .h. Мно­гие из них поставляются вместе с той или иной интегрированной средой разработчика программ на языке С или С++. Файл stdio.h содержит в частности прототипы функций для форматированного ввода и вывода (scanf, printf) пере­менных стандартных типов.