A perimetro classe,
int MyClass::classVar = 0; // Why I have to init it here?
è una definizione e
static int classVar;
è una dichiarazione , cioè. una promessa la variabile sarà definita da qualche parte: è necessario definire esattamente una volta le variabili dichiarate.
Il razionale è che la dichiarazione di classe sarà probabilmente inclusa in più file sorgente. Se una parte di essa fosse una definizione, si avrebbe una moltiplicazione: questo è errato (le eccezioni sono funzioni in linea [membro]).
nota che in base alle leggi di inizializzazione valore, è possibile andare d'accordo con
int MyClass::classVar; // Zero-initialized !
come definizione.
variabili dichiarate a perimetro dello spazio dei nomi sono definizioni troppo (a meno che siano extern
qualificati):
int var;
è una dichiarazione, e una definizione: se si mette questo in un colpo di testa e includerlo in più unità di traduzione, hai un errore ("simbolo con più simboli" o qualcosa del genere).
[Si noti che in C++ (e non in C), se il var
sopra è const
, diventa automaticamente static
e non v'è alcuna violazione della Regola Una definizione dovrebbe essere messo in un colpo di testa si moltiplicano incluso. Questo va un po 'fuori tema, ma non esitate a chiedere i dettagli]
fonte
2011-11-25 10:43:17
Non sei sicuro ** var ** è inizializzato a 0. È possibile, a volte probabile, ma non sicuro. –
@AlessandroPezzato: In realtà, lo standard è esplicito sull'azzeramento della memoria per tutte le variabili globali prima dell'esecuzione dell'inizializzazione dinamica ... a parte quelle built-in a cui è interessato un valore letterale, quelle che penso possano essere influenzate direttamente (sotto come-se regola) poiché non è osservabile. –