In C++, le classi possono avere membri statici e non statici (variabili e funzioni). Sono stati introdotti per supportare dati comuni (per tutti gli oggetti della classe), così come per funzioni che non necessitano di accesso allo stato di un'istanza specifica.
È importante distinguere tra membri statici e non statici, poiché hanno cicli di vita, ambiti di visibilità e regole di inizializzazione diversi. Gli errori comuni includono: definizione errata, utilizzo simultaneo di membri di istanza e statici, e definizioni ripetute negli header.
Le variabili statiche di classe sono dichiarate all'interno della classe come static, ma devono essere definite separatamente al di fuori della classe (fino a C++17). Esistono in un'unica istanza. Le funzioni statiche non hanno accesso ai membri non statici (di istanza) senza una specifica indicazione.
Esempio di codice:
class Counter { public: static int count; Counter() { ++count; } static void Reset() { count = 0; } }; int Counter::count = 0;
Caratteristiche principali:
È possibile inizializzare una variabile statica di classe all'interno della classe (fino a C++17)?
No, fino a C++17 per un membro statico è necessaria una definizione al di fuori della classe. In C++17 e versioni successive è possibile una definizione inline direttamente all'interno della classe.
// C++17 class Foo { inline static int counter = 0; };
Ha una funzione static della classe accesso a this o ai membri non statici?
No, i membri statici non hanno accesso ai membri non statici o a this, anche se vengono creati istanze della classe. Per accedere è necessario passare esplicitamente l'oggetto.
Un membro statico di classe sarà creato per ogni istanza della classe?
No, i membri statici esistono in un'unica istanza per tutta la classe indipendentemente dal numero di oggetti.
Un sviluppatore dichiara static int in una classe, ma non la definisce al di fuori della classe. Il linker genera un errore di simbolo indefinito, poiché il membro statico non è inizializzato.
Vantaggi:
Svantaggi:
Il membro statico è dichiarato nella classe, definito al di fuori della classe e utilizzato come contatore degli oggetti creati.
Vantaggi:
Svantaggi: