Compréhension d'un morceau de code

Résolu/Fermé
Utilisateur anonyme - Modifié par Whismeril le 17/12/2014 à 19:35
 Utilisateur anonyme - 17 déc. 2014 à 23:26
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 :

#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:

3 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
17 déc. 2014 à 21:15
'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 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
0
Utilisateur anonyme
17 déc. 2014 à 21:50
Mais si ça n'appelle pas le constructeur implémenté, ça appelle quoi exactement ?
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
Modifié par gravgun le 17/12/2014 à 23:12
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.
0
Utilisateur anonyme
17 déc. 2014 à 23:26
J'ai compris :)
Merci pour la réponse et pour le temps que vous m'avez consacrer :)
0