2011-11-25 34 views
12

In C e C++ tutte le variabili statiche sono inizializzate di default su ZERO.Perché dovrei inizializzare variabili di classe statiche in C++?

Questo non è il caso di membri di dati di classe statici. Perché?

#include <iostream> 
using namespace std; 

int var; 

class MyClass 
{ 
public: 
    static int classVar; 
}; 
int MyClass::classVar = 0; // Why I have to init it here? 

int main(void) 
{ 
    cout << ::var << endl;   // this is initalized to ZERO by default 
    static int var; 
    cout << var << endl;   // and this also is initalized to Zero 
    cout << MyClass::classVar << endl; 

    return 0; 
} 
+0

Non sei sicuro ** var ** è inizializzato a 0. È possibile, a volte probabile, ma non sicuro. –

+3

@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. –

risposta

21

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]

+2

Non sono sicuro che sia quello che viene chiesto. L'ho letto come "perché devo mettere" = 0; "lì?" – Mat

+0

@Alexandre C .: Sarebbe bello se spiegassi anche perché è necessario. – Nawaz

+3

Quindi, 'int MyClass :: classVar;' dovrebbe già essere sufficiente se si richiede solo l'inizializzazione Zero? Mai provato, ma secondo la Std e una risposta cancellata, in realtà lo fa. – zerm

2

È necessario inizializzare le variabili dei dati delle classi statiche, poiché è necessario indicare al compilatore quale sia il loro valore. Le classi non hanno bisogno di nozione di un valore predefinito.

tipi variabili hanno un "valore zero" logico, per int è 0, per double 0,0 per un string "", ecc Al contrario, le classi non hanno necessariamente un valore predefinito. Si consideri, ad esempio, class Rectangle. Qual è il suo valore zero - un rettangolo con zero quadrato o un rettangolo con lunghezza del lato unità?Per le variabili statiche, un compilatore ti chiede di definire te stesso, quale valore deve avere la tua variabile statica, perché non tutti i tipi di dati possono essere inizializzati con un valore predefinito.

+1

Penso ti stai sbagliando qui: nulla ti impedisce di definire una variabile statica e di non inizializzarla.Se la variabile è un'istanza di una classe, verrà chiamato il suo costruttore. – qdii

+0

La variabile statica deve essere definita.Il costruttore non la inizializzerà. Considera sotto l'esempio ... Se "int test :: k;" sarà commentato non verrà compilato test di classe { pubblico: statico int k; }; test int: ::; int main() { test t; cout << t.k; ritorno 0; } – rakesh

+0

@victor Sì, hai ragione, grazie per averlo notato. La domanda riguardava la definizione di una variabile statica e non la sua inizializzazione. –

Problemi correlati