2012-01-14 12 views
10

Eventuali duplicati:
What do the following phrases mean in C++: zero-, default- and value-initialization?Cosa significa "inizializzare il valore"?

Se ho una classe, ad esempio:

class Info 
{ 
    int x; 
    int y; 
}; 

che ho usato per creato un oggetto,

Info *p = new Info(); 

Le parentesi accanto a Info significano che sto inizializzando il valore? In cosa differisce da questo, Info *p = new Info;?

So che esiste uno question che distingue tra diversi significati nel linguaggio C++ nuovo e vecchio ma voglio conoscere la differenza semantica tra l'inizializzazione di default e del valore, ad es. L'inizializzazione del valore significa inizializzare qualcosa a zero?

+0

possibile duplicato di [Che cosa significano le seguenti frasi in C++: inizializzazione a zero, default e valore?] (Http://stackoverflow.com/questions/1613341 /), [Differenza tra default-initialize e value-initialize in C++ 03?] (Http://stackoverflow.com/questions/7084831/). – outis

risposta

19

Un dichiarata variabile può essere Zero Initialized, Valore Initialized o predefinito Initialized.

Nel tuo esempio:

Info *p = new Info(); <------- Value Initialization 
Info *p = new Info;  <------- Default Initialization 

Il C++ 03 standard 8,5/5 definisce giustamente ogni:

Per zero inizializzare un oggetto di tipo T significa:

- se T è un tipo scalare (3.9), l'oggetto è impostato sul valore di 0 (zero) convertito in T;
- se T è un tipo di classe non di unione, ogni membro di dati non statici e ogni sottoclasse di classe base
viene inizializzato a zero;
- se T è un tipo di unione, il primo membro dati denominato dell'oggetto viene inizializzato a zero;
- se T è un tipo di matrice, ogni elemento è inizializzato a zero;
- se T è un tipo di riferimento, non viene eseguita alcuna inizializzazione.

Per default-inizializzare un oggetto di tipo T significa:
- se T è un non-POD tipo di classe (clausola 9), il costruttore predefinito per T è chiamato (e l'inizializzazione è mal formata se T non ha un costruttore predefinito accessibile);
- se T è un tipo di matrice, ogni elemento viene inizializzato di default;
- in caso contrario, l'oggetto viene inizializzato a zero.

Per valore-inizializzare un oggetto di tipo T significa:
- se T è un tipo di classe (clausola 9) con un costruttore dall'utente dichiarato (12.1), quindi viene chiamato il costruttore predefinito per T (e l'inizializzazione è mal formata se T non ha un costruttore predefinito accessibile da );
- se T è un tipo di classe non di unione senza un costruttore dichiarato dall'utente, quindi ogni membro di dati non base statico di T è inizializzato a valore;
- se T è un tipo di matrice, ogni elemento viene inizializzato in base al valore;
- altrimenti, l'oggetto è inizializzato a zero

+0

Als - Risposta molto buona - mi ha salvato scrivendo! –

+0

Nel mio caso, la classe 'Info' è di tipo POD. Significa che l'inizializzazione predefinita sarà zero inizializzazione? – user1086635

+0

@ user1086635: Sì. È chiaramente menzionato nel secondo paragrafo della citazione standard sopra. –