ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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 |
|
Область памяти |
Стек |
Динамическая |
Динамическая |
|
Назначение |
Переменные, используемые отдельной функцией, уничтожающиеся при выходе из нее |
Переменные, используемые отдельной функцией, но сохраняющие свои значения между вызовами функции |
Переменные, используемые несколькими функциями |
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
