int main() {
complesso x, y(2, 5);
x = y + 2.5; // equivale a x=y + complesso(2.5);
...
}
Se non ricordo male (possibilissimo), il procedimento applicato è che prima l'oggetto y di classe complesso viene sommato al double 2.5 (somma per la quale deve esistere un operatore sovraccaricato), poi l'oggetto temporaneo restituito dall'operatore sovraccaricato viene assegnato all'oggetto x di classe complesso.
#include <stdio.h>
class complesso {
double re, im;
public:
complesso(double re=0, double im=0);
complesso operator+(const complesso &addendo_di_destra) const;
complesso operator+(double addendo_di_destra) const;
const char *Stringa();
};
complesso::complesso(double r, double i) {
re=r; im=i;
printf( "complesso: Funzione creatrice\n" ); // solo per un po' di info
}
complesso complesso::operator+(const complesso &addendo_di_destra) const {
printf( "complesso: operatore + con complesso\n" ); // solo per un po' di info
return complesso(re+addendo_di_destra.re,im+addendo_di_destra.im);
}
complesso complesso::operator+(double addendo_di_destra) const {
printf( "complesso: operatore + con double\n" ); // solo per un po' di info
return complesso(re+addendo_di_destra,im+addendo_di_destra);
}
const char *complesso::Stringa() { // giusto per poter avere un output visibile
static char s[64];
sprintf( s, "re: %lg\nim: %lg", re, im );
return s;
}
int main() {
complesso x, y(2, 5);
x = y + 2.5;
printf( "%s\n", x.Stringa() );
return 0;
}
Questa roba dà un'uscita così:
complesso: Funzione creatrice
complesso: Funzione creatrice
complesso: operatore + con double
complesso: Funzione creatrice
re: 4.5
im: 7.5
In effetti, la funzione creatrice viene invocata due volte per generare gli oggetti x e y.
Poi viene eseguito y+2.5 nell'apposita funzione sovraccaricata.
La funzione sovraccaricata crea un oggetto di classe complesso per usarlo come valore in uscita per il suo return (il che spiega la terza invocazione della funzione creatrice).
A quel punto l'oggetto temporaneo creato e restituito viene assegnato all'oggetto x. Credo che non venga segnalata alcuna operazione perché l'oggetto x esiste già e non è stato definito un operatore di assegnamento sovraccaricato, per cui viene usato quello di default (quello che fa una copia bit-per-bit dell'oggetto da copiare in quello che riceve).
Se ho scritto inesattezze, chi è più esperto mi corregga, così imparo anch'io.