Recommandé, 2024

Choix De L'Éditeur

Différence entre le constructeur de copie et l'opérateur d'assignation en C ++

Le constructeur de copie et l'opérateur d'affectation sont les deux manières d'initialiser un objet à l'aide d'un autre objet. La différence fondamentale entre le constructeur de copie et l'opérateur d'affectation réside dans le fait que le constructeur de copie alloue une mémoire distincte aux deux objets, à savoir le nouvel objet cible créé et l'objet source. L' opérateur d'affectation alloue le même emplacement mémoire au nouvel objet cible ainsi que objet source.

Étudions la différence entre le constructeur de copie et l'opérateur d'affectation.

Tableau de comparaison

Base de comparaisonCopier le constructeurOpérateur d'assignation
De baseLe constructeur de copie est un constructeur surchargé.L'opérateur d'affectation est un opérateur au niveau des bits.
SensLe constructeur de copie initialise le nouvel objet avec un objet déjà existant.L'opérateur d'affectation attribue la valeur d'un objet à un autre objet qui existe déjà.
Syntaxenom_classe (nom_classe et nom_objet) {
// corps du constructeur
}
nom_classe Ob1, Ob2;
Ob2 = Ob1;
Invoque(1) Le constructeur de copie appelle lorsqu'un nouvel objet est initialisé avec un objet existant.
(2) L'objet transmis à une fonction en tant que paramètre non référencé.
(3) L'objet est renvoyé de la fonction.
L'opérateur d'affectation n'est appelé que lors de l'affectation d'un nouvel objet à l'objet existant.
Allocation de mémoireL'objet cible et l'objet d'initialisation partagent les différents emplacements de mémoire.L'objet cible et l'objet d'initialisation partagent la même mémoire allouée.
DéfautSi vous ne définissez aucun constructeur de copie dans le programme, le compilateur C ++ en fournit implicitement un.Si vous ne surchargez pas l'opérateur "=", une copie au niveau du bit sera effectuée.

Définition du constructeur de copie

Un «constructeur de copie» est la forme d'un constructeur surchargé . Un constructeur de copie n’est appelé ou invoqué qu’à des fins d’initialisation. Un constructeur de copie initialise le nouvel objet créé par un autre objet existant. Lorsqu'un constructeur de copie est utilisé pour initialiser le nouvel objet cible, l'objet cible et l'objet source partagent un emplacement mémoire différent. Les modifications apportées à l'objet source ne sont pas répercutées dans l'objet cible. La forme générale du constructeur de copie est

 nom_classe (nom_classe & nom_objet) {. // corps du constructeur de copie. } // nom_objet se réfère à l'objet situé à droite de l'initialisation. 

Si le programmeur ne crée pas de constructeur de copie dans un programme C ++, le compilateur fournit implicitement un constructeur de copie. Un constructeur de copie implicite fourni par le compilateur effectue la copie par membre de l'objet source. Cependant, parfois, la copie au niveau des membres n'est pas suffisante, car l'objet peut contenir une variable de pointeur. Copier une variable de pointeur signifie que nous copions l'adresse stockée dans la variable de pointeur, mais que nous ne voulons pas copier l'adresse stockée dans la variable de pointeur, nous voulons plutôt copier l'objet pointé par le pointeur. Il est donc nécessaire de disposer d’un "constructeur de copie" explicite dans le programme pour résoudre ce type de problèmes.

Un constructeur de copie est appelé dans les trois conditions suivantes:

  • Le constructeur de copie appelle lorsqu'un nouvel objet est initialisé avec un objet existant.
  • L'objet transmis à une fonction en tant que paramètre non référencé.
  • L'objet est renvoyé de la fonction.

Laissez-nous comprendre le constructeur de copie avec un exemple.

 classe copy {int num; public: copy () {} // constructeur par défaut copy (int a) {// constructeur en cours d'initialisation num = a; } copy (copy & c) {// Copier le constructeur num = c.num; } void show () {cout << num; }}; int main () {copie A (200); // Objet A copie créée et initialisée B (A); // Le constructeur de copie appelé copy C = A; // Le constructeur de copie appelé copy D; D = A; // Le constructeur de copie n'est pas appelé car l'objet D n'est pas un objet nouvellement créé. // c'est une opération d'affectation. retourne 0; } 

Dans le code ci-dessus, j'avais explicitement déclaré un constructeur "copy (copy & c)". Ce constructeur de copie est appelé lorsque l'objet B est initialisé à l'aide de l'objet A. Une seconde fois, il est appelé lorsque l'objet C est initialisé à l'aide de l'objet A. Lorsque l'objet D est initialisé à l'aide de l'objet A, le constructeur de la copie n'est pas appelé car, lorsque D est en cours d'initialisation c'est déjà dans l'existence, pas celle qui vient d'être créée. Par conséquent, ici l'opérateur d'opération est appelé.

Définition d'opérateur d'affectation

L'opérateur d'assignation est un opérateur assignateur de C ++. L'opérateur “=” est utilisé pour appeler l'opérateur d'affectation. Il copie les données d'un objet de manière identique à un autre objet. L'opérateur d'affectation copie un objet dans un autre membre. Si vous ne surchargez pas l'opérateur d'assignation, il effectue la copie au niveau du bit. Par conséquent, vous devez surcharger l'opérateur d'affectation.

 classe copy {int num; public: copy () {} // constructeur par défaut copy (int a) {// constructeur en cours d'initialisation num = a; } void show () {cout << num; }}; int main () {copie A (200); // Objet A copie créée et initialisée B (300); // Objet B créé et initialisé B = A; // opérateur d'assignation invoqué copy C; C = A; // opérateur d'affectation invoqué return 0; } 

Dans le code ci-dessus, lorsque l'objetA est affecté à l'objet B, l'opérateur d'affectation est appelé, car les deux objets existent déjà. Il en est de même lorsque l'objet C est initialisé avec l'objet A.

Lorsque l'affectation au niveau du bit est effectuée, l'objet partage le même emplacement mémoire et les modifications apportées à un objet sont répercutées sur un autre objet.

Différences clés entre le constructeur de copie et l'opérateur d'assignation

  1. Un constructeur de copie est un constructeur surchargé dans lequel un opérateur d'affectation est un opérateur au niveau du bit.
  2. En utilisant le constructeur de copie, vous pouvez initialiser un nouvel objet avec un objet déjà existant. D'autre part, un opérateur d'affectation copie un objet sur l'autre, les deux étant déjà existants.
  3. Un constructeur de copie est initialisé chaque fois qu'un nouvel objet est initialisé avec un objet déjà existant, lorsqu'un objet est passé à une fonction en tant que paramètre de non-référence ou lorsqu'un objet est renvoyé d'une fonction. D'autre part, un opérateur d'affectation n'est appelé que lorsqu'un objet est affecté à un autre objet.
  4. Lorsqu'un objet est en cours d'initialisation à l'aide du constructeur de copie, l'objet d'initialisation et l'objet initialisé partagent le même emplacement mémoire. Par ailleurs, lorsqu'un objet est initialisé à l'aide d'un opérateur d'affectation, les objets initialisé et en cours d'initialisation partagent le même emplacement mémoire.
  5. Si vous ne définissez pas explicitement un constructeur de copie, le compilateur en fournit un. D'autre part, si vous ne surchargez pas un opérateur d'assignation, une opération de copie au niveau du bit est effectuée.

Conclusion:

Le constructeur de copie est préférable pour copier un objet sur un autre lorsque celui-ci contient des pointeurs bruts.

Top