mercoledì 5 dicembre 2012

Sovraccarico operatore Assegnazione

Quando entrambe le istruzioni di assegnazione sono oggetti della stessa classe, la funzione dell'operatore di assegnazione della classe viene chiamata. Come il costruttore copia, esiste un opzione di default fornita dal compilatore se non ne viene scritta una. Tuttavia come il costruttore copia anche questa si occupa solo di effettuare una duplicazione di ogni membro della classe. Per le classi più semplici, solitamente funziona bene. Comunque quando una classe punta ad alcuni dati membro memorizzati su heap, è consigliabile fornire una propria funzione di assegnazione. Altrimenti si creeranno copie vuote degli oggetti quando vengono assegnati l'un l'altro. Per evitare il problema dare un'occhiata alla funzione scritta per la classe Roditore.

   Roditore& operator= (const Roditore& c)
     { cout << “Overload operatore assegnazione”;
        if (this == &c) return *this;
        else {
                  m_pNome = new string;
                 *m_pNome = c.DaiNome();
                 }
    }
Da notare che la funzione membro restituisce un riferimento all'oggetto Roditore. Per un operatore di assegnazione robusto, deve essere restituito il riferimento all'assegnazione sovraccaricata della funzione membro. Di seguito in main(), sono richiamate le funzioni che verificano l'operatore di assegnazione.

void testAssegnaOp()
{ Roditore ctopo1(“topo1”);
   Roditore ctopo2(“topo2”);
   ctopo1 = ctopo2;
testAssegnaOp() crea due oggetti e ne assegna uno all'altro. La procedura di assegnazione, ctopo1=ctopo2; richiama l'operatore di assegnazione (=) per ctopo1. Nella funzione operator=(), c è una costante di riferimento a ctopo2. Dopo che operator=() viene visualizzato a schermo, viene usato il puntatore this. Di cosa si tratta? E' un puntatore a tutti gli oggetti funzione non statici , al quale punta l'oggetto che viene usato per chiamare la funzione. Nelle righe successive viene confrontato l'indirizzo di ctopo1 sia equivalente a ctopo2 nel caso l'oggetto sia assegnato a se stesso. Altrimenti viene eseguita l'istruzione *m_pNome = c.DaiNome(); che assegna la stringa topo2 al blocco di memoria di ctopo1. Infine si restituisce una copia di ctopo1 restituendo con *this. La verifica viene effettuata facendo DireCiao() a ctopo1 e ctopo2 ed ottenendo il medesimo risultato.

Nessun commento:

Posta un commento