2012-10-02 6 views
7

Mögliche Duplizieren ist:
Why is there no call to the constructor?Was sind die Unterschiede zwischen Test t; und Test t(); Wenn der Test eine Klasse

ich Visual Studio 2012 verwenden, Angenommen Test a Klasse

class Test 
{ 
}; 

ist, wenn ich eine neue Instanz erstellen von Test, was ist der Unterschied der folgenden zwei Möglichkeiten?

Weg 1

Test t; 

Weg 2

Test t(); 

Ich habe diese Frage in dem folgenden Code ursprünglich definiert I eine Instanz eines in Weg 2, ich habe nur einen Fehler, da B stellt keinen Standardkonstruktor zur Verfügung, aber wenn ich es in Weg 1 definiere, habe ich einen zusätzlichen Fehler bekommen.

class B 
{ 
    B(int i){} 
}; 

class A 
{ 
    A(){} 
    B b; 
}; 

int main(void) 
{ 
    A a(); // define object a in way 2 

    getchar() ; 
    return 0 ; 
} 

wenn ich eine in Art und Weise 1

A a; 

definieren werde ich ein anderer Fehler, sagte

bekam

Fehler C2248: 'A :: A': kann nicht privat Mitglied in der Klasse erklärt zugreifen 'A'

Also ich denke, da müssen einige Unterschiede sein zwischen den beiden Wegen.

Antwort

50

enter image description here

Test t; definiert eine variable t vom Typ Test genannt.

Test t(); deklariert eine Funktion namens t, die keine Parameter akzeptiert und eine Test zurückgibt.

+20

+1 für das Bild :-) –

+1

gut, was für eine dumme Frage, ich bin sicher, dass ich das vorher weiß, aber ... es ist nicht mein Tag heute, :( – zdd

+0

@ zdd es passiert. –

17

Was ist der Unterschied zwischen zwei Deklarationen?

A a(); 

erklärt, eine Funktion und kein Objekt. Es ist eines der Most vexing parse in C++.
Es deklariert eine Funktion mit dem Namen a, die keine Parameter akzeptiert und einen Typ A zurückgibt.

A a; 

Erstellt ein Objekt a des Typs namens A von seinem Standard Konstruktor aufrufen.

Warum erhalten Sie den Kompilierungsfehler?

Für eine Klasse Standard Zugriffsbezeichner ist private Sie den Fehler so erhalten, weil Ihre Klasse Konstruktor private ist und es nicht aufgerufen werden kann, während das Objekt mit über Syntax zu erstellen.

+0

vielen Dank. – zdd