ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 5) онлайн
Локальные переменные
До сих пор в наших примерах мы сталкивались только с переменными, которые определялись внутри тех функций, в которых они использовались. Другими сло- вами, определение переменных происходило внутри фигурных скобок, ограни- чивающих тело функции:
void somefunc()
{
int somevar; // переменные, определенные внутри
float othervar; // тела функции
// другие операторы
}
Переменные, определяемые внутри функции main(), ничем не отличаются от переменных, определяемых внутри других функций. Переменные, определя- емые внутри функции, называют локальными, поскольку их область видимости ограничивается этой функцией. Иногда такие переменные называют автомати- ческими, поскольку они имеют класс памяти automatic.
Рассмотрим область видимости и классы памяти локальных переменных.
Классы памяти локальных переменных
Локальная переменная не существует в памяти до тех пор, пока не будет вызвана функция, в которой она определена (в более общем виде это утверждение звучит так: переменная, определенная внутри любого блока операторов, не существует в памяти до тех пор, пока этот блок не выполнен. Переменные, определенные в те- ле цикла, существуют только во время исполнения цикла). Так, в приведенном выше фрагменте программы переменные somevar и othervar не существуют до тех пор, пока не произведен вызов функции somefunc(). Это означает, что в памя- ти нет места, выделенного для их хранения: переменные не определены. Когда управление передается в функцию somefunc(), переменные создаются и под них отводится место в памяти. Затем, когда выполнение функции somefunc() завер- шается и управление передается вызывающей программе, переменные уничто- жаются, а их значения теряются. Название автоматического класса памяти как раз указывает на то, что переменные автоматически создаются при входе в функ- цию и автоматически уничтожаются при выходе из нее. Период времени между созданием переменной и ее уничтожением называется временем жизни перемен- ной. Время жизни локальной переменной равно времени, проходящему с момен- та объявления переменной в теле функции до завершения исполнения функции.
Ограниченное время жизни переменной позволяет экономить память во вре- мя выполнения программы. В случае, если функция не вызывается, нет необхо- димости резервировать память под ее локальные переменные. Удаление локаль- ных переменных из памяти при завершении функции позволяет распределить освободившуюся память между локальными переменными других функций.
Область видимости локальных переменных
Область видимости переменной определяет участки программы, из которых воз- можен доступ к этой переменной. Это означает, что внутри области видимости
переменной операторы могут обращаться к ней по имени и использовать ее зна чение при вычислении выражений. За пределами области видимости попытки обращения к переменной приведут к выдаче сообщения о том, что переменная неизвестна.
Переменные, определенные внутри функции, видимы, или доступны, только внутри функции, в которой они определены. Предположим, что в вашей программе есть две следующие функции:
void somefunc()
{
int somevar; // локальные переменные
float othervar;
somevar =10; // корректно
othervar =11; // корректно
nextvar = 12; // некорректно: nextvar невидима в somefunc()
}
void otherfunc()
{
int nextvar; // локальная переменная
somevar = 20; // некорректно: somevar и othervar
othervar =21; // невидимы в otherfunc()
nextvar = 22; // корректно
}
Переменная nextvar невидима внутри функции somefunc(), а переменные somevar и othervar невидимы внутри функции otherfunc().
Ограничение области видимости переменной обеспечивает организованность программы и ее модульность. Вы можете быть уверены, что переменные одной функции защищены от несанкционированного доступа других функций, по- скольку во всех остальных функциях эти переменные невидимы. Это является важной частью структурного программирования, на котором основывается орга- низация процедурных программ. Ограничение области видимости переменных является важным и для объектно-ориентированного программирования.
В случае, если переменная определяется внутри функции, ее область види- мости и время жизни ограничены этой функцией: переменная существует толь- ко во время исполнения функции и видима только внутри функции. Как мы позже увидим, не для всех переменных область видимости и время жизни совпадают.
Инициализация
Когда создается локальная переменная, компилятор не пытается собственными силами инициализировать ее. В этом случае переменная имеет неопределенное значение, которое может быть как нулевым, так и представлять собой отличное от нуля число. Для того чтобы переменная получила определенное значение, не- обходимо явно инициализировать ее:
int n = 33;
Теперь переменная n начнет свое существование со значением, равным 33.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
