2011-11-20 13 views
5

Da questo answer, in C++ 03, un tipo POD viene inizializzato di default se () viene omesso altrimenti viene inizializzato a valore.Inizializzazione predefinita e Valore inizializzato

// POD type 
struct foo { 
    int x; 
}; 

// value-initialized 
new foo(); 

Ma se viene fornito un costruttore definito dall'utente, uno degli oggetti seguenti verrà considerato come predefinito o inizializzato per valore?

// non-POD type 
struct bar { 
    bar(int x = 0):x(x) {} 
    int x; 
}; 

new bar(); 
new bar(42); 
+1

Nel tuo esempio, entrambe le chiamate al costruttore 'bar' danno come risultato un valore durante l'inizializzazione di' x'. – Chad

risposta

2

Se la classe ha un costruttore predefinito definito dall'utente, l'inizializzazione di default e di valore causa il richiamo del costruttore. Qualsiasi cosa accade poi spetta al costruttore:

struct UDT 
{ 
    int a; 
    int b; 
    Foo c; 
    Foo d; 
    UDT() : a(), c() {} 
}; 

Sia difetto ed inizializzazione valore di un oggetto di classe UDT causerà UDT::a e UDT::c di essere valore-inizializzato (così a è zero) perché la lista di inizializzazione dice, mentre UDT::b e UDT::d sono inizializzati di default (quindi b non è inizializzato, e per d applica la stessa logica in modo ricorsivo).

Per dettagli sull'inizializzazione, vedere 8.5 e sugli elenchi di inizializzatori vedere 12.6.2 (in particolare clausola 8).

3

In C++ 03, un tipo POD viene inizializzato di default if() viene omesso altrimenti viene inizializzato a valore.

Questo non è esattamente quello che succede. Secondo la specifica C++ 03, sezione 8.5/9, se non è specificato alcun inizializzatore per un oggetto di tipo POD non statico, allora esso e i suoi sotto oggetti "hanno un valore iniziale indeterminato". Questo è non la stessa cosa dell'inizializzazione di default. L'inizializzazione di default è la stessa cosa dell'inizializzazione del valore per un tipo POD, il che significherebbe che l'oggetto è inizializzato a zero (8.5/5), ma ciò può avvenire solo con la presenza di un inizializzatore vuoto (ad esempio, parentesi vuota per 8.5/7). Pertanto è possibile solo inizializzare e/o inizializzare il valore di un tipo POD con un inizializzatore vuoto. L'inizializzazione predefinita per un tipo POD non statico non si verifica quando non viene specificato alcun inizializzatore.

Nel secondo esempio, con il tipo non POD che ha il costruttore definito dall'utente, l'inizializzazione di default avverrebbe tecnicamente se si omettono i simboli inizializzatore del valore (parentesi). In altre parole:

bar* ptr_a = new bar; //default initialization 
bar* ptr_b = new bar(); //value initialization 

tener presente però che sia non-POD struct o classi tipi, se v'è un costruttore definito dall'utente, default-inizializzazione e valore di inizializzazione, per 8,5/5, sia chiamata il costruttore definito dall'utente. Quindi, alla fine, con il tipo bar come lo hai dichiarato, l'inizializzazione di default e valore finisce per fare la stessa cosa.

Problemi correlati