1) Però perché "int + class" non lo sa fare (invece di "class + int") ?
In linea generale il compilatore cerca sempre di convertire il secondo parametro con il tipo del primo ... Siccome la conversione da int a class è definita (seppur in maniera automatica) in fase di compilazione non si hanno errori di sorta, diversamente dal secondo caso (la cui conversione non avviene in automatico ma deve essere definita dal programmatore)
Leggendo un libro sul c++, ho letto di fare molta attenzione riguardo al costruttore per copia, perché visto che quello di default copia bit a bit, se uso puntatori nella classe rischio di andare a condividere lo stesso membro tra più classi se uso l'=. Questo fatto mi ha fatto venire la paranoia e non so mai bene cosa fare per fare le cose fatte bene...
In generale non bisogna mai lasciare il costruttore di copia di default quando si hanno puntatori come attributi (anche se delle volte potrebbe essere voluto) soprattutto quando si utilizzano i puntatori per allocare memoria
Ad esempio se ho la classe C, e C1, C2, C3 tre variabili di quella classe, se io scrivo: C3 = C1 + C2 allora, viene chiamato il + di C1 e viene passato C2, il + fa il suo lavoro e crea un NUOVO oggetto che chiamiamo T1; Poi viene chiamato il costruttore per copia (o l'operator = ?!?) di C3, gli viene passato T1, e si crea un nuovo oggetto T2, e T1 muore. Infine T2 viene copiato bit a bit in C3, e T2 muore.
In realtà verrebbe creato un oggetto temporaneo (T1) che poi verrebbe passato all' operator= per riferimento (quindi niente T2) e poi T1 verrebbe distrutto
Ora, non sono per niente sicuro di quello che ho detto (perdonami sto studiando ora), ma chi viene chiamato in quel codice? il costruttore per copia o l'=?
All' inizio è molto facile confondersi ... Comunque tieni bene a mente che quando un oggetto viene definito (quindi costruito) e copiato allo stesso tempo, viene richiamato il costruttore di copia (non a caso è chiamato costruttore). Se invece un oggetto viene copiato ma dopo la sua definizione, viene richiamato l' operator=