Урок 51. Статические переменные

   ⁄ 

 Обновлено 14 Апр 2017

  ⁄   

Ключевое слово static является одним из самых запутанных в языке C++. Оно имеет разные значения в разных ситуациях.

В уроке о глобальных переменных мы узнали, что добавляя static к переменной, объявленной вне блока, мы определяем её как внутреннюю, то есть такую, которую можно использовать только в файле, в котором она определена.

Ключевое слово static можно применять и к переменным внутри блока, но тогда его значение будет другим. В уроке о локальных переменных и локальной области видимости мы узнали, что локальные переменные имеют автоматическую продолжительность, то есть они создаются, когда блок начинается, и уничтожаются при выходе из него.

Использование ключевого слова static с локальными переменными изменяет их свойство продолжительности из автоматического в статическое (или фиксированное). Статическая переменная (или еще «переменная со статической продолжительностью») сохраняет свое значение даже после выхода из блока, в котором она определена. То есть она создается (и инициализируется) только один раз, а затем сохраняется на протяжении всей программы.

Рассмотрим разницу между переменными с автоматической и статической продолжительностями.

Автоматическая продолжительность (по умолчанию):

Каждый раз, при вызове функции incrementAndPrint(), создается переменная value, которой присваивается значение 1. incrementAndPrint() увеличивает значение переменной к 2, а затем выводит его. Когда incrementAndPrint() завершает свое выполнение, переменная выходит из области видимости и уничтожается. Следовательно, результат работы программы:

2
2
2

Теперь рассмотрим статическую версию. Единственная разница между этими двумя программами только в добавлении ключевого слова static к переменной.

Статическая продолжительность:

Поскольку s_value объявлен как static, то переменная создается и инициализируется только один раз. Но выходя из области видимости, она не уничтожается. Каждый раз, при вызове функции incrementAndPrint(), значение s_value увеличивается. Смотрим:

2
3
4

Так же, как мы используем префикс «g_» с глобальными переменными, префикс «s_» принято использовать со статическими переменными. Обратите внимание, внутренние глобальные переменные (также объявленные с использованием static) остаются с префиксом «g_», а не «s_».

Зачем нужны статические локальные переменные? Одним из наиболее распространенных применений является генерация уникальных идентификаторов. При работе с большим количеством одинаковых объектов внутри программы часто бывает полезно присвоить каждому объекту отдельный уникальный идентификационный номер. Это легко осуществить, используя одну статическую локальную переменную:

При первом вызове функции возвращается 0. Во второй раз возвращается 1. Затем 2 и каждый следующий раз число будет увеличиваться на единицу. Хороший способ генерации уникальных идентификаторов для похожих объектов? Хороший! Поскольку s_itemID — это локальная переменная, то она не может быть «изменена» другими функциями.

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

Тест

Какой эффект от добавления ключевого слова «static» к глобальной переменной? Какое влияние оно имеет на локальную переменную?

Ответ

Добавляя ключевое слово static к глобальной переменной, мы определяем её как внутреннюю, то есть такую, которую нельзя экспортировать и использовать в других файлах.

В случае с локальной переменной, добавление static определяет её как статическую, то есть она создается и инициализируется только один раз и не уничтожается до самого конца программы.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (8 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *