Membri dati statici (C++)
Le classi possono contenere membri dati static e funzioni membro. Quando un membro dati viene dichiarato static, una sola copia dei dati viene mantenuta per tutti gli oggetti della classe. (Per ulteriori informazioni, vedere Funzioni Membro Static.
I membri dati statici non fanno parte degli oggetti di un tipo specifico della classe; sono oggetti distinti. Di conseguenza, la dichiarazione di un membro dati statico non è considerata una definizione. Il membro dati viene dichiarato nello scope della classe, ma la definizione viene fatta nello scope file. Questi membri statici hanno collegamento esterno. Questa condizione è illustrata nell'esempio che segue.
// 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.
I membri dati statici possono essere acceduti 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 static esista, non è necessario che tutti gli oggetti di tipo classe esistano. I membri statici possono essere acceduti utilizzando 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; 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 è permesso solo per le funzioni e friend del membro della classe. Queste regole sono descritte in Controllo di accesso membro. l'eccezione è che i membri dati statici devono essere definiti nello scope file indipendentemente dalle restrizioni di accesso. Se il membro dati viene inizializzato in modo esplicito, un inizializzatore deve essere fornito insieme alla definizione.
Il tipo di un membro statico non è qualificato con il nome della classe. Pertanto, il tipo di BufferedOutput::bytecount è long .