2015-08-23 10 views
13

Ho solo recentemente iniziato ad imparare C++ come parte del mio decimo programma di studio, e sono a conoscenza solo delle basi , quindi le risposte semplici (se possibile) saranno apprezzate. Sono piuttosto confuso tra l'inizializzazione e l'assegnazione.Differenza tra vari inizializzatori in C++

//Case 1 
int a=5; //This is initialization 
a=6; //This is assignment 

Da quello che ho capito, una variabile viene inizializzata quando si dà un valore di tenere mentre dichiararla. Cambiare questo più avanti nel codice sarà un compito. Destra?

Che dire:

//Case 2 
int b; 
{ 
//Block of code which does not call variable b 
. 
. 
. 
//End of block 
} 
b=6; // Is this initialization as well? 

Mentre 'b' è inizializzata quando dichiariamo, abbiamo poi assegniamo il valore '6'. Possiamo dire che la 'b' è inizializzata ora? O i termini inizializzati e non inizializzati non sono più applicabili a "b"?

Ho letto che una variabile non inizializzata contiene "garbage values" finché non è inizializzata. Cosa sono esattamente i "valori spazzatura"?

Qual è la differenza tra i seguenti inizializzatori: '()', '{}' e '='?

+0

Questo sembra rilevante: http://herbsutter.com/2013/05/09/gotw-1-solution/ – Michael

+0

La domanda è troppo ampia. Una domanda per domanda per favore. Ho risposto alla prima parte. Ci sono domande esistenti per la tua parte "qual è la differenza". –

risposta

10

Va bene, una volta che si dichiara una variabile senza assegnare alcun valore, come

int b; 

che significa che il compilatore riserva po 'di spazio in memoria per contenere il valore (per l'esattezza, in questo caso la memoria è riservato in pila). Ma dal momento che non hai assegnato alcun valore alla variabile, mantiene ancora il valore, che lo spazio assegnato in memoria aveva prima. E questo può essere qualsiasi cosa. Quelli sono valori spazzatura.

Initializers:

int b(1); 

assegna il valore 1 per essere (in generale, chiama un costruttore del tipo)

Le staffe possono essere utilizzate per inizializzare array come questo (modifica):

int b[] = {1, 3, 5, 7}; 

E il = assegna solo un valore. La differenza tra questo e il primo sarà interessante solo quando si tratta di tipi più complessi (classi), dove si hanno i costruttori

+0

Grazie per la spiegazione sui valori obsoleti e gli inizializzatori. Potresti dirmi se il caso 2 è un esempio di inizializzazione? Inoltre, quali sono i costruttori che hai menzionato prima? – Cysearo

+0

Sì, il caso 2 sarebbe stato inizializzato. Per quanto riguarda il costruttore, quello sarebbe un argomento abbastanza grande. Quando vuoi leggerlo, puoi trovare molti tutorial su internet, come questo: http://www.tutorialspoint.com/cplusplus/cpp_constructor_destructor.htm – PeterO

+5

Ehm, no. Il caso 2 è un compito. L'inizializzazione può avvenire solo in un punto di definizione (eccetto per init-bases-members). –

5

Easilly parlato:

Uninitialize variabili:

int a; 

Sei dichiarare una variabile che significa allocare memoria ma non assegnargli un valore. Quindi il suo compilatore dipende se il valore è impostato su 0 o meno. Quindi potrebbe esserci qualcosa dentro. Ecco come hai chiamato i valori spazzatura.

variabile Initialized:

Sei dichiarare una variabile che significa che si alloca la memoria e assigne un valore ad essa.

Valori Assigne:

a = 10; 

È assigne un rvalue (in questo caso 10) ad un lvalue (a). Quindi non assegnerai nuova memoria.

5

Hai praticamente ragione.

Alcuni vecchi testi chiamano il primo compito a una variabile non inizializzata e una "inizializzazione", sebbene ciò non sia strettamente accurato.

"Valori immondizia" sono valori arbitrari. Potrebbero sembrare significativi o potrebbero essere totalmente casuali.

3

L'inizializzazione serve per inizializzare un valore non inizializzato.

Si può fare il mio mezzo di costruttore di copia, vale a dire int a = 1; o int a(1);, può essere fatto per mezzo di assegnazione, vale a dire int a; a = 1;, può essere fatto tramite una funzione, vale a dire int a; init(a);. L'inizializzazione non è una "cosa linguistica", è solo l'atto di specificare un valore non specificato.

Un "valore immondizia" è un valore arbitrario. Un po 'di spazio verrà dato all'oggetto non inizializzato e il tentativo di leggerlo produrrà il valore di ciò che è accaduto in quella memoria.