2012-08-23 2 views
0

Premier cas:problème d'initialisation du constructeur

class x 
{ 
public: 
    x(){} 
    int mem; 
} 

Deuxième cas:

class x 
{ 
public: 
    int mem; 
} 

int main() 
{ 
    x a; 
    std::cout << a.mem; //member not initialized error in second case 
} 

Si nous ne définissons pas le constructeur par défaut, le compilateur ajoutera un; et la fonction du constructeur est l'initialisation de la mémoire. Alors pourquoi donne-t-il une erreur dans le second cas, mais pas dans le premier cas?

+3

@Shahbaz et comment cela va-t-il corriger son code? :-) –

+1

Est-ce que vous obtenez vraiment une erreur que mem n'est pas initialisé? Utilisez-vous des raccourcis de ligne de commande lors de la compilation, par hasard? – Vikdor

+0

@AdrianCornish, les gens essaieront en fait de lire le code et de l'aider – Shahbaz

Répondre

1

Il vous manque le point-virgule à la fin de la classe def - c'est votre problème. De plus, ne pense pas que le constructeur par défaut Initialiser votre membre vars à moins qu'ils sont aussi les classes qui ont une exigence init d'une certaine manière

class x 
{ 
public: 
    int mem; 
}; 

int main() 
{ 
    x a; 
    std::cout << a.mem; //member not initialized error in second case 
} 
+0

ce que je sais est constructeur initialiser la mémoire qui est elle donne la valeur par défaut du type de données respectif à that.Am je me trompe ici. – user649558

+0

Oui - les types primitifs n'ont pas besoin d'avoir une valeur spécifique. –

2

La variable membre m n'est pas en cours d'initialisation dans les deux cas. Vous devez l'initialiser explicitement dans le constructeur

class x 
{ 
public: 
    x() : mem{} {} 
    int mem; 
}; 
+0

Typo sur les parenthèses –

+0

@AdrianCornish Pas en C++ 11. – jogojapan

+0

@AdrianCornish Nope, C++ 11 [syntaxe d'initialisation uniforme] (https://en.wikipedia.org/wiki/C%2B%2B11#Uniform_initialization) – Praetorian