Static (C++)

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

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

Ключевое слово static можно использовать в следующих случаях.

  • При объявлении переменной или функции в области видимости файла (в глобальной области видимости и (или) области видимости пространства имен) ключевое слово static указывает, что переменная или функция имеет внутреннюю компоновку. При объявлении переменной она имеет статическую длительность и компилятор инициализирует ее со значением 0, если не указано другое значение.

  • При объявлении переменной в функции ключевое слово static указывает, что переменная сохраняет свое состояние между вызовами этой функции.

  • При объявлении данных-члена в объявлении класса ключевое слово static указывает, что всеми экземплярами этого класса совместно используется одна копия этого члена. Статические данные-член должны быть определены в области видимости файла. Целочисленные данные-член, объявляемые как const static, могут иметь инициализатор.

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

  • Объявление членов объединения как статических невозможно. Однако глобально объявляемое анонимное объединение должно явно объявляться как static.

Дополнительные сведения см. в разделах auto, extern и register.

Пример

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

// static1.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
void showstat( int curr ) {
   static int nStatic;    // Value of nStatic is retained
                          // between each function call
   nStatic += curr;
   cout << "nStatic is " << nStatic << endl;
}

int main() {
   for ( int i = 0; i < 5; i++ )
      showstat( i );
}
  

В следующем примере показано использование ключевого слова static в классе.

// static2.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
class CMyClass {
public:
   static int m_i;
};

int CMyClass::m_i = 0;
CMyClass myObject1;
CMyClass myObject2;

int main() {
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   myObject1.m_i = 1;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   myObject2.m_i = 2;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   CMyClass::m_i = 3;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;
}
  

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

Примечание

Присвоение значения статической локальной переменной в многопоточном приложении непотокобезопасно и такой стиль программирования использовать не рекомендуется.

// static3.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
struct C {
   void Test(int value) {
      static int var = 0;
      if (var == value) 
         cout << "var == value" << endl;
      else
         cout << "var != value" << endl;

      var = value;
   }
}; 

int main() {
   C c1;
   C c2;
   c1.Test(100);
   c2.Test(100);
}
  

См. также

Ссылки

Ключевые слова в C++

Классы хранения в C++

Спецификаторы статических классов хранения

Статические функции-члены

Управление доступом и статические члены