bonjour,
En langage C++,si je construis un objet pourquoi dois-je nécessairement établir un constructeur et un destructeur de cet objet ?
merci de votre aide
Version imprimable
bonjour,
En langage C++,si je construis un objet pourquoi dois-je nécessairement établir un constructeur et un destructeur de cet objet ?
merci de votre aide
Bonjour,
Ça n'est absolument pas nécessaire de définir un constructeur ou le destructeur pour un objet.
C'est d'ailleurs souvent une mauvaise idée de définir un destructeur (voir la règle des 5, autrefois appelée la règle des 3). Où as-tu entendu qu'ils doivent être nécessairement établis?
Par contre, il ne faut pas oublier que si on ne les définit pas, le compilateur va les créer pour nous car quand un objet est créé, un de ses constructeurs est forcément appelé et quand il est détruit son destructeur est appelé. Quitte à ce que le traitement associé soit vide.
On définit un destructeur quand la classe gère elle-même la durée de vie d'une ressource (et pour être totalement exception-safe, il est conseillé de n'en gérer qu'une seule à la fois dans une classe). Dans tous les autres cas (y compris quand la classe possède des membres qui gèrent eux-mêmes des ressources, comme des unique_ptr), définir un destructeur n'est pas nécessaire.
Pour nous, un constructeur est là pour positionner les invariants d'un objet.
Cas particulier des ressources, le destructeur est là pour restituer les ressources acquises (mémoire, socket, fichier, mutex...)
Pour le bien-être du binaire, le compilateur va toujours fournir tout ou parti de ces fonctions spéciales pour nous, même si on ne les spécifie pas. Ne serait que pour propager construction et destruction aux variables membres, et/ou aux types hérités.
Quant aux bonnes pratiques, comme signalé, il faut déléguer au maximum la gestion des ressources à des classes que l'on appelle parfois capsules RAII. On retrouve la règle du 0/5 évoquée précédemment. Il reste donc à notre charge la construction initialisante à vocation de positionner les invariants métiers -- pour les invariants techniques, on essaie de déléguer au maximum donc.