Constructeur de copie

Constructeur de copie - C++ - Programmation

Marsh Posté le 16-06-2003 à 09:54:38    

voici le code que me tracasse :

Code :
  1. //constructeur de copie
  2. Tableau::Tableau(const Tableau &int):taille(int.taille)
  3. {
  4. ptr=new int[taille];
  5. assert(ptr!=0);
  6. ++compteTableau;
  7. for (int i=0;i<taille;i++)
  8. ptr[i]=init.ptr[i];
  9. }


 
Or ptr est une donnée membres (un pointeur), donc ptr[i]=int.prt[i] va modifier mon pointeur...
Je vois pas ou est la copie en fait..vu que j'ecrase le contenu du prt??

Reply

Marsh Posté le 16-06-2003 à 09:54:38   

Reply

Marsh Posté le 16-06-2003 à 10:07:21    

Citation :

Or ptr est une donnée membres (un pointeur), donc ptr[i]=int.prt[i] va modifier mon


 
Non vu que tu ne modifie pas le pointeur mais les données pointées par ce pointeur

Reply

Marsh Posté le 16-06-2003 à 10:12:22    

oui excuse je modifie la donnée pointée mais donc aucune copie..j'ai pas deux donnée contenant la meme chose...
c'est ça que je comprend pas....
 :sweat:

Reply

Marsh Posté le 16-06-2003 à 11:03:28    

bin si.
 
le ptr=new int (taille);
 
crée le nouveau tableau...
 
puis le for copie les données...

Reply

Marsh Posté le 16-06-2003 à 11:13:09    

C'est une copie légère que tu fais (shallow copy en anglais), pas une copie profonde (deep copy).
 
Tu dupliques le tableau, mais pas le contenu du tableau. Le tableau et sa copie pointeront sur les mêmes objets.
 
Petite nuance : ceci est vrai dans l'absolu, et c'est vrai à tous les coups en Java. En C++, cela dépend de ce que contient le tableau. S'il contient des pointeurs ou des références, ce sera le cas. S'il contient des atomiques ou des objets, alors l'affectation "ptr[i ]=init.ptr[i ];" fera elle-même une duplication implicite du i-ème élément du tableau et la copie sera quand même profonde.


Message édité par BifaceMcLeOD le 16-06-2003 à 11:14:53
Reply

Marsh Posté le 16-06-2003 à 11:50:55    

grosmethos >> tu pourrais pas renommer le nom du tableau passé en paramètres ? passke int comme nom de variable, c'est super limpide pour le reste du code...

Reply

Marsh Posté le 16-06-2003 à 11:51:37    

BJOne a écrit :

grosmethos >> tu pourrais pas renommer le nom du tableau passé en paramètres ? passke int comme nom de variable, c'est super limpide pour le reste du code...


 
nan il a du merder dans la recopie du code, regarde la suite, c'est init le nom de sa variable :D (sinon de toute facon ca compilerait pas :O)

Reply

Marsh Posté le 16-06-2003 à 11:53:35    

ce serait pas plustôt ça que tu devrais avoir:  :??:  
 

Code :
  1. Tableau::Tableau(const Tableau &init):taille(init.taille)
  2.   {
  3.     ptr=new int[taille];
  4.     assert(ptr!=0);
  5.     ++compteTableau;
  6.     for (int i=0;i<taille;i++)
  7.     ptr[i]=init.ptr[i];
  8.   }


 
EDIT: joceeeeeeeeeeeeeeeeeee la balise de changement de couleur chie dans le [cpp][/cpp]


Message édité par bjone le 16-06-2003 à 11:54:46
Reply

Marsh Posté le 16-06-2003 à 11:53:55    

chrisbk a écrit :


 
nan il a du merder dans la recopie du code, regarde la suite, c'est init le nom de sa variable :D (sinon de toute facon ca compilerait pas :O)


 
+1
 
on est d'accord, donc en principe y'a bien l'allocation du nouveau tableau, et la recopie.


Message édité par bjone le 16-06-2003 à 11:55:33
Reply

Marsh Posté le 16-06-2003 à 12:50:33    

terriblement efficace le assert, aucune utilité puisque bad_alloc est lancé
 
moi je préfère
 

Code :
  1. Tableau::Tableau(const Tableau &init)
  2. : taille(init.taille), ptr(new int[taille])
  3.     {
  4.         ++compteTableau;
  5.         std::copy(init.ptr, init.ptr+taille, ptr);
  6.     }


réutilisation maximum, meilleure protection contre les exceptions

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed