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!