Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre à l'essai
    constructeur et destructeur : pourquoi sont-ils nécessaires ?
    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

  2. #2
    Expert confirmé
    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.

  3. #3
    Expert éminent sénior
    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.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Expert éminent sénior
    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.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

###raw>template_hook.ano_emploi###