2009-10-03 11 views
6

Mögliche Duplizieren:
Is there a difference in C++ between copy initialization and assignment initialization?Was ist der Unterschied zwischen int x = 1 und int x (1) in C++?

Ich bin neu in C++, ich sehe selten Menschen mit dieser Syntax eine Variable zu deklarieren und initialisieren:

int x(1); 

Ich habe versucht, den Compiler nicht meckern und die Ausgabe ist das gleiche wie Int x = 1, sind sie eigentlich das Gleiche?

Vielen Dank an euch alle.

+2

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

+0

Nicht ganz das Gleiche. Diese Frage scheint sich speziell auf die Initialisierung von PODs zu beziehen. – Boojum

Antwort

13

Ja, für eingebaute Typen int x = 1; und int x(1); sind die gleichen.

Beim Erstellen von Objekten des Klassentyps unterscheiden sich die beiden verschiedenen Initialisierungssyntaxen geringfügig.

Obj x(y); 

Dies ist direkte Initialisierung und weist den Compiler für eine eindeutige Konstruktor zu suchen, die y nimmt, oder etwas, das y kann implizit konvertiert werden, und verwendet diesen Konstruktor x zu initialisieren.

Obj x = y; 

Dies ist Kopie Initialisierung und weist den Compiler eine temporäre Obj durch Umwandlung y und verwendet Obj ‚s Copykonstruktor erstellen x zu initialisieren.

Copy initialisiert entspricht direkte Initialisierung wenn die Art des y gleich wie die Art der x ist.

Für Kopie Initialisierung, da das temporäre verwendet das Ergebnis einer impliziten Konvertierung ist, Konstruktoren markiert explicit werden nicht berücksichtigt. Der Kopierkonstruktor für den konstruierten Typ muss zugänglich sein, aber die Kopie selbst kann vom Compiler als Optimierung eliminiert werden.

+0

Und es ist erwähnenswert, dass Obj x; x = y; produziert noch eine andere Variante.In diesem Fall wird x standardmäßig erstellt. Dann wird bei der nächsten Anweisung der Zuweisungsoperator aufgerufen. –

+3

Eine andere Sache, erwähnenswert ist, dass die Möglichkeit plain-old-Datentypen wie int auf diese Weise initialisiert werden (mit einer Syntax analog Aufruf einer Klassenkonstruktors) ermöglicht Vorlagen transparent Typen sowohl mit POD und Klasse zu arbeiten. – Boojum

+1

@Boojum: Das Hinzufügen dieses Features zur C++ - Sprache sollte eine einzige Möglichkeit zur Initialisierung von Objekten beliebigen Typs in Initialisierungslisten bieten. Dies ist für mich wichtiger (und gebräuchlicher) als die Initialisierung in Templates, die mit der Syntax 'Type object = other_object' gelöst werden könnte. –

0

Ich bin kein C++ Experte, aber wenn es das gleiche Ergebnis gibt, spielt es eine Rolle? Ich denke, wenn Sie wirklich interessiert waren, könnten Sie Ihren Code kompilieren (aber nicht zusammenstellen) und sich ansehen, was der Unterschied ist.

Edit: Wie bereits erwähnt, sind sie wirklich für eingebaute Typen identisch.

+4

Natürlich ist es wichtig. Sie sehen möglicherweise die gleichen Ergebnisse, aber das könnte bedeuten, dass Sie nicht wissen, welche Nebenwirkungen Sie suchen oder welche nicht, um alle Randfälle zu erkennen, die Ihnen andere Ergebnisse liefern würden. Dies ist eine sehr vernünftige Frage von einem Anfänger/Fortgeschrittenen Programmierer. – mob

1

Bei POD-Typen sind beide Anweisungen identisch.

Verwandte Themen