I membri static di una classe esistono in un'unica istanza per l'intera classe, un valore comune per tutti gli oggetti.
int Foo::count = 0;). All'interno della classe noi dichiaramo, mentre definiamo al di fuori.this), possono accedere solo ad altri membri statici.class Counter { public: static int count; static void increment() { ++count; } }; int Counter::count = 0; int main() { Counter::increment(); Counter c1, c2; c1.increment(); // count == 2 }
«La definizione di un membro statico può essere all'interno di un file header? Quali rischi sorgono?»
Risposta: Sì, la definizione (int Foo::value = 0;) all'interno dell'header è tecnicamente possibile, ma se questo header viene incluso in più translation units, porta a duplicazioni (multiple definition), causando errori di linking. Pertanto, i membri statici dovrebbero essere definiti solo in un file cpp.
Storia
Nel codice di libreria, un membro statico è stato definito direttamente nel file header. L'inclusione multipla ha portato a errori di linking: "multiple definition of ...". Dopo aver spostato la definizione in un file cpp separato, il problema è scomparso.
Storia
In un progetto educativo, un membro statico è stato dichiarato, ma si è dimenticato di definirlo nel file cpp esterno. Nonostante l'assenza di errori durante la compilazione degli header, è stato causato un errore di simbolo esterno non risolto durante il linking. È stato necessario cercare e aggiungere la definizione mancante.
Storia
In un grande sistema embedded, è stata implementata in modo errato l'inizializzazione di un membro statico con un valore calcolato (si è tentato di inizializzare tramite un'espressione che richiede l'esecuzione del codice). La logica è stata separata in una funzione di inizializzazione, ma per distrazione si è dimenticato di chiamare questa funzione prima del primo accesso — il risultato sono state variabili non inizializzate e comportamenti erratici.