Condividi tramite


Membri statici (C++)

Le classi possono contenere membri dati statici e funzioni membro. Quando un membro dati viene dichiarato come static, viene mantenuta una sola copia dei dati per tutti gli oggetti della classe .

I membri dati statici non fanno parte degli oggetti di un tipo specifico della classe. Di conseguenza, la dichiarazione di un membro dati statico non è considerata una definizione. Il membro dati viene dichiarato nell'ambito della classe, ma la definizione viene fatta nell'ambito del file. Questi membri statici hanno collegamento esterno. L'esempio seguente illustra questi concetti.

// static_data_members.cpp
class BufferedOutput
{
public:
   // Return number of bytes written by any object of this class.
   short BytesWritten()
   {
      return bytecount;
   }

   // Reset the counter.
   static void ResetCount()
   {
      bytecount = 0;
   }

   // Static member declaration.
   static long bytecount;
};

// Define bytecount in file scope.
long BufferedOutput::bytecount;

int main()
{
}

Nel codice precedente, il membro bytecount è dichiarato nella classe BufferedOutput, ma deve essere definito all'esterno della dichiarazione della classe.

Ai membri dati statici è possibile accedere senza fare riferimento a un oggetto di tipo classe. Il numero di byte scritti utilizzando oggetti BufferedOutput può essere ottenuto come segue:

long nBytes = BufferedOutput::bytecount;

Affinché il membro statico esista, non è necessario che esistano tutti gli oggetti di tipo classe. È anche possibile accedere ai membri statici usando gli operatori di selezione dei membri (. e ->). Ad esempio:

BufferedOutput Console;

long nBytes = Console.bytecount;

Nel caso precedente, il riferimento all'oggetto (Console) non viene valutato e il valore restituito è quello dell'oggetto statico bytecount.

I membri dati statici sono soggetti alle regole di accesso al membro di classe, pertanto l'accesso privato ai membri dati statici è consentito solo per le funzioni friend e membro della classe. Queste regole sono descritte in Member-Controllo di accesso. L'eccezione è costituita dal fatto che i membri dati statici devono essere definiti nell'ambito del file indipendentemente dalle restrizioni di accesso. Se il membro dati viene inizializzato in modo esplicito, insieme alla definizione deve essere fornito un inizializzatore.

Il tipo di un membro statico non è qualificato dal nome della classe. Di conseguenza, il tipo di BufferedOutput::bytecount è long.

Vedi anche

Classi e struct