pourquoi le constructeur par défaut n’est pas disponible par défaut dans certains cas

class foo { public: int a; int b; foo(int a_, int b_) : a(a_), b(b_) {} }; int main() { foo f; } 

lorsque j’essaie de comstackr le code ci-dessus, le message d’erreur suivant s’affiche:

 foo.cc: In function 'int main()' foo.cc:12: error: no matching function for call to 'main()::foo::foo()' foo.cc:10: note: candidates are: main()::foo::foo(int, int) foo.cc:6: note: main()::foo::foo(const main()::foo&) 

mais si je commente le fichier de constructeur explicite avec deux parameters de nombre entier, alors le code peut être compilé. Je suppose que la règle qui sous-tend la magie est que, lorsque vous déclarez explicitement le constructeur avec des parameters, le compilateur c ++ ne génère pas automatiquement un constructeur par défaut sans paramètre pour vous.

Ai-je raison? Si j’ai raison, pourquoi c ++ a-t-il un tel comportement? Merci d’avance.

Le compilateur génère un constructeur par défaut uniquement s’il n’y a pas de constructeurs définis par l’utilisateur.

C ++ Standard 12.1 / 5:

Un constructeur par défaut pour une classe X est un constructeur de classe X pouvant être appelé sans argument. S’il n’y a pas de constructeur déclaré par l’utilisateur pour la classe X, un constructeur par défaut est déclaré implicitement.

Oui, tu as raison. Si vous déclarez un constructeur, il n’en déclare aucun implicite. Quant à pourquoi, je ne suis pas sûr.

 class foo { public: foo(int a_ = 0, int b_ = 0) : a(a_), b(b_) {} int a; int b; }; 

Le langage C ne génère un ctor par défaut que si vous n’en spécifiez pas vous-même. Vous pouvez cependant spécifier les arguments par défaut à votre ctor

Fondamentalement, si vous n’avez pas de constructeur explicite, C ++ essaie d’être compatible avec les structures C et d’autres types de données anciens en fournissant un constructeur par défaut, afin que ses objects puissent être définis et utilisés normalement. Mais si vous avez un constructeur explicite, C ++ ne fournit plus ce paramètre par défaut, car vous devez avoir le contrôle total sur la manière dont les objects de vos classes peuvent être utilisés (comme leur construction). Ainsi, si vous ne spécifiez pas de constructeur par défaut, vous pouvez avoir des objects non constructibles sans parameters, ce qui est souvent utile.