2010-12-21 5 views
8

Ich bin ziemlich sicher, dass dies schon einmal gefragt wurde, aber ich kann nicht für das Leben von mir finden es über die Suche.C++ Instanziieren Sie ein Objekt aus einer Klasse zwei verschiedene Möglichkeiten

hier So geht es:

Was zwischen den Unterschied ist:

MyObj myObj; 

und

MyObj myObj = MyObj(); 

Ich glaube, beide das gleiche Ergebnis erzielen, ist aber ein besser zu nutzen als die andere ? Angenommen, alles, was ich will, ist der Standardkonstruktor.

* bearbeiten - Ich habe gehört, dass die erste geeigneter ist, da die zweite zuerst ein Objekt über den Standardkonstruktor erstellt, dann eine Zuordnung zu myObj. Die erste ist keine Zuweisung, also wäre die erste "schneller". Wahrheit?

+0

Ähnlich, aber nicht ganz dasselbe wie: http: // stackoverflow.com/questions/1581763/difference-zwischen-a-pa-neu-a-und-ein-neu-a –

Antwort

9

Ja, es kann einen Unterschied geben.

In der ersten Instanz wird myObj nicht initialisiert, wenn es sich um einen POD-Typ handelt, andernfalls wird standardmäßig initialisiert.

Im zweiten Fall ist myObjcopy-initialisierten von einem Wert initialisierten vorübergehend. Das temporäre kann (und fast sicher sollte) eliminiert werden, um den Effekt Wert-Initialisierung zu machen.

Wenn MyObj einen Konstruktor hat, wird immer ein Konstruktor aufgerufen. Für den ersten Fall muss ein Standardkonstruktor zugänglich sein, für den zweiten müssen sowohl die Kopier- als auch die Standardkonstruktoren zugänglich sein, obwohl nur der Standardkonstruktor aufgerufen werden darf.

Neben den offensichtlichen Unterschied zwischen „nicht initialisiert“ und Wert initialisiert für POD-Typen gibt es einen Unterschied zwischen default-initialisiert und Wert initialisiert für Nicht-POD-Typen ohne User- definierte Konstruktoren. Für diese Typen werden POD-Member nicht initialisiert in default-initialization sondern 0-initialisiert in Wert-Initialisierung der übergeordneten Klasse.

4

Ersteres ist eine Deklaration, letzteres eine Initialisierung.

Wenn MyObj kein POD ist, dann gibt es keinen Unterschied, außer dass ein Kopierkonstruktor existieren muss und im letzteren Fall erreichbar sein muss (auch wenn er nicht aufgerufen wird).

Wenn MyObj ein POD ist, initialisiert es das POD nicht, Inhalt von MyObj-Mitgliedsvariablen wird nicht angegeben. Letzteres ist der einzige Weg, um ein nicht-aggregiertes POD 'null' zu initialisieren.

+0

Hab den Standard nicht nachgeschlagen. Aber wäre die zweite nicht "Deklaration und Initialisierung"? –

+0

Technisch ist die erstere eine Definition ... –

+0

Beide sind Deklarationen, da jede Definition eine Deklaration ist und beide Definitionen sind. Der zweite Teil dieser Antwort widerspricht dem letzten Satz von Charles 'Antwort (dies sagt, es gibt keinen Unterschied, Charles sagt, es gibt einen Unterschied, wenn der Standardkonstruktor vom Compiler generiert wird). Charles hat Recht, für C++ 03. In C++ 98 sind beide standardmäßig konstruiert. –

0

Ohne viele Erklärungen - Die erste verwendet den Standardkonstruktor, um Ihr myObj zu initialisieren. Die zweite erstellt tatsächlich eine temporäre Instanz und verwendet dann einen Kopierkonstruktor, um myObj zu initialisieren. (Denken Sie daran, dass auch ein Standardkopiekonstruktor erstellt wird und nicht nur ein Standardkonstruktor.)