Condividi tramite


Statica (C++)

static la parola chiave può essere utilizzata per dichiarare variabili, le funzioni, i membri dati di classi e le funzioni della classe.

Per impostazione predefinita, un oggetto o una variabile definiti all'esterno di tutti i blocchi della durata statica e collegamento esterno.La durata statica significa che l'oggetto o la variabile viene allocato quando il programma viene avviato e viene rilasciato quando il programma termina.Il collegamento esterno significa che il nome della variabile è visibile all'esterno del file in cui la variabile è dichiarata.Viceversa, il collegamento interno significa che il nome non è visibile all'esterno del file in cui la variabile è dichiarata.

static la parola chiave può essere utilizzata nelle situazioni seguenti.

  • Quando si dichiara una variabile o una funzione in ambito file (ambito dello spazio dei nomi e/o globale), static la parola chiave specifica che la variabile o la funzione presenta un collegamento interno.Quando si dichiara una variabile, la variabile abbia durata statica e il compilatore quindi inizializzata su 0 a meno che non venga specificato un altro valore.

  • Quando si dichiara una variabile in una funzione, static la parola chiave specifica che la variabile conserva lo stato tra le chiamate alla funzione.

  • Quando si dichiara un membro dati in una dichiarazione di classe, static la parola chiave specifica che una copia del membro è condivisa da tutte le istanze della classe.Un membro dati statici deve essere definito in ambito file.Un membro dati integrato che dichiarate come conststatic può disporre di un inizializzatore.

  • Quando si dichiara una funzione membro in una dichiarazione di classe, static la parola chiave specifica che la funzione è condivisa da tutte le istanze della classe.Una funzione membro statica non può accedere a un membro di istanza poiché la funzione non dispone di un implicito this puntatore.Per accedere a un membro di istanza, dichiararla 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 esplicitamente dichiarata static.

Per ulteriori informazioni, vedere autoidentificatori, esternoe il registro.

Esempio

Nell'esempio seguente viene illustrato come una variabile dichiarata static in una funzione mantiene lo stato tra le chiamate alla 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 nella 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 il programma di tutto; 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 la si consiglia come pratica di programmazione.

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

Vedere anche

Riferimenti

Parole chiave C++

Classi di archiviazione C++

Identificatori statici della classe di archiviazione

Funzioni membro static

Membri di istanza e statici di controllo di accesso