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

  Юрий  | 

    | 

  Обновл. 17 Апр 2019  | 

 16612

Ключевое слово 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 (114 оценок, среднее: 4,92 из 5)
Загрузка...

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

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