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)
Partager