2010-02-22 13 views
9

Ich möchte ein Objekt im Stapel erstellen, mit C++. Wissen Sie, was der Unterschied zwischen diesen zu Weisen Aufruf der Konstruktor (mit und ohne Klammern) ist:Verschiedene Möglichkeiten zum Erstellen eines Objekts in C++

a) MyClass object ;

b) MyClass object() ;

ich MFC verwende und bei der Konstruktion die globale Variable für die Haupt-App, wenn ich den letzteren Weg benutze, bekomme ich eine Ausnahme, ich dachte, diese beiden Möglichkeiten wären gleichwertig.

Vielen Dank für weitere Informationen.

+0

wie funktioniert der Konstruktor für MyClass aussehen? –

+0

Ich würde nicht denken, dass Sie eine Ausnahme mit (b) bekommen würden. Dies sollte zu einem Kompilierungsfehler führen. – LeopardSkinPillBoxHat

Antwort

18

Dies ist einer dieser Fehler von C++.

MyClass object(); 

ist die Art und Weise, dass eine Funktion Prototyp in C++ definiert ist, so dass der Compiler denkt, dass Sie versuchen, eine andere Funktion in der Mitte einer anderen Funktion zu erklären.

Wenn Sie den Standard-Konstruktor aufrufen (dh derjenige, der keine Argumente hat), diese Syntax verwenden statt:

MyClass object; 

Siehe auch Garth Gilmour Antwort auf die nun gelöschte Frage What is your (least) favorite syntax gotcha?:

In C++

Employee e1("Dave","IT"); //OK 
Employee e2("Jane"); //OK 
Employee e3(); //ERROR - function prototype 
+2

Der '()' Initialisierer in C++ ist nicht notwendigerweise ein Aufruf des Standardkonstruktors. Der Initialisierer "()" führt eine Wert-Initialisierung durch, die nicht dem Standardkonstruktoraufruf entspricht, d. h. die letzte Form (ohne '()') ist nicht äquivalent zu der in der ersten ausgedrückten Absicht. Der richtige Weg, um ein "Prototyp" -Problem zu lösen, ist die Verwendung der Kopierinitialisierungssyntax 'MyClass object = MyClass()' und ich hoffe, dass der Compiler es in effizienten Code übersetzt. – AnT

+0

@David: Du hast Recht und ich lösche meinen Kommentar –

8

Zum Beispiel:

class MyClass 
{ 
    public: 
    MyClass() 
    {x = 0;} 
    MyClass(int X) 
    {x = X;} 
    private: 
    int x; 
}; 

int main() 
{ 
    MyClass myObject(56); // initialize x to value '56' 
    MyClass myObject2; //calls default constructor and initializes x to 0 
    return 0; 
} 
Verwandte Themen