C ++ Instantiiere ein Objekt aus einer Klasse auf zwei verschiedene Arten

8

Ich bin mir ziemlich sicher, dass das schon einmal gefragt wurde, aber ich kann es nicht für das Leben von mir finden, indem ich es suche.

Also hier geht es:

Was ist der Unterschied zwischen:

%Vor%

und

%Vor%

Ich glaube, beide erreichen das gleiche Ergebnis, aber ist es besser, das andere zu benutzen? Angenommen, alles, was ich will, ist der Standardkonstruktor.

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

    
Nick 21.12.2010, 22:53
quelle

3 Antworten

9

Ja, es kann einen Unterschied geben.

In der ersten Instanz wird myObj nicht initialisiert, wenn es ein POD-Typ ist, andernfalls wird default-initialisiert .

In der zweiten Instanz wird myObj kopierinitialisiert von einem initialisierten Wert temporär. Das temporäre kann (und sollte fast sicher) eliminiert werden, um den Effekt value-initialization zu machen.

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

Zusätzlich zu dem offensichtlichen Unterschied zwischen "nicht initialisiert" und wertinitialisiert für POD-Typen gibt es einen Unterschied zwischen default-initialisiert und value- initialisiert für Nicht-POD-Typen ohne benutzerdefinierte Konstruktoren. Für diese Typen werden POD-Member nicht in default-initialization , sondern nullinitialisiert in value-initialization der übergeordneten Klasse initialisiert.

    
Charles Bailey 21.12.2010, 22:57
quelle
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 zugänglich sein muss (auch wenn er nicht aufgerufen wird).

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

    
Crazy Eddie 21.12.2010 22:57
quelle
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)

    
Yonatan Nir 20.10.2013 22:15
quelle