• Non ci sono risultati.

Costruttori di Copia

N/A
N/A
Protected

Academic year: 2021

Condividi "Costruttori di Copia"

Copied!
10
0
0

Testo completo

(1)

Costruttori di Copia

(2)

Costruttore di copia

Esiste un tipo speciale di costruttore detto costruttore di copia

Un costruttore di copia serve per inizializzare un oggetto tramite un altro oggetto

Il costruttore di copia è una funzione membro che ha lo stesso nome della classe e ha come argomento un riferimento costante ad un oggetto della stessa

classe

NomeClasse(const NomeClasse &)

Il compilatore crea un costruttore di copia bit a bit di default, cioe' ogni dato membro viene copiato

(3)

Quando viene invocato il costruttore di copia

Ci sono tre casi in cui viene invocato il costruttore di copia:

inizializzazione esplicita

passaggio per valore ad una funzione restituzione di un oggetto temporaneo

(4)

Inizializzazione Esplicita

Time t1(12,00);

Time t2(t1);

Time t3=t1;

Le due forme t2(t1) e t3=t1 sono equivalenti Nota: t3=t1 non è una assegnazione ma una inizializzazione

Ogni dato membro di t2 viene inizializzato con i valori dei dati membro corrispondenti di t1

(5)

Passaggio per valore ad una funzione

void func(Time);

void main(){

Time t(12,00);

func(t);

}void func(Time myT){

cout<<myT;

}

Ogni dato membro di myT viene inizializzato con i valori dei dati membro corrispondenti di t

Nota: utilizzando il costruttore standard, myT sarebbe inizializzato con valori (di default) diversi da quelli di t e questo sarebbe un errore logico

(6)

Restituzione di un oggetto temporaneo

Time func(Time);

void main(){

Time t(12,00), t2;

t2=func(t);

}

Time func(Time myT){

myT.ora+=1;

return myT;

}

(7)

Spiegazione

L’oggetto myT è locale alla funzione func.

Non è pertanto possibile riferirsi a tale oggetto al di fuori della funzione.

Quando viene eseguita l’istruzione t2=func(t) accade in realtà la seguente cosa:

viene creato un oggetto temporaneo [result]

questo oggetto viene inizializzato per copia con l’oggetto restituito da func: [result]=myT di func(t)

viene distrutto myT

viene eseguita l’assegnazione t2=[result]

viene distrutto [result]

(8)

Nota sul Costruttore di copia

Si deve necessariamente passare un riferimento per alias al costrutture di copia

Non sarebbe logicamente possibile effettuare un passaggio di parametri per valore

Dare la possibilità di creare un costruttore di copia con passaggio di parametro per valore comporta una dipendenza logica circolare

infatti nella funzione costruttore di copia il parametro passato dovrebbe essere copiato

ma questo richiamerebbe proprio il costruttore di copia (cioe' la stessa funzione)

il ciclo continuerebbe senza fine

(9)

Costruttore di Copia con dati dinamici

E’ necessario creare esplicitamente un costruttore di copia quando un oggetto ha dati membro allocati

dinamicamente

Per oggetti con dati allocati dinamicamente la copia bit- a-bit copia solo il dato puntatore, cioè l’indirizzo di

memoria

Quando un oggetto B è inizializzato come copia di un oggetto A si ha che entrambi gli oggetti hanno un

puntatore che indirizza la stessa area di memoria

Quando si dealloca il dato per un oggetto questo non esiste più nemmeno per la copia

Si corre il rischio di deallocare due volte la stessa area di memoria!

(10)

Costruttore di copia

class Array{

public:

Array(int usr_size=10){

size=usr_size;

ptr=new int[size];

}Array(const Array& copia){

size=copia.size;

ptr=new int[size];

for(int i=0;i<size;i++)

ptr[i]=copia.ptr[i];

}~Array(){delete [] ptr;}

private:

int *ptr;

int size;

};

Riferimenti

Documenti correlati

[r]

Il presente avviso è indetto ai sensi del Regolamento aziendale sulla Mobilità Volontaria Esterna in entrata – Dirigenza e Comparto, ai sensi art. La sede di servizio sarà

[r]

Dato atto che i Medici collocati nella graduatoria stessa sono stati convocati secondo le procedure previste

2) di stabilire che l’incarico avrà una durata, per entrambi i progetti, fino al 31/12/2018, a partire dalla data di sottoscrizione del relativo contratto

Valutazione sperimentale dello stato tensionale delle travi da ponte pre e post compresse Metodo del Rilascio tensionale con provino tronco piramidale – monitoraggio della

Note per la trasparenza:IL provvedimento approva l'integrazione degli interventi a sostegno del reddito a favore di persone iscritte agli elenchi della Legge 68/99, autorizzata dalla

Accertato che il Piano regionale di contrasto al Gioco d'Azzardo prevede, quale strategia la condivisione e collaborazione tra i soggetti istituzionali e non