C++: le retour par référence et copie des constructeurs

Les références en C++ sont déconcertants moi. 🙂

L'idée de base est que je suis en train de retourner un objet à partir d'une fonction. J'aimerais le faire sans avoir à retourner un pointeur (parce que j'en serais manuellement delete elle), et sans appeler le constructeur par copie, si possible (pour plus d'efficacité, naturellement ajouté: et aussi parce que je me demande si je ne peux pas éviter d'écrire un constructeur de copie).

Donc, dans l'ensemble, voici les options que j'ai trouvé:

  • Le type de retour de fonction peut être soit la classe elle-même (MyClass fun() { ... }) ou une référence à la classe (MyClass& fun() { ... }).
  • La fonction peut se construire la variable à la ligne de retour (return MyClass(a,b,c);) ou retourner une variable existante (MyClass x(a,b,c); return x;).
  • Le code qui reçoit la variable peut également avoir une variable de type: (MyClass x = fun(); ou MyClass& x = fun();)
  • Le code qui reçoit la variable pouvez soit créer une nouvelle variable à la volée (MyClass x = fun();) ou l'affecter à une variable existante (MyClass x; x = fun();)

Et quelques réflexions sur que:

  • Il semble être une mauvaise idée d'avoir le type de retour MyClass& parce que c'est toujours la variable d'être détruit avant qu'il soit retourné.
  • Le constructeur de copie ne semble s'impliquer quand je retourner une variable existante. Lors du retour d'une variable construite dans la ligne de retour, elle n'est jamais appelée.
  • Quand j'affecter le résultat à une variable existante, le destructeur aussi toujours des coups de pied en avant la valeur est retournée. Aussi, pas de constructeur de copie est appelé, encore variable cible reçoit les valeurs d'un membre de l'objet retourné par la fonction.

Ces résultats sont si incompatibles que je me sens totalement confus. Alors, quelle est EXACTEMENT ce qui se passe ici? Comment dois-je correctement construire et retourne un objet à partir d'une fonction?

  • La raison pour laquelle le constructeur de copie n'est pas d'être appelé dans le second cas est appelé retour de la valeur de l'optimisation, ou de la RVO. Le compilateur est permis d'omettre le temporaire + copie, même si cela change le comportement du programme.
  • Ce sur le retour à une variable existante problème? J'ai été confronté, mais je ne pouvais pas comprendre pourquoi le destructeur des coups de pied dans un pas de constructeur de copie est appelé. Avez-vous jamais savoir ce qui en est la cause?
  • Désolé, non, je n'ai pas beaucoup travaillé avec C++ et je ne sais pas la réponse. Je pense que j'ai abandonné ce projet ou réécrit différemment. (c'était il y a 5 ans, vous savez).
InformationsquelleAutor Vilx- | 2010-02-16