2010-06-01 27 views
7

sagen, dass ich eine Struktur haben, die wie folgt aussieht (a POD):Standard Struct Initialisierung in C++

struct Foo 
{ 
    int i; 
    double d; 
}; 

Was sind die Unterschiede zwischen den beiden folgenden Zeilen sind:

Foo* f1 = new Foo; 
Foo* f2 = new Foo(); 
+0

Beachten Sie die verwandte Frage [Warum ist es ein Fehler, einen leeren Satz von Klammern zu verwenden, um einen Konstruktor ohne Argumente aufzurufen?] (Http://stackoverflow.com/questions/180172/why-is-it-an- error-to-use-an-leer-set-of-brackets-to-call-a-constructor-with-no). – Troubadour

Antwort

12

Der erste Wert lässt die Werte nicht initialisiert; der zweite initialisiert sie auf Null. Dies ist nur bei POD-Typen der Fall, die keine Konstruktoren haben.

+0

Danke! Ist das der einzige Unterschied? – criddell

+5

Ja, das ist der einzige Unterschied. –

+0

Und wenn ich mich nicht irre, wurde dies nur in einigen neueren Versionen des Standards hinzugefügt (2003?) – Suma

-2

Per Link I Gesendet.

In C++ besteht der einzige Unterschied zwischen einer Klasse und einer Struktur darin, dass Klassenmitglieder standardmäßig privat sind, während Strukturmitglieder standardmäßig auf public gesetzt sind. So können Strukturen Konstruktoren haben, und die Syntax ist dieselbe wie für Klassen.

Struct Constructor Info

+1

Der Punkt ist die Verwendung oder das Weglassen der gebogenen Klammern beim Konstruieren neuer Objekte. Die Frage gilt sowohl für Klassen als auch für Strukturen. – Troubadour

1

Ich nehme gar nichts. Foo() ist erlaubt, auch wenn es keinen Sinn ergibt ... Ich habe versucht, struct in class zu ändern und versuchte ein Diff auf der generierten Exe, und sie resultierten, um gleich zu sein, was bedeutet, dass eine Klasse ohne Methode wie eine Struktur aus ist eine praktische und "effektive" Sichtweise.

Aber: wenn Sie ein der alternativen verwenden, struct oder class egal zu halten, kommt es vor, dass new Foo und new Foo() ausführbaren Dateien gibt, die sich unterscheiden! (Zumindest unter Verwendung von g ++) I.e.

 
struct Foo { int i; double d; } 
int main() { Foo *f1 = new Foo; delete f1; } 

in somehing unterscheidet sich von

zusammengestellt
 
struct Foo { int i; double d; } 
int main() { Foo *f1 = new Foo(); delete f1; } 

und das gleiche passiert mit class statt struct. Um zu wissen, wo der Unterschied ist, sollten wir uns den generierten Code ansehen ... und um zu wissen, ob es ein g ++ idiosincracy ist oder nicht, sollte ich einen anderen Compiler ausprobieren, aber ich habe nur gcc und keine Zeit, um die Ausgabe von g ++ zu analysieren. ..

Jedenfalls von einem "funktionalen" (praktischen) Standpunkt aus, ist es das Gleiche.

hinzufügen

Am Ende ist es immer besser ist durch g für einige gemeinsame menschliche Probleme auf Q/A-Stellen ... der einzige Unterschied in dem Code erzeugt tiefere Untersuchung zu kennen oder tun ++ in() und nein() Fälle

 
    movl $0, (%eax) 
    fldz 
    fstpl 4(%eax) 

, die ein Fragment ist, das auf 0/0.0 den int und das Doppel der Struktur initialisiert ... so Seymour weiß es besser (aber ich es ohne zu wissen, hat entdeckt, könnte, wenn ich hatte Werfen Sie einen Blick auf die ASM zuerst!)

+0

Warum macht die Verwendung von Klammern keinen Sinn, es ruft den Standardkonstruktor auf. Wenn überhaupt, macht ein Mangel an Parens keinen Sinn. – Salgar

+0

was sagst du? es ist ein Test, plausibel für die Frage und die Tatsache, dass foo() normalerweise einen Aufruf zu einer Funktion/Methode bedeutet; ein nicht so nützlicher Test, anstatt ein Lesen von Spezifikationen, das wäre ein möglicher Kritiker gewesen. Ihr Kommentar bedeutet mir nichts. – ShinTakezou