IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

C++ Discussion :

Problème constructeur destructeur


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 129
    Points : 41
    Points
    41
    Par défaut Problème constructeur destructeur
    Bonjour

    Le programme ci dessous me renvoie le résultat suivant
    ++ construction : il y a maintenant = 1 objets (je rajoute a priori a)
    ++ construction : il y a maintenant = 2 objets ( a priori a;u)
    ++ construction : il y a maintenant = 3 objets ( a priori a;u;v)
    -- destruction : il reste maintenant 2 objets (je demande qui est détruit?)
    -- destruction : il reste maintenant 1 objets (je demande qui est détruit?)
    ++ construction : il y a maintenant = 2 objets ( b est rajouté)
    Je comprends le constructeur mais pas le destructeur
    d'où mes questions
    1 - A quel moment le destructeur est-il sollicité ?
    2 - Pourquoi les 3 objets créés ne sont-ils pas détruits ?
    3 - pourquoi le destructeur n'est-il pas sollicité à la fin du programme pour dire
    qu'il supprime les objets restants ?

    Je vous remercie par avance de la célérité et de la précision avec laquelle vous me répondrez

    Voici le programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include <iostream>
    #include <stdlib.h>
    using namespace std;
     
    class cpte_obj
    {   
        static int ctr;
        public :  
     
           cpte_obj ();
           ~cpte_obj();
     
    };
    int cpte_obj ::ctr =0;
    cpte_obj :: cpte_obj ()
     {      
            cout<< "++construction : il y a maintenant = " << ++ctr << " objets\n";
    }
    cpte_obj :: ~cpte_obj ()
    {
           cout<< "-- destruction : il reste maintenant " << --ctr << " objets\n";
     
    }
    main ()
     
    {  void fct ();
        cpte_obj a;
       fct();
       cpte_obj b;
       system("PAUSE");
        }
      void fct ()
       { cpte_obj u,v;}

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Le premier destructeur appelé est celui de u, puis celui de v (lorsque des objets sont créés sur la pile, ils sont detruits dans l'ordre inverse de la completion de leur constructeur).

    Ensuite b et a sont détruits - lorsque tu rencontre la fin du programme, c'est à dire le '}' de main(), après la fin de l'execution de Pause.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 129
    Points : 41
    Points
    41
    Par défaut Question subsidiaire ... Merci d'avance
    Lorsque le constructeur a té appelé 3 fois quel est l'évènement qui fait intervenir le destructeur ?
    ++ construction : il y a maintenant = 1 objets (je rajoute a priori a)
    ++ construction : il y a maintenant = 2 objets ( a priori a;u)
    ++ construction : il y a maintenant = 3 objets ( a priori a;u;v)
    -- destruction : il reste maintenant 2 objets (je demande qui est détruit?)

    Merci ..........

  4. #4
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Salut,
    Lorsque le constructeur a té appelé 3 fois quel est l'évènement qui fait intervenir le destructeur ?
    Les objets crées dans un blocs sont détruits à la sortie de celui-ci. Dans ton cas, les objets 'u' et 'v' sont locaux à 'fct()', il sont donc détruits à la sortie de celle-ci : donc appel ( automatique, il n'y a rien à faire ) du destructeur pour 'u' et 'v'
    'a' et 'b' sont eux détruits à la fin de 'main()' ( après system ("pause"); ) : tu n'as pas le temps de voir l'inscription à l'écran car le programme se ferme immédiatement après!
    ++ construction : il y a maintenant = 1 objets (je rajoute a priori a)
    ++ construction : il y a maintenant = 2 objets ( a priori a;u)
    ++ construction : il y a maintenant = 3 objets ( a priori a;u;v)
    -- destruction : il reste maintenant 2 objets (je demande qui est détruit?)
    -- destruction : il reste maintenant 1 objets (je demande qui est détruit?)
    ++ construction : il y a maintenant = 2 objets ( b est rajouté)
    Après ça, il y a donc :
    -- destruction : il reste maintenant 1 objets ( surement pour b )
    -- destruction : il reste maintenant 0 objets (surement pour a)
    mais tu n'as pas le temps de la voir à l'écran!!

  5. #5
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Si tu veux savoir quel objet est traité affecte lui une valeur et fais la afficher par le constructeur et le destructeur. Ça deviendra très clair:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include <iostream>
    #include <stdlib.h>
    using namespace std;
     
    class cpte_obj
    {   
    private:
        int valeur;
        static int ctr;
        public :  
     
           cpte_obj ( int );
           ~cpte_obj();
     
    };
    int cpte_obj ::ctr =0;
    cpte_obj :: cpte_obj ( int v )
     {      valeur = val;
            cout<< "++construction : valeur = " << valeur << ", il y a maintenant = " << ++ctr << " objets\n";
    }
    cpte_obj :: ~cpte_obj ()
    {
           cout<< "-- destruction : valeur = " << valeur << ", il reste maintenant " << --ctr << " objets\n";
     
    }
    main ()
     
    {  void fct ();
        cpte_obj a ( 1 );
       fct();
       cpte_obj b ( 2 );
       system("PAUSE");
        }
      void fct ()
       { cpte_obj u ( 3 ),v ( 4 );}
    Have fun....

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 129
    Points : 41
    Points
    41
    Par défaut
    Merci à tous
    Je savais que je trouverais de la compétence ...........

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/08/2007, 11h42
  2. Problème constructeur JDialog
    Par catwomanette dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 05/01/2007, 09h44
  3. problème constructeur + héritage
    Par BOLARD dans le forum C++
    Réponses: 10
    Dernier message: 13/04/2006, 08h11
  4. Constructeur & Destructeur en UML
    Par fredhali2000 dans le forum UML
    Réponses: 5
    Dernier message: 31/03/2006, 19h31
  5. [D7] constructeur / destructeur
    Par raoulmania dans le forum Langage
    Réponses: 2
    Dernier message: 16/12/2005, 18h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo