Maison >développement back-end >C++ >Pourquoi le constructeur de copie n'est-il pas appelé lors de l'affectation à un objet existant en C ?

Pourquoi le constructeur de copie n'est-il pas appelé lors de l'affectation à un objet existant en C ?

DDD
DDDoriginal
2024-12-08 09:22:11570parcourir

Why Isn't the Copy Constructor Called When Assigning to an Existing Object in C  ?

Pourquoi le constructeur de copie est contourné lors de l'attribution d'une nouvelle valeur à un objet existant

Dans l'extrait de code fourni, un objet a est initialisé avec la valeur 5. Le constructeur standard A est invoqué comme prévu. Cependant, contrairement aux hypothèses, le constructeur de copie n'est pas appelé lors de l'attribution de l'objet nouvellement construit.

Ce comportement n'est ni le résultat d'une optimisation du compilateur ni une omission dans la spécification du langage. Il est explicitement documenté dans la norme C (§12.8.15, p. 211). La norme précise qu'"il est tout à fait acceptable" que les affectations suivantes soient sémantiquement équivalentes :

T = x;
T(x);

Il s'ensuit logiquement qu'une affectation redondante comme T(T(x)) peut être supprimée de l'optimisation du code . Par conséquent, le compilateur appelle automatiquement le constructeur par défaut pour initialiser a, puis attribue directement l'objet nouvellement construit.

Pour forcer l'appel du constructeur de copie, il faut construire explicitement a par défaut avant d'attribuer :

A a; // Default-construct 'a'

// Copy constructor will be called to
// copy data from the newly constructed object.
a = A(5);

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn