Static (C++)
La parola chiave static può essere utilizzata per dichiarare variabili, funzioni, membri dati di classe e funzioni di classe.
Per impostazione predefinita, un oggetto o una variabile definiti all'esterno di tutti i blocchi presentano una durata e un collegamento esterno statici. La durata statica significa che l'oggetto o la variabile viene allocata all'avvio del programma e viene rilasciata alla chiusura del programma. Il collegamento interno significa che il nome della variabile è visibile dal di fuori del file in cui viene dichiarata la variabile. Viceversa, il collegamento interno significa che il nome non è visibile al di fuori del file in cui viene dichiarata la variabile.
È possibile utilizzare la parola chiave static nelle seguenti situazioni:
Quando si dichiara una variabile o una funzione in ambito file (ambito dello spazio dei nomi e/o globale), la parola chiave static specifica che la variabile o la funzione dispone di un collegamento interno. Quando si dichiara una variabile, questa ha una durata statica e il compilatore la inizializza con il valore 0 a meno che non venga specificato un altro valore.
Quando si dichiara una variabile in una funzione, la parola chiave static specifica che la variabile mantiene lo stato tra le chiamate a quella funzione.
Quando si dichiara un membro dati in una dichiarazione di classe, la parola chiave static specifica che una copia del membro è condivisa da tutte le istanze della classe. Un membro dati statici deve essere definito nell'ambito del file. Un membro dati integrato che viene dichiarato come const static può disporre di un inizializzatore.
Quando si dichiara una funzione membro in una dichiarazione di classe, la parola chiave static specifica che la funzione è condivisa da tutte le istanze della classe. Una funzione membro statica non può accedere a un membro di istanza perché la funzione non include un puntatore this implicito. Per accedere a un membro di istanza, dichiarare la funzione con un parametro che è un puntatore o un riferimento all'istanza.
Non è possibile dichiarare i membri di un'unione come static. Tuttavia, un'unione anonima globalmente dichiarata deve essere dichiarata in modo esplicito come static.
Per ulteriori informazioni, vedere auto, extern e register.
Esempio
Di seguito viene illustrato come una variabile dichiarata static in una funzione mantiene il proprio stato tra le chiamate a quella funzione.
// 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 );
}
Nell'esempio seguente viene illustrato l'utilizzo di static in una classe.
// 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;
}
Nell'esempio seguente viene illustrata una variabile locale dichiarata static in una funzione membro. La variabile statica è disponibile per l'intero programma; tutte le istanze del tipo condividono la stessa copia della variabile statica.
Nota
Assegnare un valore a una variabile locale statica in un'applicazione multithreading non è thread-safe e non è una pratica di programmazione consigliata.
// 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);
}