2010-12-13 3 views
3

De ma compréhension des déclarations et des définitions, à la portée mondiale:Comment faire pour définir et déclarer une variable en utilisant le constructeur par défaut en C++?

MyClass instance();//Declares a function that returns a MyClass 
MyClass instance;//Declares an instance of MyClass 

Est-il possible de déclarer une variable et définir d'utiliser le constructeur par défaut à périmètre global? Et si j'utilisais une structure au lieu d'une classe?

EDIT:

Bon, alors MyClass instance; n'appelle le constructeur par défaut. Quelqu'un peut-il expliquer comment cela est compatible avec this example:

int a; // not default constructed, will have random data 
int b = int(); // will be initialised to zero 

Répondre

6
MyClass instance; 

invoqueront le constructeur par défaut (à savoir le constructeur sans paramètre).

C'est contre-intuitif, car pour appeler un constructeur surchargé avec des paramètres que vous procédez comme suit:

MyClass instance(param1, param2); 

Logic vous dira que vous passez dans une liste vide d'arguments pour appeler le constructeur par défaut, mais le code suivant ...

MyClass instance(); 

... ressemble à un prototype au compilateur plutôt que la construction d'un objet MyClass.

Il n'y a pas de différence entre un struct et un class en C++, sauf qu'un struct a public membres par défaut et un class a private membres par défaut.

+0

Pourquoi cela se comporte-t-il différemment de comment 'i nt' fonctionne (voir modifier ci-dessus)? – Casebash

+0

@Casebash - 'int' est un type POD, qui sera initialisé à zéro ou non initialisé selon la façon dont il est déclaré. Lorsque vous déclarez un 'int' localement sur la pile et ne l'initialisez pas explicitement, il aura des données aléatoires comme vous l'avez indiqué. S'il vous plaît voir cette réponse pour plus de détails: http: // stackoverflow.com/questions/3102096/when-do-c-pod-types-get-zero-initialisé/3102134 # 3102134 – LeopardSkinPillBoxHat

+0

Supposons que 'MyStruct' est défini comme' struct MyStruct {int a;}; '. La réponse à laquelle vous avez lié semble impliquer que 'MyStruct' n'est pas initialisé par défaut s'il est déclaré dans la portée locale (il est dit que myInstance.a n'est pas défini). Le constructeur par défaut pour une structure appelle les constructeurs par défaut pour chaque élément de la structure, n'est-ce pas? – Casebash

1
MyClass instance; 

est également une définition, en utilisant le constructeur par défaut. Si vous voulez déclarer simplement qu'il vous faut

extern MyClass instance; 

qui n'est pas une définition. Les deux, cependant, ont un lien externe.

2
  1. Peu importe que vous soyez à portée globale ou non.
  2. MyClass instance; est une définition (en utilisant le constructeur par défaut, non seulement une déclaration. Pour obtenir uniquement une déclaration (par exemple dans un fichier d'en-tête), vous devez utiliser extern MyClass instance;.
  3. Peu importe, pour cette partie, que ce soit MyClass est une classe ou un struct. le ne chose qui change entre structs et les classes en C++ est l'interprétation par défaut de savoir si les membres et les bases soient publiques ou privées.
  4. Si vous voulez être explicite, vous pouvez écrire MyClass instance = MyClass();.
Questions connexes