Il est tout à fait correct d’écrire
ceci :
maClasse c1 ;
maClasse c2 = c1 ;
Le problème est le suivant : la recopie de l’objet
c1 dans l’objet c2 est faite sans tenir compte des
zones pointées. Ainsi, les pointeurs pointent (forcément
!) sur la même zone mémoire. L’intervention
d’un des objets sur cette zone produira des effets
de bords sur l’autre. Il est ainsi nécessaire
de parfois avoir un constructeur spécial, appelé
constructeur par recopie qui s’occupera de réaliser
une copie correcte de l’objet et d’éviter
ainsi ces effets de bord.
Le constructeur par recopie est automatiquement appelé
lorsqu’un nouvel objet est déclaré avec
comme valeur initiale celle d’un autre objet ( maClasse
c2 = c1 ;).
Ce type de constructeur est utile avec les objets utilisant
l’allocation dynamique lorsque l’on désire
faire passer un objet en paramètre par valeur à
des fonctions. Puisque le passage est par recopie, on se
retrouverait dans le cas où plusieurs objets pointeraient
sur les mêmes zones mémoires.
Ajoutons un constructeur par recopie :
.hpp
maClasse (maClasse &)
;
.cpp
maClasse : : maClasse (maClasse
&mc) {
traitement nécessaire pour allouer une nouvelle zone
mémoire, y recopier les informations nécessaires
}