200 Часть II. Программирование на C++

! Предупреждение

Заметьте, что говоря об области видимости, мы не касаемся значений переменных. C++ не гарантирует, что переменные или объекты будут обладать начальными значениями до тех пор, пока вы им их не присвоите. Это еще одна причина, почему конструкторы столь важны.

Для статических переменных это не так. Такие переменные, если не передавать им другого значения, автоматически устанавливаются в 0.

Переменные стека (называемые также статически размещенными или статическими) создаются в стеке при. входе в их область видимости. Например, целочисленная переменная, определенная в функции, попадает в область видимости при входе в функцию. Важно знать, где в памяти выделяется место под переменную. В общем случае, управление стеком — это дело самого стека, за исключением программ, специально предназначенных для управления стеком.

Стек можно представить себе в виде стопки блинов. Вызов функции — повар добавляет новые блины. После выхода из функции, из стопки изымается ровно столько блинов, сколько было добавлено в нее при вызове. Переменные, определенные в функции, например, попадают в число снятых. Для вас, как программиста, это означает, что переменная, расположенная между левой и правой скобками, исчезла.

! Предупреждение

Пока для локальных переменных функций (находящихся внутри области видимости функции) не будут выполнены определенные условия, ссылки на стековые переменные возвращать нельзя. Ссылка — это либо указатель, либо адрес; то, что вы возвратите, будет положением чего-то уже не существующего после выхода из области видимости.

Возвращение ссылок на локальные переменные является одной из разновидностей проблемы утечек памяти. Статические переменные иногда используют для борьбы с ошибками этого рода.

Здесь можно воспользоваться статическими переменными. Определение переменной, локальной для некоторой области видимости, как статической увеличивает время ее жизни за пределы этой области. Фактически ее время жизни становится равным времени жизни глобальных переменных, хотя доступна она только из той области, где определена.

Допустим, функция GetToken объявлена следующим образом:

char *GetToken( const char *fileName, const char *token); '

Функция должна возвратить контекст строки token в файле (содержащем, например, алфавитный указатель). Эта функция возвращает char*, и по логике вещей эта переменная типа char* должна быть определена внутри функции.