ProgrammazioneSviluppatore backend C++

Parla del lavoro dei membri statici (variabili e funzioni) in una classe. Come vengono inizializzati i membri statici, quali difficoltà sorgono nella loro definizione e utilizzo, e in cosa i membri statici si differenziano dai membri normali della classe?

Supera i colloqui con l'assistente IA Hintsage

Risposta

I membri static di una classe esistono in un'unica istanza per l'intera classe, un valore comune per tutti gli oggetti.

  • Le variabili statiche vengono inizializzate al di fuori della classe, solitamente nel file cpp, al di fuori della classe (int Foo::count = 0;). All'interno della classe noi dichiaramo, mentre definiamo al di fuori.
  • Le funzioni statiche possono essere chiamate sia attraverso la classe che attraverso un oggetto. Non hanno accesso ai membri di un'istanza specifica (this), possono accedere solo ad altri membri statici.

Esempio di codice

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 }

Domanda trabocchetto

«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.


Esempi di errori reali dovuti alla mancata conoscenza delle complessità dell'argomento.


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.