variabile statica nella dichiarazione o nella definizione della class?

Sono nuovo di C ++.
Ho una class come questa:

class CodeTest { private: static const int TOTAL=100; }; 

TOTAL è una dichiarazione o una definizione ?

Quando stavo leggendo il libro di Scott Meyer, è stato detto che nel file di implementazione abbiamo bisogno di definire qualcosa del tipo:

 const int CodeTest::TOTAL; 

Perché è necessario?

    La dichiarazione in un file di implementazione al di fuori dell’intestazione è necessaria perché altrimenti ogni unità di traduzione che include questa intestazione definirà il proprio object (cioè la propria memoria per la variabile).

    Ciò violerebbe la regola della One Definition . Una conseguenza sarebbe ad esempio che se la variabile fosse cambiata in una unità di traduzione, questa modifica sarebbe invisibile ad altre unità di traduzione. Ora, questo non è rilevante dal momento che la variabile è costante. Tuttavia, prendere il suo indirizzo produrrebbe anche diversi indicatori in diverse unità di traduzione.

    Dato che questo ha suscitato alcune polemiche, ho guardato nello standard e @Nawaz ha ragione, ho sbagliato.

    9.4.2 / 2

    Se un membro di dati static è di tipo integrale const […]. Il membro deve ancora essere definito in un ambito namespace se viene utilizzato nel programma e la definizione dell’ambito dello spazio dei nomi non deve contenere un inizializzatore.

    Quindi quello che hai è una dichiarazione, e la variabile è inizializzata su un valore. Al di fuori della class è necessario definire la variabile, ma non assegnarne un valore.

    La parte con tipo integrale const applica solo a questo caso particolare, ovvero è ansible inizializzare detto tipo all’interno della class, ma tutti static membri dei dati static devono essere definiti all’esterno.

    Per rispondere alla domanda:

    Indipendentemente dal fatto che la definizione sia o non sia richiesta al di fuori della class (a seconda che si usi o meno il membro), qualunque cosa sia all’interno della class (inizializzata o meno) è solo una dichiarazione .

    Prima parte della domanda:

    Questa riga: static const int TOTAL=100; è una dichiarazione seguita da un’inizializzazione.

    TOTAL è un identificatore.

    Seconda parte della domanda

    const int CodeTest::TOTAL è richiesto per inizializzare la variabile.

     static const int TOTAL=100; // is a declaration followed by an initialisation. 

    Dalla sezione standard C ++ 3.1:

    Una dichiarazione introduce i nomi in un’unità di traduzione o redeclar i nomi introdotti dalle precedenti dichiarazioni. Una dichiarazione specifica l’interpretazione e gli attributi di questi nomi.

    Il paragrafo successivo afferma che una dichiarazione è una definizione a meno che …… dichiari un membro statico all’interno di una definizione di class:

     struct X { int a; // defines a static int b; // declares b }; 

    Puoi leggere ulteriori informazioni sulla definizione e sulla dichiarazione qui: SO: Qual è la differenza tra una definizione e una dichiarazione?