[C++] Precisazione su overload operator
Salve a tutti, mentre studiavo l'overloading degli operatori entro in contatto con questa scrittura.
Dove Byte è una classe dichiarata in precedenza. Ovviamente vale per qualsiasi operator.
Mi torna all'incirica tutto, ma non capisco la riga
cioè, io controllo se l'oggetto attuale che richiama l'operatore è uguale a se stesso, che sarebbe il caso di
immagino. Ma che dovrei fare in questo caso? Non varrebbe comunque la regola
ovvero
Grazie a chiunque mi darà delucidazioni
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
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.
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.
Se non viene eseguita alcuna espressione/istruzione tra le graffe relative all'if, non conviene togliere del tutto l'if?
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ì.