Maison > développement back-end > C++ > Pourquoi le constructeur de copie n'est-il pas appelé lors de l'initialisation directe en C ?

Pourquoi le constructeur de copie n'est-il pas appelé lors de l'initialisation directe en C ?

Patricia Arquette
Libérer: 2024-12-16 17:01:09
original
688 Les gens l'ont consulté

Why Isn't the Copy Constructor Called During Direct Initialization in C  ?

Constructeur de copie invoqué par initialisation directe

Dans l'extrait de code fourni, vous pouvez vous attendre à ce que le constructeur de copie soit invoqué lors de l'attribution de A(5 ) à un. Cependant, le code n’appelle jamais le constructeur de copie. Ce comportement n'est pas le résultat de l'optimisation du compilateur mais plutôt une fonctionnalité documentée de C .

Lorsque vous initialisez un objet en utilisant l'initialisation directe (A a = A(5);), le compilateur effectue une élision de copie. Cette optimisation supprime la construction inutile d'un objet temporaire suivie de la copie de cet objet dans la variable initialisée. Au lieu de cela, la variable initialisée est directement initialisée avec l'argument du constructeur.

Ce comportement est documenté dans la norme C (§12.8.15, p. 211), qui stipule que l'initialisation directe équivaut à la construction du objet sur place en utilisant les arguments du constructeur :

T x; // Default initialization
T x = y; // Direct initialization
Copier après la connexion

Dans ce cas, a est initialisé directement avec les arguments du constructeur A, en contournant le constructeur de copie. Pour forcer le compilateur à appeler le constructeur de copie, vous devez d'abord construire par défaut un :

A a;
// A is now a fully constructed object,
// so it can't call constructors again:
a = A(5);
Copier après la connexion

Cela garantit que le constructeur de copie est appelé lorsque a reçoit la valeur de 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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal