2009-10-03 7 views
6

Eventuali duplicati:
Is there a difference in C++ between copy initialization and assignment initialization?Qual è la differenza tra int x = 1 e int x (1) in C++?

Sono nuovo di C++, raramente ho visto persone che utilizzano questa sintassi per dichiarare e inizializzare una variabile:

int x(1); 

ho provato, il compilatore non si sono lamentati e l'output è lo stesso di int x = 1, sono effettivamente la stessa cosa?

Mille grazie a tutti.

+2

Dupe: http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-assignment-initializ –

+0

Non proprio la stessa cosa. Questa domanda sembra essere specificamente sull'inizializzazione dei POD. – Boojum

risposta

13

Sì, per i tipi integrati int x = 1; e int x(1); sono gli stessi.

Quando si costruiscono oggetti di tipo classe, le due diverse sintassi di inizializzazione sono leggermente differenti.

Obj x(y); 

Questo è inizializzazione diretta e istruisce il compilatore per la ricerca di un costruttore inequivocabile che prende y, o qualcosa che y può essere convertito in modo implicito, e usa questo costruttore per inizializzare x.

Obj x = y; 

Questo è copia inizializzazione e al compilatore di creare una temporanea Obj convertendo y e usa costruttore di copia Obj s' per inizializzare x.

Copy inizializzazione del equivale a inizializzazione diretta quando il tipo di y è lo stesso del tipo di x.

Per copia inietta, poiché il temporaneo utilizzato è il risultato di una conversione implicita, i costruttori contrassegnati con explicit non vengono considerati. Il costruttore di copie per il tipo costruito deve essere accessibile ma la copia stessa può essere eliminata dal compilatore come un'opzione di ottimizzazione.

+0

E vale la pena sottolineare che Obj x; x = y; produce ancora un'altra variazione.In questo caso, x verrà costruito come predefinito. Quindi, alla prossima istruzione, verrà chiamato l'operatore di assegnazione. –

+3

Un'altra cosa che vale la pena notare è che consentire a tipi di dati semplici come INT di essere inizializzati in questo modo (con una sintassi analoga all'invocazione di un costruttore di classi) consente ai modelli di funzionare in modo trasparente sia con i tipi POD che con quelli di classe. – Boojum

+1

@Boojum: l'aggiunta di quella funzionalità al linguaggio C++ ha lo scopo di fornire un unico modo per inizializzare gli oggetti di qualsiasi tipo all'interno degli elenchi di inizializzazione. Questo per me è più importante (e comune) dell'inizializzazione all'interno dei template, che potrebbe essere risolta con la sintassi 'Type object = other_object'. –

0

Non sono un esperto in C++, ma se fornisce lo stesso risultato, è importante? Immagino che se tu fossi VERAMENTE interessato, potresti compilare (ma non assemblare) il tuo codice e dare un'occhiata a quale sia la differenza.

Modifica: come è stato menzionato altrove, sono davvero gli stessi per i tipi predefiniti.

+4

Ovviamente conta. Potresti vedere gli stessi risultati, ma ciò potrebbe significare semplicemente che non sai quali effetti collaterali cercare o non sapere su tutti i casi limite che ti daranno risultati diversi. Questa è una domanda molto ragionevole da un programmatore principiante/intermedio. – mob

1

Per i tipi POD, entrambe le istruzioni sono identiche.