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