2013-07-17 8 views
11

Ho imparato C++ e ho trovato variabili statiche (ho conoscenza precedente da C89), e nella risorsa che sto usando, hanno dichiarato una variabile statica in una classe come:Inizializzazione variabile statica per le classi in C++, perché includere il tipo di dati?

class nameHere 
{ 
    public: 
     static int totalNum; 
} 

int nameHere::totalNum = 0; 

int main() 
{} 

Per esempio. Quello che non capisco è che, dal momento che ho già dichiarato che la variabile statica è un numero intero nella definizione della classe, perché devo dichiararlo anche come numero intero al di fuori della definizione della classe? sarebbe alcun senso per inizializzare semplicemente in questo modo:

nameHere::totalNum = 0; 

int main() 
{} 

C'è un motivo particolare o semplicemente una convenzione di C++? Grazie per tutto l'aiuto!

+3

Probabilmente lo stesso motivo non si può dire 'SomeClass :: someMemberFunction {...}' per definire un funzione membro. – chris

+1

Vieni a pensarci, potrebbe alleggerire un po 'la sintassi ed evitare quegli errori fastidiosi che sorgono da un errore di battitura o da un identificatore mancante, ma nel caso delle funzioni, almeno, può essere utile mettere 'const' sul valore parametri nella definizione, ma non dichiarazione, anche se potrei abituarmi a fare quest'ultimo se questa sintassi fosse un'opzione. – chris

+0

complicherebbe ulteriormente la grammatica. Esiste già una dichiarazione/espressione di ambiguità, questo porterebbe anche oltre. – Angew

risposta

7

Questo potrebbe (probabilmente) rendere il linguaggio ancora più difficile da analizzare (ed è già quasi follemente difficile da analizzare in ogni caso).

Così com'è, il tipo di dati (int, long, my_class, a prescindere) dice al compilatore che ciò che sta vedendo è l'inizio di una dichiarazione (che, in questo caso, è anche una definizione). Senza di ciò, il compilatore avrebbe un tempo un po 'più difficile per risolvere le cose.

Nel caso specifico delle cose a livello globale, non sarebbe così male, perché a livello globale tutto ciò che si può avere è una serie di dichiarazioni. In qualsiasi altro ambito, tuttavia, le cose sarebbero più difficili (e avere una regola a portata globale, e un'altra in un altro sarebbe davvero brutta).

2

C'è una differenza tra una definizione e una dichiarazione. Mentre la variabile statica nella classe è stata dichiarata, non è stata definita. Il One Definition Rule, spiega le dichiarazioni e le definizioni e stabilisce

In ogni unità di traduzione, un modello, tipo, una funzione o oggetto non possono avere più di una definizione. Alcuni di questi possono avere un numero qualsiasi di dichiarazioni.

Pertanto, quando si dichiara la variabile, è necessario utilizzare il tipo completo dell'oggetto.

3

In C++ 11 si può semplicemente inizializzare la variabile all'interno della classe:

class nameHere 
{ 
    public: 
     static const int totalNum = {0}; 
} 
+0

@Angew, corretto, ho modificato il post –

+3

Puoi farlo anche in C++ 03. Non credo ci siano stati cambiamenti nell'inizializzazione dei membri dei dati statici in C++ 11.La novità è che non si inizializzano membri di dati non statici nel punto di dichiarazione. – juanchopanza

+0

@juanchopanza, Con 'static', è ora possibile inizializzare i tipi non-integral lì finché è un' constexpr'. – chris