[CPP] Interro 2 2008/2009 Code 6

Voir le sujet précédent Voir le sujet suivant Aller en bas

resolu [CPP] Interro 2 2008/2009 Code 6

Message  michaelvd le Lun 26 Déc 2011, 14:33

Salut tout le monde! J'espère que vous passez tous d'excellente vacances, et un blocus des plus productif! J'ai un problème de compréhension concernant ce code, le résultat en sortie est -5 et 0, j'ai du mal à comprendre comment la variable passe a 0. Voici le code pour ceux qui ne l'auraient pas:

Code:

#include <iostream>
using namespace std;
class Pbt
{
int * v;
public:
Pbt() { v = new int(5); }
int get() { return *v; }
~Pbt() { *v = 0; }
};
int fct ( Pbt p )
{
return - p.get();
}
int main()
{
Pbt k;
int v1 = fct(k);
int v2 = k.get();
cout << v1 + v2 << endl;
return 0;
}

Merci!


Dernière édition par michaelvd le Lun 02 Jan 2012, 15:45, édité 1 fois

michaelvd

Nombre de messages : 117
Age : 28
Prénom : Michaël
Statut : 2ième Réseaux/Télécom
Localisation : Bruxelles
Date d'inscription : 16/09/2009

http://www.binturong.be

Revenir en haut Aller en bas

resolu Re: [CPP] Interro 2 2008/2009 Code 6

Message  smb le Lun 26 Déc 2011, 17:18

Décortique bien tout ce qui se passe ... et n'oublie pas qu'il n'y a pas de constructeur par copie explicite !

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [CPP] Interro 2 2008/2009 Code 6

Message  michaelvd le Lun 02 Jan 2012, 14:59

Je suis revenu sur ce problème et effectivement lorsque je rajoute un constructeur de copie j'obtiens <b>-5 et 5</b>.
Voici mon constructeur par copie:
Code:
Pbt( Pbt &p){
      v = new int(p.get());
   }

Je ne comprends toujours pas pourquoi, dans ce cas ci, j'ai <b>0</b> comme deuxième valeur quand je n'ai pas de constructeur par copie.

Merci

michaelvd

Nombre de messages : 117
Age : 28
Prénom : Michaël
Statut : 2ième Réseaux/Télécom
Localisation : Bruxelles
Date d'inscription : 16/09/2009

http://www.binturong.be

Revenir en haut Aller en bas

resolu Re: [CPP] Interro 2 2008/2009 Code 6

Message  smb le Lun 02 Jan 2012, 15:37

michaelvd a écrit:Je suis revenu sur ce problème et effectivement lorsque je rajoute un constructeur de copie j'obtiens <b>-5 et 5</b>.
Voici mon constructeur par copie:
Code:
Pbt( Pbt &p){
      v = new int(p.get());
   }

Celui-ci me semble meilleur :
Code:
Pbt( const Pbt &p){
      v = new int(* p.v );
   }
michaelvd a écrit:
Je ne comprends toujours pas pourquoi, dans ce cas ci, j'ai <b>0</b> comme deuxième valeur quand je n'ai pas de constructeur par copie.
Merci
En fait, la classe Pbt dispose d'un constructeur par copie "par défaut".
Celui-ci effectue une copie champ par champ.
L'argument attendu par la fonction fct est un objet de la classe Pbt qui sert à construire par copie l'objet local p
Comme le seul attribut de la classe Pbt est le pointeur v , la copie champ par champ fait que l'attribut v de p partage la même zone mémoire que l'attribut v de k.
Quand on sort de la fonction fct, l'objet local p meurt et le destructeur est appelé, destructeur qui met 0 dans la zone mémoire pointée par v de p
Cqfd

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [CPP] Interro 2 2008/2009 Code 6

Message  michaelvd le Lun 02 Jan 2012, 15:45

Super merci beaucoup, je visualise bien la chose maintenant Suspect !!!

michaelvd

Nombre de messages : 117
Age : 28
Prénom : Michaël
Statut : 2ième Réseaux/Télécom
Localisation : Bruxelles
Date d'inscription : 16/09/2009

http://www.binturong.be

Revenir en haut Aller en bas

resolu Re: [CPP] Interro 2 2008/2009 Code 6

Message  Contenu sponsorisé Aujourd'hui à 08:43


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum