Что такое статические переменные?

Для чего предназначены статические переменные? Какая разница между static int и int?

Ответ 1

Ключевое слово static имеет четыре отдельных применения, только два из которых тесно связаны:

  • static в глобальной области и пространстве имен (применяется к обеим переменным и функциям) означает внутреннюю привязку
    • это заменяется на неназванные пространства имен и не имеет отношения к остальным
    • в частности, другие склонны подразумевать какую-то уникальность, но внутренняя связь означает противоположность: у вас может быть много объектов с тем же именем, если у каждого есть внутренняя связь, и у вас есть только одна единица перевода
  • статические члены данных "разделяются" между всеми экземплярами класса
    • это больше похоже на то, что они не зависят от экземпляра класса
    • это иногда группируется со статическими методами
  • статические методы не "работают" с текущим экземпляром
    • нет этого указателя; может вызывать без экземпляра
  • статические локальные переменные (в функциях) сохраняются в рамках каждого вызова функции

Оба статических элемента данных и статические локальные переменные могут стать скрытыми глобальными состояниями и должны использоваться осторожно.

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

Я нашел много связанных вопросов, но, что удивительно, нет дубликатов.

Ответ 2

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