Bonjour, je viens de débuter à apprendre le C++ et je me pose une question sur la surcharge de l'opérateur = (tout est fonctionnel, mais j'aimerais comprendre mieux). Je veux, par exemple, avec cette surcharge pouvoir copier les attributs d'un objet et les affecter à un autre objet du même type. Par exemple :
Dans la documentation que j'ai, il est indiqué qu'il faut avoir la signature suivante (suivi d'une déclaration quelconque) et alors, il est nécessaire de retourner *this :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ClasseToto instance1; ClasseToto instance2(10,20); instance1 = instance2;
Par contre, puisque l'opérande de gauche (instance1 dans notre exemple) est l'instance propriétaire de la méthode, je trouve un peu aberrant le retour de soi-même (*this). D'intuition, j'aurais eu plus tendance à faire ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 const ClasseToto & ClasseToto::operator = (const ClasseToto &instance) { SetAttribut1(instance.GetAttribut1()); SetAttribut2(instance.GetAttribut2()); return *this; }
J'ai testé les deux et j'obtiens les mêmes résultats. Par contre, sont-elles vraiment équivalentes? Si non, qu'elles en sont les différences? Est-ce que l'utilisation d'un return nécessite plus de temps de traitement (aussi minime soit-il)? Est-ce qu'une des deux est à prévaloir?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 ClasseToto::operator = (const ClasseToto &instance) { SetAttribut1(instance.GetAttribut1()); SetAttribut2(instance.GetAttribut2()); }
Question secondaire:
Avant d'écrire ce message, j'ai cherché pour trouver d'autres documentations sur la surcharge d'opérateurs et souvent, la signature suivante est présentée :
Si je comprends bien, cela signifie que le *this retourné sera une copie de l'opérande de gauche. Si c'est exact, malgré que le traitement pour effectuer la copie peut-être négligeable dans bien des cas, pourquoi est-ce que l'on retrouve souvent cette signature dans les exemples au lieu de la signature suivante?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ClasseToto ClasseToto::operator = (const ClasseToto &instance) { SetAttribut1(instance.GetAttribut1()); SetAttribut2(instance.GetAttribut2()); return *this; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part const ClasseToto & ClasseToto::operator = (const ClasseToto &instance)






Répondre avec citation



Je me rappelais du comment faire pour "désactiver" le constructeur de copie et l'opérateur d'affectation, mais je n'avais pas saisi dans quel cas il était une bonne chose de l'appliquer. Je vais faire bien attention à ceci lorsque j'aurai du polymorphisme.




Partager