En C++, un constructeur par défaut est un constructeur sans paramètres ou avec des paramètres dont tous ont des valeurs par défaut. Si aucun constructeur n'est déclaré dans la classe, le compilateur générera automatiquement un constructeur public par défaut. Cependant, si au moins un autre constructeur (par exemple, un constructeur avec paramètres) est déclaré, le constructeur par défaut ne sera plus généré automatiquement par le compilateur. Si dans une telle classe, un constructeur par défaut est nécessaire, il doit être déclaré explicitement (par exemple, en utilisant ClassName() = default;).
class Foo { public: Foo(int x) {} // Constructeur utilisateur // Foo() par défaut ne sera plus généré par le compilateur ! }; Foo f; // Erreur de compilation - pas de constructeur par défaut !
Pour créer explicitement un constructeur par défaut dans ce cas, il faut ajouter :
class Foo { public: Foo() = default; Foo(int x) {} };
« Si vous n'avez qu'un seul constructeur avec paramètres, est-il possible de créer des objets de cette classe sans paramètres ? Pourquoi ? »
Réponse : Non ! Parce que, si tout constructeur est déclaré, le compilateur n'ajoute plus automatiquement le constructeur par défaut. Pour créer des objets sans paramètres, il faut explicitement ajouter le constructeur par défaut dans la déclaration.
Histoire
Sur un grand projet, une hiérarchie de classes pour la sérialisation de données a été écrite, où toutes les classes "fille" avaient uniquement un constructeur spécifique avec paramètres. Après refactoring, il a été constaté qu'en utilisant des conteneurs STL (par exemple, std::vector) avec ces classes, la compilation échouait : le conteneur nécessitait un constructeur par défaut, qui n'était pas présent. Le problème a été résolu uniquement après l'ajout explicite du constructeur par défaut.
Histoire
Dans un projet utilisant la templatisation, l'une des classes adaptatrices n'a déclaré que le constructeur avec paramètres pour transmettre des ressources. Cependant, l'une des bibliothèques exigeait la présence d'un constructeur par défaut pour un bon fonctionnement (créant des objets temporaires via des types de modèles). Des erreurs de liaison mystérieuses survenaient, qui n'ont été expliquées que lorsque le constructeur par défaut a été réalisé explicitement.
Histoire
Dans le code, il y avait une migration de C++98 vers C++11, et une tentative d'utiliser "= default" pour déclarer explicitement le constructeur par défaut. Sur les anciens compilateurs, des erreurs se produisaient ou de nouvelles constructions syntaxiques étaient ignorées. Cela a révélé que tous les développeurs ne comprennent pas la différence entre le constructeur par défaut explicitement réalisé, celui généré par le compilateur, et la nouvelle syntaxe "= default".