Machen die Klammern hinter dem Typnamen einen Unterschied zu neuen?
Wenn 'Test' eine gewöhnliche Klasse ist, gibt es einen Unterschied zwischen:
Test* test = new Test;
und
Test* test = new Test();
InformationsquelleAutor der Frage David Read | 2009-03-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Let ' s get pedantisch, denn es gibt Unterschiede, die kann tatsächlich Einfluss auf Ihre code-Verhalten. Wesentlich für das folgende ist übernommen aus den Kommentaren zu einem "Old New Thing" - Artikel.
Manchmal die Erinnerung zurück durch den new-operator initialisiert werden, und manchmal ist es nicht abhängig davon, ob der Typ, den Sie newing-up ist ein POD (plain old data)oder wenn es eine Klasse, die enthält POD Mitglieder und ist die Verwendung eines compiler-erzeugten default-Konstruktors.
Übernehmen:
In einem C++98-compiler, der sollte Folgendes auftreten:
new A
- unbestimmten Wertnew A()
- null-initialisierennew B
- Standard-Konstrukt (B::m ist nicht initialisierten)new B()
- Standard-Konstrukt (B::m ist nicht initialisierten)new C
- Standard-Konstrukt (C::m ist null initialisiert)new C()
- Standard-Konstrukt (C::m ist null initialisiert)In ein C++03-konforme compiler, die Dinge sollten funktionieren etwa so:
new A
- unbestimmten Wertnew A()
- Wert-Initialisierung Ein, die null-Initialisierung, da es ein POD.new B
- default-initialisiert (Blätter B::m nicht initialisierten)new B()
- Wert initialisiert B die null-initialisiert alle Felder, weil seine default-ctor compiler generiert, im Gegensatz zu Benutzer-definiert.new C
- default-initialisiert C, die ruft die default-ctor.new C()
- Wert initialisiert C, die ruft die default-ctor.So, in allen Versionen von C++ gibt es einen Unterschied zwischen
new A
undnew A()
weil Eine ist ein POD.Und es gibt einen Unterschied im Verhalten zwischen C++98 und C++03 für den Fall
new B()
.Dies ist einer der staubigen Ecken von C++, die kann fahren Sie verrückt. Bei der Konstruktion eines Objekts, manchmal Sie wollen/müssen die parens, manchmal ist Sie absolut nicht haben, und manchmal ist es egal.
InformationsquelleAutor der Antwort Michael Burr
new Thing();
ausdrücklich, dass Sie möchten, dass ein Konstruktor aufgerufen, in der Erwägung, dassnew Thing;
ist, bedeuten Sie nichts dagegen haben, wenn der Konstruktor nicht aufgerufen.Wenn verwendet auf eine Struktur/Klasse, die mit einem Benutzer-definierten Konstruktor gibt es keinen Unterschied. Wenn eine triviale struct/Klasse (z.B.
struct Thing { int i; };
) dannnew Thing;
ist wiemalloc(sizeof(Thing));
in der Erwägung, dassnew Thing();
ist wiecalloc(sizeof(Thing));
- es wird null initialisiert.Dem Punkt liegt in-zwischen:
Das Verhalten von
new Thingy;
vsnew Thingy();
in diesem Fall verändert zwischen C++98 und C++2003. Siehe Michael Burr Erklärung dafür, wie und warum.InformationsquelleAutor der Antwort kfsone
Nein, Sie sind die gleichen. Aber es gibt einen Unterschied zwischen:
und
Dies ist wegen der grundlegenden C++ (und C) - Regel: Wenn etwas, das kann möglicherweise eine Erklärung, dann ist es eine Erklärung.
Edit: Re-Initialisierung Probleme bezüglich POD und nicht-POD-Daten, während ich Stimme mit allem, was gesagt worden ist, möchte ich nur darauf hinweisen, dass diese Probleme nur dann gelten, wenn die Sache als neu würde oder sonst konstruiert, die nicht über einen Benutzer-definierten Konstruktor. Wenn es einen solchen Konstruktor eingesetzt wird. Für 99,99% der sinnvoll gestalteten Klassen gibt es so einen Konstruktor, und so sind die Themen können ignoriert werden.
InformationsquelleAutor der Antwort
Im Allgemeinen haben wir die default-Initialisierung im ersten Falle und der Wert-Initialisierung im zweiten Fall.
Zum Beispiel:
im Fall von int (POD-Typ):
int* test = new int
- wir haben die Initialisierung und den Wert " * " - test kann jeder sein.int* test = new int()
- *test haben 0 Wert.weiter Verhalten hing aus Ihrem Typ zu Testen.
Wir haben defferent-Fälle: Tests haben defult Konstruktor, Test generierten Standard-Konstruktor, Test enthalten POD-Mitglied, nicht-POD-Mitglied...
InformationsquelleAutor der Antwort bayda
Vorausgesetzt, der Test ist eine Klasse mit einem Konstruktor definiert, da gibt es keinen Unterschied. Die letztere form macht es ein wenig deutlicher, dass die Test-Konstruktor ausgeführt wird, aber das ist über es.
InformationsquelleAutor der Antwort Evan Shaw