Главная->Інформатика та програмування->Содержание->Статические локальные переменные

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 5) онлайн

Статические локальные переменные

Рассмотрим еще один тип переменных, называемых статическими локальными переменными. Существуют и статические глобальные переменные, но они ис- пользуются только в многофайловых программах, рассмотрение которых мы от- ложим до главы 13.

Статическая локальная переменная имеет такую же область видимости, как и автоматическая: функцию, к которой принадлежит данная переменная. Одна- ко время жизни у статической локальной переменной иное: оно совпадает со временем жизни глобальной переменной, правда, с той разницей, что существо- вание статической локальной переменной начинается при первом вызове функ- ции, к которой она принадлежит. Далее переменная существует на всем протя- жении выполнения программы.

Статические локальные переменные используются в тех случаях, когда не- обходимо сохранить значение переменной в памяти после того, как выполне- ние функции будет завершено, или, другими словами, между вызовами функций. В следующем примере функция getavg() подсчитывает среднее арифметическое значений, полученных ею, с учетом нового переданного ей значения. Функция запоминает количество переданных ей значений и с каждым новым вызовом увеличивает это значение на единицу. Функция возвращает среднее арифмети- ческое, полученное путем деления суммы всех переданных значений на количе- ство этих значений. Текст программы STATIC приведен в листинге:

// static.cpp

// демонстрирует статические локальные переменные #include <iostream> using namespace std;

float getavg(float);         // прототип функции

int main() {

float data=1, avg;

while( data != 0 )

{

cout << "Введите число: ";

cin >> data;

avg =getavg(data);

cout << "Среднее значение: " << avg << endl;

}

return 0;

}

//--------------------------------------------------------

// функция getavg()

// находит среднее арифметическое всех введенных значений

float getavg(float newdata)

{

static float total = 0; // инициализация статических static int count =0; // переменных при первом вызове count++;             // увеличение счетчика

total += newdata;           // добавление нового значения к сумме

return total/count;         // возврат нового среднего значения

}

Далее приведем пример результата работы программы:

Введите число: 10 Среднее значение: 10 Введите число: 20 Среднее значение: 15 Введите число: 30 Среднее значение: 20

Статические переменные total и count функции getavg() сохраняют свои зна- чения после завершения этой функции, поэтому при следующем вызове этими значениями снова можно пользоваться.

Инициализация

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

Класс памяти

Если вы немного знакомы с тем, как устроена операционная система, то вам, ве- роятно, будет интересен тот факт, что локальные переменные и аргументы функ- ций хранятся в стеке, а глобальные и статические переменные находятся в дина- мической области памяти.

Таблица 5.2. Области видимости и классы памяти переменных

 

Локальная

Статическая локальная

Глобальная

Области видимости

Функция

Функция

Программа

Время жизни

Функция

Программа

Программа

Начальное значение

Случайное

0

0

Область памяти

Стек

Динамическая

Динамическая

Назначение

Переменные, используемые отдельной функцией, уничтожающиеся при выходе из нее

Переменные, используемые отдельной функцией, но сохраняющие свои значения между вызовами функции

Переменные, используемые несколькими функциями

 

32