Compréhension d'un morceau de code
Résolu
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
Je dois comprendre le comportement de ce bout de code mais même après mes recherches, je n'ai trouvé aucune explication.
Voici le bout de code :
Pour moi, ce bout de code afficherai "Bfin" mais il affiche "fin".
Quelqu'un aurait une explication ?
Merci d'avance.
EDIT: Ajout de la coloration syntaxique.
Je dois comprendre le comportement de ce bout de code mais même après mes recherches, je n'ai trouvé aucune explication.
Voici le bout de code :
#include <iostream> using namespace std; class B{ public: B() { cout << "B" << endl; } }; int main(){ B b(); cout << "fin" << endl; }
Pour moi, ce bout de code afficherai "Bfin" mais il affiche "fin".
Quelqu'un aurait une explication ?
Merci d'avance.
EDIT: Ajout de la coloration syntaxique.
A voir également:
- Compréhension d'un morceau de code
- Code ascii - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
- Code blocks - Télécharger - Langages
3 réponses
'lut
La ligne devient donc
B b();En C++, ça porte a confusion je sais, mais quand on a un constructeur sans arguments, on ne met pas les parenthèses; sinon ça n'appelle pas le constructeur, comme c'est le cas ici.
La ligne devient donc
B b;, et le programme affiche ce à quoi tu t'attendais:
gravgun@garch:/tmp$ g++ aaa.cpp -o aaa gravgun@garch:/tmp$ ./aaa B fin
Mais si ça n'appelle pas le constructeur implémenté, ça appelle quoi exactement ?
Rien. En fait, la déclaration sans paramètre mais avec parenthèses reviendrait en quelque sorte à
B b(void);en C: C++ considère donc ça comme une déclaration de fonction vu que ce qui est entre parenthèses est un (ou des) types, et non des variables (ou constantes) -- ce que je trouve étrange vu que C++ ne supporte pas les fonctions imbriquées, et qu'on ne déclare pas un pointeur de fonction. Pour résoudre l'ambigüité, le standard C++ spécifie donc que ne rien mettre après le nom revient a appeler le constructeur avec 0 arguments; sauf dans certains cas, cf. le paragraphe 8.5.8.