web-dev-qa-db-fra.com

Copier le constructeur en C++ est appelé lorsqu'un objet est renvoyé d'une fonction?

Je comprends que le constructeur de copie est appelé sur trois instances

  1. Lors de l'instanciation d'un objet et de son initialisation avec les valeurs d'un autre objet.
  2. En passant un objet par valeur.

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

23
Kazoom

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.

16
sharptooth

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.

12
unwind

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.

5
xtofl

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é.

0
Lou Franco