Un petit éclaircissement sur la raison pour laquelle il est préférable de retourner par référence pour operator=
par rapport au rendement par valeur --- comme la chaîne a = b = c
fonctionnera correctement si une valeur est retournée.
Si vous renvoyez une référence, le travail effectué est minime. Les valeurs d'un objet sont copiées dans un autre objet.
Cependant, si vous retournez par valeur pour operator=
vous appellerez un constructeur et un destructeur à CHAQUE fois que l'opérateur d'affectation sera appelé !
Donc, donné :
A& operator=(const A& rhs) { /* ... */ };
Ensuite,
a = b = c; // calls assignment operator above twice. Nice and simple.
Mais,
A operator=(const A& rhs) { /* ... */ };
a = b = c; // calls assignment operator twice, calls copy constructor twice, calls destructor type to delete the temporary values! Very wasteful and nothing gained!
En somme, il n'y a rien à gagner à retourner par valeur, mais beaucoup à perdre.
( Note : Il ne s'agit pas d'aborder les avantages d'avoir l'opérateur d'assignation qui renvoie une lvalue. Lisez les autres articles pour savoir pourquoi c'est préférable).
4 votes
Il n'y a pas d'exigence de ce genre. Mais si vous voulez vous en tenir au principe de la moindre surprise, vous retournerez
A&
juste commea=b
est une expression lvalue faisant référence àa
en casa
yb
sont des ints.0 votes
@MattMcNabb Merci de me le faire savoir ! Je le ferai
0 votes
Pourquoi ne pouvons-nous pas revenir
A*
de l'opérateur d'affectation par copie, je suppose que l'affectation par chaînage fonctionnerait toujours correctement. Quelqu'un peut-il m'aider à comprendre les dangers de renvoyerA*
s'il y en a.1 votes
Remarque : Depuis C++11, il existe également l'option opérateur de déplacement-affectation La logique de cette question-réponse s'applique également à l'opérateur d'assignation des déménagements. En fait, il pourrait s'agir de la même fonction si elle était déclarée comme suit
A & operator=(A a);
c'est-à-dire en prenant l'argument par valeur.0 votes
@Krishna_Oza La vraie question est de savoir pourquoi vous voulez renvoyer un pointeur. Pensez à la laideur et à l'ambiguïté du code pour la surcharge des opérateurs et le retour si nous n'avions que des pointeurs - dans les cas clés, fatalement ambiguë (aussi : fatalement moche). Et puis lisez les propres mots du créateur de la langue à propos de tout cela : stackoverflow.com/questions/8007832/
1 votes
Il existe désormais aussi un Directive de base C++ à ce sujet, en expliquant également le contexte historique.