Copy_costructor: shallow copy and deep copy

La copia di un oggetto può essere fatta o con il copy costruito o con l’operatore di assegnazione. Attenzione che se uso la seguente sintassi object p=o; NON USO l’operatore di assegnazione, ma il copy costructor.

Dato un oggetto o che contiene due attributi: int n, int *ptn, e dato un oggetto p copia di o

FACCIO UNA SHALLOW COPY (o copia superficiale)

quando copio in p il valore n di o e l’indirizzo XXXX di *ptn

FACCIO INVECE UNA DEEP COPY ( o copia profonda )

quando vado più a fondo cioè non copio l’indirizzo del puntatore ma vado in profondo a vedere il valore puntato dell’indirizzo, copiando il valore non l’indirizzo.

Quindi cosi facendo lascio slegati e indipendenti i due oggetti.

//
//  main.cpp
//  Copy_Costructor : copia superficiale e copia profonda
//
//  Created by alessandro barazzuol on 07/01/2021.
//

#include <iostream>
using namespace std;

class object
{
public:
    int n;
    int *ptn;
    //costruttore
    object(){
        ptn=new int(100);
        n=200;
    }
    
    //copy costructor: deep copy===clone()
    object( const object& o)
    {
        //cout<<"Passa\n";
        this->n=o.n;
        ptn=new int();
       
        *this->ptn=*(o.ptn);
         
        //this->ptn=o.ptn;
        
    }
    
    
};


int main(int argc, const char * argv[]) {
    
    //originale
    object o;
    
    object p(o);//equivale a object p=o; uso il copy costructor
    
    
    //copia
    //object p=o;//usa copy costructor
    
    //p=o; qui non uso il copy costructor ma l'assegnazione
    //usa l'operatore assegnazione =
    cout<<"n di originale: "<<o.n<<" ptn originale: "<<*o.ptn<<endl;
    cout<<"n di copiato: "<<p.n<<" ptn copiato "<<*p.ptn<<endl;
    
    
   cout<<"Modifico l'originale\n";
    int ass=999;
    o.n=888;
    *o.ptn=ass;
    //o.ptn=&ass;
    
    cout<<"n di originale: "<<o.n<<" ptn originale: "<<*o.ptn<<endl;
    cout<<"n di copiato: "<<p.n<<" ptn copiato "<<*p.ptn<<endl;
    
    
    
    
    return 0;
}