Cela dépend de la façon dont vous aimez structurer et lire les programmes. bien sûr, il y a des préférences et des raisons pour et contre chacune.
class ExplicitClass
: public BaseClass
{
public:
l'initialisation est très importante. ne pas initialiser une base ou un membre peut produire des avertissements, à juste titre ou en attrapant un bogue dans certains cas. donc cela commence vraiment à avoir du sens si cette collection d'avertissements est activée, vous gardez les niveaux d'avertissement très élevés, et les comptes d'avertissement diminuent. cela aide aussi à démontrer l'intention :
ExplicitClass()
: BaseClass() // <-- explicit call of base class constructor
{
// empty function
}
un destructeur virtuel vide est, IME, statistiquement le meilleur endroit pour exporter une virtual
(bien sûr, cette définition se trouverait ailleurs si elle était visible par plus d'une traduction). vous voulez que cela soit exporté parce qu'il y a une tonne d'informations sur les rtti et les vtable qui pourraient se retrouver sous la forme d'une masse inutile dans votre binaire. en fait, je définis très régulièrement des destructeurs vides pour cette raison :
virtual ~ExplicitClass() {} // <-- explicit empty virtual destructor
Il peut s'agir d'une convention au sein de votre groupe ou d'un document indiquant que c'est exactement ce que l'implémentation est censée faire. Cela peut également être utile (subjectif) dans les grandes bases de code ou au sein de hiérarchies complexes, car cela peut également vous aider à vous rappeler de l'interface dynamique que le type est censé adopter. certaines personnes préfèrent toutes les déclarations dans la sous-classe parce qu'elles peuvent voir toute l'implémentation dynamique de la classe en un seul endroit. ainsi la localité les aide dans le cas où la hiérarchie/interface de la classe est plus grande que la pile mentale du programmeur. comme le destructeur, ce virtuel peut aussi être un bon endroit pour exporter l'information sur le type :
virtual void f() { BaseClass::f(); } // <-- function just calls base
};
Bien sûr, il devient difficile de suivre un programme ou un raisonnement si vous ne définissez que si qualifié. Ainsi, certaines bases de code peuvent être plus faciles à suivre si vous vous en tenez aux conventions parce que c'est plus clair que de documenter pourquoi un destructeur vide est exporté à chaque fois.
une dernière raison (qui va dans les deux sens) est que les définitions explicites par défaut peuvent augmenter et diminuer les temps de construction et de liaison.
heureusement, il est désormais plus facile et sans ambiguïté de spécifier des méthodes et des constructeurs par défaut et supprimés.