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
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);
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!