ProgrammazioneSviluppatore Backend

Che cos'è un membro statico e un membro non statico di una classe in C++? Quali sono le loro caratteristiche, i metodi di inizializzazione e le regole di utilizzo?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

Storia della domanda

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.

Problema

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

Soluzione

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:

  • I membri statici condividono lo stato tra tutti gli oggetti della classe
  • I membri statici possono essere utilizzati senza creare un'istanza della classe
  • Inizializzazione delle variabili statiche al di fuori della definizione della classe (fino a C++17)

Domande ingannevoli.

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

Errori tipici e antipattern

  • Membri statici non definiti al di fuori della classe (nelle versioni standard precedenti)
  • Utilizzo di membri statici per memorizzare dati dipendenti da ogni oggetto
  • Violazione dell'incapsulamento tramite variabili statiche globali

Esempi dalla vita

Caso negativo

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:

  • Il compilatore non segnala l'annuncio

Svantaggi:

  • Errori di linking
  • Errori di runtime misteriosi, se la variabile è utilizzata prima dell'inizializzazione

Caso positivo

Il membro statico è dichiarato nella classe, definito al di fuori della classe e utilizzato come contatore degli oggetti creati.

Vantaggi:

  • Unico deposito di stato
  • Inizializzazione trasparente e funzionamento corretto

Svantaggi:

  • Possibile condizione di corsa in un ambiente multithread (è necessaria ulteriore protezione)