ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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.

 

 

30