Originariamente inviato da XWolverineX
Non vorrei dire una fesseria, ma se hai un costruttore di copia l'operatore in overloading non ti serve proprio.
Il compilatore dovrebbe capire da solo e fare la chiamata giusta alla funzione.
Prova e fammi sapere.
L'operatore d'assegnamento ed il costruttore di copia sono due cose volutamente distinte. Nel costruttore si costruisce, nell'operatore d'assegnamento in generale si distrugge e si ricostruisce.
Nel seguente esempio, attenzione al punto 2 che è equivalente al punto 1: in entrambi i casi viene chiamato il costruttore, NON l'operatore d'assegnamento che invece viene chiamato al punto 3.
Codice PHP:
// 1. L'oggetto a0 viene costruito chiamando il costruttore della classe A,
// che ha per argomento la class C
C c0;
A a0 (c0); // viene chiamato A::A (C &)
// 2. equivalente a (è solo una differente sintassi,
// in tutto e per tutto equivalente alla precedente):
A a1 = c0; // viene chiamato A::A (C &)
// 3. Invece nella seguente viene chiamato l'operatore d'assegnamento:
a1 = c0; // viene chiamato l'operatore d'assegnamento (a1 già esiste, NON deve essere costruito)!
formalmente l'operatore d'assegnamento dovrebbe contenere codice equivalente a quello del suo distruttore + quello del suo costruttore relativo, praticamente si cerca di evitare di distruggere e ricreare cose che possono sopravvivere tra le due operazioni. Nell'equivalenza bisogna tenere conto che sia nel costruttore che nel distruttore il meccanismo virtuale non è applicabile, mentre nell'operatore d'assegmaento sì (quindi in generale non basta un doppio copia/incolla).
Attenzione quindi: i punti 1 e 2 sono EQUIVALENTI in entrambi i casi viene chiamato il costruttore relativo, nel punto 3 invece viene chiamato l'operatore d'assegnamento.