Que se passe-t-il si la valeur du paramètre par défaut est définie dans un code non visible sur le site de l’appel?

J’ai trouvé un code étrange …

//in file ClassA.h: class ClassA { public: void Enable( bool enable ); }; //in file ClassA.cpp #include  void ClassA::Enable( bool enable = true ) { //implementation is irrelevant } //in Consumer.cpp #include  .... ClassA classA; classA.Enable( true ); 

Évidemment, puisque Consumer.cpp uniquement inclus ClassA.h et non ClassA.cpp le compilateur ne pourra pas voir que le paramètre a une valeur par défaut.

Quand la valeur par défaut déclarée de ClassA::Enable dans la signature de l’implémentation de la méthode aura-t-elle un effet? Cela ne se produirait-il que lorsque la méthode est appelée à partir de fichiers ClassA.cpp le ClassA.cpp ?

Les valeurs par défaut ne sont qu’une chose au moment de la compilation. Il n’existe pas de valeur par défaut dans le code compilé (pas de métadonnées ni d’autres choses du même genre). Il s’agit essentiellement d’un remplacement du compilateur pour “si vous n’écrivez rien, je le spécifierai pour vous”. Donc, si le compilateur ne peut pas voir la valeur par défaut, il suppose qu’il n’y en a pas .

Démo:

 // test.h class Test { public: int testing(int input); }; // main.cpp #include  // removing the default value here will cause an error in the call in `main`: class Test { public: int testing(int input = 42); }; int f(); int main() { Test t; std::cout << t.testing() // 42 << " " << f() // 1000 << std::endl; return 0; } // test.cpp #include "test.h" int Test::testing(int input = 1000) { return input; } int f() { Test t; return t.testing(); } 

Tester:

 g++ main.cpp test.cpp ./a.out 

Laissez-moi d’abord admettre que c’est la première fois que je vois ce type de code. Mettre une valeur par défaut dans le fichier d’en-tête est la pratique habituelle, mais ce n’est pas le cas.

Je suppose que cette valeur par défaut ne peut être utilisée qu’à partir d’un code écrit dans le même fichier. De cette manière, le programmeur qui l’a écrit a voulu le mettre en quelque sorte pour appeler la fonction mais ne voulait pas déranger l’interface ( le fichier d’en-tête) visible par le monde extérieur.

Mettez la valeur par défaut dans la déclaration, pas la définition.

 class ClassA { public: void Enable( bool enable = true ); }; 

Cela ne se produirait-il que lorsque la méthode est appelée à partir de fichiers contenant le fichier ClassA.cpp?

C’est correct. Mais notez que cela produira presque certainement plusieurs erreurs de définition. La valeur par défaut n’est donc réellement disponible qu’à partir de son sharepoint définition dans ClassA.cpp.