
- •1 Использование описания typedef
- •2 Преобразование типов
- •3 Указатели на функции
- •4 Пример использования указателей на функции
- •5 Области видимости и время жизни объектов
- •6 Пример использования статической локальной переменной
- •Примечание
- •7 Пространства имен
- •8 Заголовочные файлы
- •9 Подходы к разработке структуры программы
- •11 Задания на самостоятельную работу Задание 1
- •Задание 2
5 Области видимости и время жизни объектов
Имя идентификатора может использоваться многократно в различных областях видимости. Каждая переменная видима в программе только внутри ее области видимости. Язык С++ поддерживает три разновидности областей видимости.
Файловая видимость - это та часть текста программы, которая не входит ни в какую - либо функцию, ни в определение класса. В ней внутри могут находится области локальной и классовой видимости. Стандарт языка С++ гарантирует, что память глобальной переменной без явного задания начального значения будет инициализирована нулем.
Каждая функция представляет собой отдельную локальную область видимости. Внутри функции каждый составной оператор (блок), содержащий один или более операторов описания, тоже задает связанную с ним локальную область видимости. Время жизни такого объекта заканчивается с завершением работы функции (с выходом из блока), и его значение теряется. Список параметров из определения функции входит в локальную область видимости функции.
В С++ каждый класс образует собственную классовую область видимости, которая не совпадает ни с файловой, ни с какой-либо локальной.
Имена, определенные в файловой области видимости, видимы во всей программе. Вместе с тем, локальная переменная может повторно использовать имя глобальной переменной. В этом случае локальная переменная скрывает глобальную. Для доступа к такой глобальной переменной может использоваться операция глобальной области видимости. Это - унарная операция (::), указывающая на то, что используется имя из глобальной области видимости:
int a = ::a;
Существует три вида локальных объектов: автоматические, регистровые и статические, различающиеся временем жизни и характеристиками занимаемой памяти. Автоматический объект существует с момента активизации функции, в которой он определен, до выхода из нее. Неинициализированный автоматический объект содержит неопределенное значение. По умолчанию локальный объект считается автоматическим.
Регистровый объект - это автоматический объект, для которого поддерживается быстрое считывание и запись его значения. Такие переменные объявляются с ключевым словом register.
register int i = 0;
Локальный статический объект описывается с указанием служебного слова static. Он располагается в области памяти, существующей на протяжении всего времени выполнения программы. Статический локальный объект инициализируется во время первого выполнения инструкции, где он объявлен. Статический локальный объект используется тогда, когда его значение должно сохраняться между вызовами функции. Неинициализированные статические локальные объекты получают значение по умолчанию, принятое для их типа (для числовых типов - 0).
6 Пример использования статической локальной переменной
Допустим, необходимо реализовать программу, в которой с клавиатуры вводятся целые значения и по мере их ввода выводится их текущая сумма до тех пор, пока пользователь не введет значение 0.
Накопление суммы можно реализовать с помощью функции add(), имеющей статический член sum:
int add(int i)
{
static int sum = 0;
sum += i;
return sum;
}
В функции main() определяется локальная переменная i и организуется цикл, в котором вводится значение i и выводится текущая сумма:
int main(int argc, char* argv[])
{
int i;
do
{
cin >> i;
cout << add(i) << endl;
}
while (i);
return 0;
}