Copie des objets de classe
Les opérations d'assignation et d'initialisation génèrent une copie des objets.
Assignation : Lorsque la valeur d'un objet est assignée à un autre objet, le premier objet est copié dans le second. Par conséquent,
Point a, b; ... a = b;
entraîne la copie de la valeur de b dans a.
Initialisation : L'initialisation se produit lorsqu'un nouvel objet est déclaré, lorsque des arguments sont transmis à des fonctions par valeur, ou lorsque des valeurs sont retournées par les fonctions par valeur.
Vous pouvez définir la sémantique de « copie » pour les objets de type classe. Par exemple, prenons le code suivant :
TextFile a, b;
a.Open( "FILE1.DAT" );
b.Open( "FILE2.DAT" );
b = a;
Ce code pourrait signifier « copier le contenu de FILE1.DAT vers FILE2.DAT » ou « ignorer FILE2.DAT et faire de b un deuxième handle vers FILE1.DAT ». Vous devez lier à chaque classe la sémantique de copie appropriée, comme suit.
En utilisant l'opérateur d'assignation operator= avec une référence au type de classe comme type de retour et au paramètre transmis par la référence const ; par exemple, ClassName& operator=(const ClassName& x);.
En utilisant le constructeur de copie. Pour plus d'informations sur le constructeur de copie, consultez Règles de déclaration des constructeurs.
Si vous ne déclarez pas de constructeur de copie, le compilateur génère un constructeur de copie membre à membre à votre place. De même, si vous ne déclarez pas d'opérateur d'assignation de copie, le compilateur génère un opérateur d'assignation de copie membre à membre à votre place. La déclaration d'un constructeur de copie n'entraîne pas la suppression de l'opérateur d'assignation de copie généré par le compilateur, et vice versa. Si vous implémentez l'un des deux, nous vous recommandons d'implémenter également l'autre afin que la signification du code soit claire.
L'assignation membre à membre est décrite plus en détail dans Assignation et initialisation de membre à membre.
Le constructeur de copie utilise un argument de type class-name**&**, où class-name est le nom de la classe pour laquelle le constructeur est défini. Par exemple :
// spec1_copying_class_objects.cpp
class Window
{
public:
Window( const Window& ); // Declare copy constructor.
// ...
};
int main()
{
}
Notes
Utilisez le type d'argument const class-name& pour le constructeur de copie chaque fois que c'est possible.Cela empêche le constructeur de copie de modifier accidentellement l'objet à partir duquel il effectue la copie.Cela permet également d'effectuer une copie à partir des objets const.