2010-02-22 3 views
9

Je veux construire un objet dans la pile, en utilisant C++. Savez-vous quelle est la différence entre ces à façons d'appeler le constructeur (avec et sans parenthèses):Différentes façons de construire un objet en C++

a) MyClass object ;

b) MyClass object() ;

J'utilise MFC et lors de la construction la variable globale pour l'application principale, si j'utilise la dernière façon, je reçois une exception, je pensais que ces deux moyens étaient équivalents.

Merci les gars pour toute information.

+0

comment le constructeur de MaClasse ressemble? –

+0

Je ne pense pas que vous obtiendriez une exception avec (b). Cela devrait entraîner une erreur de compilation. – LeopardSkinPillBoxHat

Répondre

18

Ceci est l'un de ces pièges de C++.

MyClass object(); 

est la façon dont une fonction prototype est défini en C++, de sorte que le compilateur pense que vous essayez de déclarer une autre fonction au milieu d'une autre fonction.

Si vous souhaitez appeler le constructeur par défaut (celui qui ne prend aucun argument), utilisez la syntaxe suivante:

MyClass object; 

Voir aussi la réponse de Garth Gilmour à la question maintenant supprimé What is your (least) favorite syntax gotcha?:

En C++

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

L'initialiseur '()' en C++ n'est pas nécessairement un appel du constructeur par défaut. '()' initializer effectue une initialisation de valeur qui n'est pas équivalente à l'invocation de constructeur par défaut, c'est-à-dire que la dernière forme (sans '()) n'est pas équivalente à l'intention exprimée dans le premier. La bonne façon de travailler sur un problème "prototype" est d'utiliser la syntaxe d'initialisation de copie 'MyClass object = MyClass()' et d'espérer que le compilateur le traduira en code efficace. – AnT

+0

@David: tu as raison et je supprime mon commentaire –

8

Par exemple:

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; 
} 
Questions connexes