Je comprends que le constructeur de copie est appelé sur trois instances
3. Lorsqu'un objet est renvoyé d'une fonction par valeur.
J'ai une question avec n ° 3 si le constructeur de copie est appelé lorsqu'une valeur d'objet est renvoyée, ne devrait-il pas créer de problèmes si l'objet est déclaré localement dans la fonction.
je veux dire que le constructeur de copie est une copie profonde et prend la référence d'un objet en tant que paramètre
C'est ce qu'on appelle exactement pour éviter les problèmes. Un nouvel objet servant de résultat est initialisé à partir de l'objet défini localement, puis l'objet défini localement est détruit.
En cas de copie en profondeur, le constructeur défini par l'utilisateur est identique. Le premier stockage est alloué pour l'objet qui servira de résultat, puis le constructeur de copie est appelé. Il utilise la référence passée pour accéder à l'objet défini localement et copier ce qui est nécessaire dans le nouvel objet.
La copie est effectuée avant la fin de la fonction appelée et copie la variable locale alors existante dans la valeur de retour.
La fonction appelée a accès à la mémoire que la valeur de retour occupera, même si cette mémoire n'est pas "dans l'étendue" lors de la copie, elle est toujours disponible.
Selon une réponse à ma question, le constructeur de copie peut être appelé même deux fois: une fois pour copier un objet local sur le 'objet' de retour, et une fois pour copier l'objet de retour sur la variable il a été assigné à.
Cependant, il n'a pas besoin de be! Le compilateur peut optimiser les deux constructions de copie.
Non, ça l'appelle avant que les locaux ne soient détruits. Vous pouvez tester cela avec un objet qui enregistre la destruction et la construction de copie ou en consultant le code d'assembly généré.