2016-04-20 8 views
0

Ich habe folgendes imbecile Programm:C++ Warum funktionieren 3 dieser Konstruktoraufrufe, aber einer nicht?

#include <iostream> 
using namespace std; 

class Baz { 
public: 
    Baz() {cout << "Baz ctor " << endl;} 
    Baz(int i) : Baz() {} 
    ~Baz() {cout << "Baz dtor " << endl;} 
}; 

int main() 
{ 
    cout << "w" << endl; 
    Baz w; 

    cout << "x" << endl; 
    Baz x(); 

    cout << "y" << endl; 
    Baz y(1); 

    cout << "z" << endl; 
    Baz z = Baz(); 

    return 0; 
} 

Dies erzeugt die folgende Ausgabe:

w 
Baz ctor 
x 
y 
Baz ctor 
z 
Baz ctor 
Baz dtor 
Baz dtor 
Baz dtor 

Meine Frage ist also: Warum alle nicht diese Anrufe den Konstruktor aufrufen?

Ich habe recherchiert, aber ich habe keine Erklärung gefunden, warum der 2. Aufruf nicht den Konstruktor aufruft. Ich würde erwarten, Baz x() zu Baz x = Baz() gleichwertig zu sein, wie Baz y(1)Baz y = Baz(1) entsprechen würde, muss es etwas sein, das ich vermisse.

+1

Weil es Funktion Deklaration statt Variable ist. Verwenden Sie 'Baz x {};' statt – Slava

+1

Oder einfach 'Bar x'; – SergeyA

Antwort

4

Ihre Aussage Baz x(); erklärt x als eine Funktion ohne Parameter, die eine Baz zurückgibt. Ändern Sie es in Baz x{}; oder Baz x;, um den Standardkonstruktor aufzurufen.

+1

Was braucht es für leere Zahnspangen? Außerdem deklariert es die Funktion, definiert sie nicht. – SergeyA

+0

@SergeyA, Ich habe die Antwort nach Ihrem Vorschlag bearbeitet. Gibt es einen Grund, 'Baz x;' gegenüber 'Baz x {};'? Ich denke, es gibt einen feinen Unterschied zwischen den beiden, aber ich kann mich nicht erinnern. –

+0

Die geschweifte Klammerform führt Wert Initialisierung durch; die andere, Standard-Initialisierung. Ob man besser ist als der andere ist umstritten, aber ich ziehe es immer vor, nicht initialisierte Werte zu vermeiden :) –

Verwandte Themen