Compréhension d'un morceau de code
Résolu
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.
3 réponses
-
J'ai compris :)
Merci pour la réponse et pour le temps que vous m'avez consacrer :) -
Mais si ça n'appelle pas le constructeur implémenté, ça appelle quoi exactement ?
-
ContributeurRien. 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.
-
-
Contributeur'lut
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 doncB b;
, et le programme affiche ce à quoi tu t'attendais:gravgun@garch:/tmp$ g++ aaa.cpp -o aaa gravgun@garch:/tmp$ ./aaa B fin