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.
Nel tuo esempio, entrambe le chiamate al costruttore 'bar' danno come risultato un valore durante l'inizializzazione di' x'. – Chad