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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
ClasseToto instance1;
ClasseToto instance2(10,20);
 
instance1 = instance2;
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
5
6
const ClasseToto & ClasseToto::operator = (const ClasseToto &instance)
{
    SetAttribut1(instance.GetAttribut1());
    SetAttribut2(instance.GetAttribut2());
    return *this;
}
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
ClasseToto::operator = (const ClasseToto &instance)
{
    SetAttribut1(instance.GetAttribut1());
    SetAttribut2(instance.GetAttribut2());
}
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?


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 :
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;
}
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
const ClasseToto & ClasseToto::operator = (const ClasseToto &instance)