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