Поделиться через


Статический (C++)

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

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

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

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

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

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

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

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

Дополнительные сведения см. в разделе Авто" externи регистр.

Пример

В следующем примере показано, как переменная объявила 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 в функции-члене.Статическая переменная доступна для всей программы; все экземпляры типа совместно используют одну копию статической переменной.

ПримечаниеПримечание

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

// 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++

Статические описатели Хранени-Класса

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

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