Compréhension d'un morceau de code

Résolu
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 :

#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

  1. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    '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
  2. Utilisateur anonyme
     
    Mais si ça n'appelle pas le constructeur implémenté, ça appelle quoi exactement ?
    0
    1. ElementW Messages postés 5690 Statut Contributeur 1 293
       
      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
  3. Utilisateur anonyme
     
    J'ai compris :)
    Merci pour la réponse et pour le temps que vous m'avez consacrer :)
    0