[C++] Precisazione su overload operator

starsuper
Salve a tutti, mentre studiavo l'overloading degli operatori entro in contatto con questa scrittura.

Byte& operator^=(const Byte& right) {
    if(this == &right) {/* self-assignment */}
    b ^= right.b;
    return *this;


Dove Byte è una classe dichiarata in precedenza. Ovviamente vale per qualsiasi operator.
Mi torna all'incirica tutto, ma non capisco la riga
{/* self-assignment */}


cioè, io controllo se l'oggetto attuale che richiama l'operatore è uguale a se stesso, che sarebbe il caso di


a^=a


immagino. Ma che dovrei fare in questo caso? Non varrebbe comunque la regola
 
b ^= right.b;
return *this;



ovvero


a^=a;
a=a^a;



Grazie a chiunque mi darà delucidazioni

Risposte
vict85
Questo tipo di test possono avere due ragioni:
1. Performance - a volte applicare l'operazione con se stesso permette di semplificare notevolmente l'operazione. Per esempio un AND o un OR con se stesso produce se stesso mentre uno XOR produce tutti 0. Certo, nel tuo caso, il confronto potrebbe essere più lento della operazione che vuole evitare, rendendo l'ottimizzazione in questione tra il quasi inutile e il controproducente.
2. Correttezza del risultato - in alcuni casi, come il prodotto matriciale, scrivere il risultato su uno dei due operandi potrebbe compromettere il risultato. Pertanto questi casi vanno gestiti con attenzione.

starsuper
Se non viene eseguita alcuna espressione/istruzione tra le graffe relative all'if, non conviene togliere del tutto l'if?

apatriarca
Certo che conviene.. Ma il compilatore dovrebbe già farlo in ogni caso per te. Probabilmente non cambierebbe insomma nulla alla fine. Ma non vedo la ragione di tenerlo lì.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.