Sdílet prostřednictvím


Static (C++)

Klíčové slovo static lze použít k deklarování proměnných, funkcí, tříd datových členů a funkcí třídy.

Standardně má objekt nebo proměnná, které jsou definovány mimo všechny bloky, statické trvání a vnější spojení.Statické trvání znamená, že objekt nebo proměnná jsou přiděleny po spuštění programu a přidělení se zruší spolu s ukončením programu.Externí propojení znamená, že je jméno proměnné viditelné z vnějšku souboru, ve kterém je deklarována.Naopak interní propojení znamená, že jméno proměnné není viditelné z vnějšku souboru, ve kterém je deklarována.

Klíčové slovo static lze použít v následujících situacích.

  • Pokud deklarujete proměnnou nebo funkci v rozsahu souboru (globální nebo obor názvů), klíčové slovo static určuje, že proměnná nebo funkce má vnitřní propojení.Při deklarování proměnné proměnná obsahuje statické trvání a kompilátor inicializuje ji na hodnotu 0, pokud neurčíte jinou hodnotu.

  • Při deklaraci proměnné ve funkci určuje klíčové slovo static, že proměnná zůstane ve stavu mezi volání této funkce.

  • Když deklarujete datový člen v deklaraci třídy, klíčové slovo static určuje, že jedna kopie člena je sdílena všemi instancemi třídy.Statický datový člen musí být definován v rozsahu souboru.Integrální datový člen, který deklarujete jako conststatic může mít inicializátor.

  • Když deklarujete člena funkce v deklaraci třídy, klíčové slovo static určuje, že funkce je sdílena všemi instancemi třídy.Funkce statického členu nemůže přistupovat k členu instance, protože funkce nemá implicitní ukazatel this.Chcete-li získat přístup k instanci člena, deklarujte funkci s parametrem, který je instancí ukazatele nebo odkazu.

  • Nelze deklarovat členy unie jako statické.Nicméně globálně deklarované anonymní sjednocení musí být explicitně deklarováno jako static.

Další informace naleznete v tématu auto, extern, a register.

Příklad

Následující příklad ukazuje, jak si deklarovaná proměnná static ve funkci zachová svůj stav mezi voláními dané funkce.

// 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 );
}
  

Následující příklad ukazuje použití static ve třídě.

// 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;
}
  

Následující příklad ukazuje místní proměnnou deklarovanou jako static v členské funkci.Statická proměnná je k dispozici pro celý program; všechny instance daného typu sdílí stejnou kopii statické proměnné.

[!POZNÁMKA]

Přiřazení hodnoty ke statické místní proměnné v aplikaci s více vlákny není bezpečné vůči vláknům a nedoporučuje se jako postup programování.

// 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);
}
  

Viz také

Referenční dokumentace

Klíčová slova jazyka C++

Třídy úložiště jazyka C++

Statické specifikátory třídy úložiště

Statické členské funkce

Řízení přístupu a statické členy