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
Libérer: 2024-12-08 09:22:11
original
589 Les gens l'ont consulté

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);
Copier après la connexion

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);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal