2012-03-30 9 views
4

Ich wollte nur hier den Unterschied bestätigen, nehmen dies als Beispiel:Constructor gegen neue

class Gate 
{ 
    public: 
      Gate(); //Constructor 
      void some_fun(); 
    private: 
      int one, two; 
      ptr p1; 
      Gate* next; 
}; 
typedef Gate* ptr; 

Gate::Gate() 
{ 
    one = 0; 
    two = 0; 
} 

void Gate::some_fun() 
{ 
    p1 = new Gate; 
    p1 = p1->next; 
    p1 = new Gate(); 
} 

In meinem Beispiel habe ich zwei neue Knoten von „Gate“ erstellt haben, und der einzige Unterschied zwischen ihnen ist, dass der erste Knoten nicht die Variablen "eins und zwei" initialisiert hat, während der zweite Knoten dies tut.

+4

Es gibt keinen Unterschied zwischen 'new T' und' new T() 'für eine Klasse, bei der der Standardkonstruktor explizit wie deins definiert ist. Dieser Konstruktor wird in jedem Fall ausgeführt. –

+0

@Josh, Hast du diesen Code tatsächlich ausgeführt und die Ergebnisse überprüft? – crashmstr

+0

Ihr 'some_func()' leckt ein 'Gate' Objekt. – jrok

Antwort

10

C++ hat zwei Klassen von Typen: PODs und Nicht-PODs ("POD" steht für "plain old data" ... ein etwas irreführender Hinweis).

Für Nicht-PODs, gibt es keinen Unterschied zwischen new T und new T(). Der Unterschied betrifft nur PODs, für die new T den Speicher nicht initialisiert, während new T() ihn standardmäßig initialisiert.

So what are PODs? Alle eingebauten C++ Typen (int, bool ...) sind.

Darüber hinaus sind bestimmte benutzerdefinierte Typen auch. Their exact definition is somewhat complicated aber für die meisten Zwecke ist es genug zu sagen, dass ein POD kann nicht einen benutzerdefinierten Konstruktor (sowie bestimmte andere Funktionen) und alle seine Daten Mitglieder müssen selbst PODs sein. Weitere Informationen finden Sie im verlinkten FAQ-Eintrag.

Da Ihre Klasse kein POD ist, sind beide Operationen identisch.

+0

Ich bin mir nicht sicher (noch wollen eigentlich test, ich fühle mich faul hier), dass POD die gute Teilung in diesem Fall ist: 'struct x {int a; Std :: Zeichenfolge b; } ', Denke ich * für den Nicht-POD-Typ' new x' und 'new x()' machen einen Unterschied. –

+0

@David [Nope.] (Http://ideone.com/s5RCk) –

+0

Dieser Test bestätigt meine Bedenken nicht. Ich war sicher, dass die 'std :: string 'initialisiert werden würde, aber ich war mir nicht sicher, ob das POD-Mitglied in der Struktur initialisiert werden würde oder nicht. Ich habe eine [test] (http://ideone.com/Xg3bW) geschrieben, die überprüft, dass sie in beiden Fällen nicht initialisiert ist - das Verhalten unterscheidet sich von dem des Objekts mit automatischer Dauer (Funktionen "f" und "g") was mich verwirrt hat. –