#include using namespace std; #include // Questo codice e' solo di tipo illustrativo. Qui non ci sarebbe alcun bisogno di esplicitare il //costruttore di copia e l'operatore di assegnazione. class Rettangolo { double x, y; double semiperimetro () {return (x+y);} public: Rettangolo (); //default constructor; serve soprattutto per inizializzare ~Rettangolo(); //distruttore di default Rettangolo (double, double); //overloading del costruttore; serve soprattutto per inizializzare double area () {return (x*y);} // double perimetro() {return 2*(x+y);} double perimetrobis () { return ( 2*semiperimetro() ); } Rettangolo(const Rettangolo & other ); //costruttore di copia Rettangolo & operator = (const Rettangolo & other); }; Rettangolo:: Rettangolo (){ x=5; y=5; } Rettangolo::~Rettangolo (){ //libera la memoria allocata.In questo caso non c'e'. Provare a rifare tutto dove invece dei double x, y //si usano puntatori int *x e int *y cout << " Chiamato il distruttore" << endl; } Rettangolo:: Rettangolo (double a, double b){ x=a; y=b; } Rettangolo::Rettangolo(const Rettangolo& other){ x=other.x; y= other.y; cout << " Chiamato il costruttore di copia:" << " x = " << x << " y= " << y << endl; } Rettangolo &Rettangolo:: operator = (const Rettangolo & other){ if (this != &other){ //this e' il puntatore all'oggetto corrente // si libera la memoria dell'ogetto corrente //e si ricostruisce immediatamente l'oggetto corrente this-> x = other.x; this-> y = other.y; } cout << " Chiamato l'operatore assegnazione: " << "x = " << this-> x << "; y = " << this-> y << endl; return *this; } int main () { Rettangolo ret1(2.0,3.0), ret2(3.0,5.0); cout << "area ret1 = " << ret1.area() << "; area ret2 = "<< ret2.area() << endl; ret2 = ret1; //i due rettangoli sono gia' stati creati e stiamo ASSEGNANDO a ret2 gli attributi di ret1. cout << "area ret1 = " << ret1.area() << "; area ret2 = "<< ret2.area() << endl; Rettangolo ret3 = ret1; //CREA il rettangolo ret3, inizializzandolo a ret1 cout << "area ret3 = " << ret3.area() << endl; // ....... return (0); } //// output: // area ret1 = 6; area ret2 = 15 // Chiamato l'operatore assegnazione: x = 2; y = 3 // area ret1 = 6; area ret2 = 6 // Chiamato il Costruttore di copia x = 2 y= 3 // area ret3 = 6 // Chiamato dal distruttore // Chiamato dal distruttore // Chiamato dal distruttore