<< Предыдущая Оглавление Следующая >>


2.4. Область видимости переменных

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

Листинг 2.10. Пример использования локальных переменных.

#include
int main()
{
for(int i=0;i < 10;i++)
{
int k = i*i;
printf(“%d\n”,k);
}
return 0;
}

В этом примере объявляются две переменные i и k. Причем переменная k объявлена внутри цикла for. Спрашивается можно ли ее использовать и за пределами этого цикла? В данном случае ответ будет отрицательный, т.к. переменная k «пропадает» за пределами тела цикла и существует только внутри него. Условия данного примера можно обобщить и сказать, что обычная переменная объявленная внутри фигурных скобок {} видна только в них и не может быт использована за их пределами. По этой причине переменные объявленные, например, внутри функции main() недоступны в других функциях и наоборот. Однако если объявить переменную вначале программы, а не внутри функции, то они становятся доступными всем функциям и будут иметь глобальную область видимости. Такие переменные называются глобальными. Следующий пример показывает объявление и использование глобальных переменных.

Листинг 2.11. Определение глобальных переменных.

#include
int global_var = 0;
void my_func(void) {global_var = 10;}
int main()
{
printf(“%d\n”,global_var);
my_func();
printf(“%d\n”,global_var);
return 0;
}

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

0
10

В этом примере объявлена глобальная переменная global_var, которая может использоваться и в функции main() и в функции my_func() и соответственно менять свое значение.

В языке С++ можно задавать переменные с одинаковыми именами и типами если они принадлежат разной области видимости. Например, можно задать глобальную переменную var типа int и такую же переменную внутри функции main(). В этом случае простое обращение к переменной по ее имени будет означать работу с локальной переменной, а если необходимо работать с глобальной, то перед ее именем необходимо поставить два двоеточия ‘::’. Следующий пример показывает такой способ работы с переменными.

Листинг 2.12. Работа с глобальными и локальными переменными.

#include
int var = 5;
int main()
{
int var = 10;
printf(“var = %d, ::var = %d”,var,::var);
return 0;
}

В результате получим

var = 10, ::var = 5

В языке С++ можно задавать класс переменных, которые будучи объявленными внутри фигурных скобок {} не исчезают и за их пределами, но в то же время имеют область видимости только внутри них. Класс таких переменных называется статическим и задается с помощью ключевого слова static. Поясним сказанное на следующем примере.

Листинг 2.13. Использование статических переменных.

#include
void iter(void);
int main()
{
for(int i=0;i < 4;i++)
iter();
return 0;
}
void iter(void)
{
int var = 1;
static int var_st = 1;
printf(“var = %d, var_st = %d\n”,var++,var_st++);
}

В результате на экране появятся следующие строчки:

var = 1, var_st = 1
var = 1, var_st = 2
var = 1, var_st = 3
var = 1, var_st = 4

Анализ полученных результатов показывает, что статическая переменная var_st объявленная внутри функции iter() не исчезает после ее завершения и при повторном вызове функции не инициализируется заново, т.к. она уже существует.

В языке С++ переменную можно задать как константу, т.е. ее значение нельзя изменять в процессе выполнения программы. Это бывает полезно, когда программист хочет обеспечить «защиту» переменной от изменения. Это достигается путем использования ключевого слова const, которое ставится перед типом переменной:

const int var_const = 10; //правильная инициализация
const int array[] = {10,20,30}; // правильная инициализация
var_const = 5; //ошибка

Например, ранее рассмотренная функция strcpy() копирования одной строки в другую принимает следующие параметры:

char* strcpy(char* dest, const char* src);

Здесь идентификатор const гарантирует, что строка src не будет изменена внутри функции strcpy().


<< Предыдущая Оглавление Следующая >>