[c++] Machen die Klammern hinter dem Typnamen einen Unterschied zu neuen?



Answers

new Thing(); ist explizit, dass Sie einen Konstruktor namens new Thing; Man nimmt an, dass es Ihnen nichts ausmacht, wenn der Konstruktor nicht aufgerufen wird.

Wenn es in einer Struktur / Klasse mit einem benutzerdefinierten Konstruktor verwendet wird, gibt es keinen Unterschied. Wenn eine triviale Struktur / Klasse aufgerufen wird (zB struct Thing { int i; }; ), dann new Thing; ist wie malloc(sizeof(Thing)); während new Thing(); ist wie calloc(sizeof(Thing)); - Es wird Null initialisiert.

Die Gotcha liegt dazwischen:

struct Thingy {
  ~Thingy(); // No-longer a trivial class
  virtual WaxOn();
  int i;
};

Das Verhalten des new Thingy; gegen new Thingy(); In diesem Fall wurde zwischen C ++ 98 und C ++ 2003 gewechselt. Siehe Michael Burrs Erklärung für wie und warum.

Question

Wenn "Test" eine gewöhnliche Klasse ist, gibt es einen Unterschied zwischen:

Test* test = new Test;

und

Test* test = new Test();



Im Allgemeinen haben wir Default-Initialisierung im ersten Fall und Wert-Initialisierung im zweiten Fall.

Zum Beispiel: im Fall mit int (POD-Typ):

  • int* test = new int - wir haben irgendeine Initialisierung und der Wert von * test kann beliebig sein.

  • int* test = new int() - * test hat den Wert 0.

Das nächste Verhalten hängt von Ihrem Typ Test ab. Wir haben unterschiedliche Fälle: Test hat default Konstruktor, Test hat Standardkonstruktor generiert, Test enthält POD Mitglied, nicht POD Mitglied ...




Related