Repository 32bit  Forum
Repository 64bit  Wiki

Costruttori di copia

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

Costruttori di copia

Messaggioda Blizzard » dom gen 13, 2008 12:26

[PREMESSA]
Banale! ma meglio esserne sicuri ^_^
[/PREMESSA]

ciao,
mi chiedevo una cosa:
Quando passo un oggetto per valore ad una funzione, la funzione crea una copia locale dell'oggetto! Questa copia ovviamente è guidata dal costruttore di copia vero???
Altrimenti cosa si porta appresso se nell'oggetto ho puntatori ad altri oggetti?

ciao
Gio
Avatar utente
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox

Re: Costruttori di copia

Messaggioda Bart » dom gen 13, 2008 12:34

Blizzard ha scritto:[PREMESSA]
Banale! ma meglio esserne sicuri ^_^
[/PREMESSA]

ciao,
mi chiedevo una cosa:
Quando passo un oggetto per valore ad una funzione, la funzione crea una copia locale dell'oggetto! Questa copia ovviamente è guidata dal costruttore di copia vero???
Altrimenti cosa si porta appresso se nell'oggetto ho puntatori ad altri oggetti?

ciao
Gio

Non so se ho capito bene la domanda ma normalmente il costruttore di copia io lo utilizzo quando voglio una copia di un oggetto con un indirizzo fisico differente da quello del costruttore classico in modo tale che se opero delle modifiche tramite il costruttore sull'oggetto non modifico anche quello relativo al costruttore di copia.
Bart
Staff
Staff
 
Messaggi: 4248
Iscritto il: dom ago 08, 2004 23:00
Località: Rimini

Re: Costruttori di copia

Messaggioda gallows » dom gen 13, 2008 13:29

Sì, è creato dal construttore di copia, infatti se lo imposti come "private" (e la funzione non è friend) il compilatore ti darà errore.
Se non l'hai definito, verrà usato un construttore di copia implicito che fa la copia bit a bit, e spesso non è esattamente ciò che serve. Infatti se hai puntatori come membri rischi casini :)
In una funzione, non passare un oggetto per valore, ma per const reference:
void f(const Fred& object);
Avatar utente
gallows
Staff
Staff
 
Messaggi: 3466
Iscritto il: dom set 19, 2004 23:00
Località: Palermo
Kernel: FreeBSD 8.0-RELEASE-p3
Desktop: ratpoison

Re: Costruttori di copia

Messaggioda Blizzard » dom gen 13, 2008 13:53

Se non l'hai definito, verrà usato un construttore di copia implicito che fa la copia bit a bit, e spesso non è esattamente ciò che serve. Infatti se hai puntatori come membri rischi casini :)

eh gia! era proprio il caso che mi ero immaginato! un oggetto con puntatori dentro e l'inaccettabile behaviour che avrebbe fatto si che il parametro attuale scrivesse la memoria dell'oggetto passato come parametro per valore :P (ovviamente se non definisci il costruttore di copia te la vai a cercare :D )

In una funzione, non passare un oggetto per valore, ma per const reference:
void f(const Fred& object);

Si! si! era solo per curiosità :P
è un ottimo metodo passare il riferimento const... ci guadagni in velocità e in memoria (rispetto alla creazione delle copie locali).

Ad occhio e croce che ne pensate se dico che il reference è ottimizzato anche rispetto ai puntatori??? (solo in ottica maniacale)
anche perchè quando passi un puntatore viene comunque creata una copia locale e poi per effettuare un accesso all'area di memoria devi dereferenziare esplicitamente il puntatore...

Comunque questa è solo un ottica maniacale che differisce dai miei gusti... potete dirmi di tutto ma non riesco a non stravedere per i puntatori :D

ciao
Gio
Avatar utente
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox

Re: Costruttori di copia

Messaggioda nuitari » dom gen 13, 2008 15:00

Che io sappia, la copia di un oggetto non comporta danni ad eventuali puntatori posti al suo interno.
Inoltre, se passi l'oggetto come puntatore, non rischi di copiare alcunchè.

La quantità di memoria/processing necessaria a referenziare un puntatore è abbastanza ridicola, il codice di gestione dei puntatori è molto molto ottimizzato.
Avatar utente
nuitari
Linux 2.6
Linux 2.6
 
Messaggi: 777
Iscritto il: dom ott 14, 2007 11:51
Località: San Colombano al Lambro
Slackware: 12.0

Re: Costruttori di copia

Messaggioda Blizzard » dom gen 13, 2008 15:28

Che io sappia, la copia di un oggetto non comporta danni ad eventuali puntatori posti al suo interno.
Inoltre, se passi l'oggetto come puntatore, non rischi di copiare alcunchè.

ciao,
quello che volevo dire era questo

Codice: Seleziona tutto
class A
{
public:
 char *str;
....
.....
};

void B(A param)
{
 char *b="Hello\n";
 strcpy(param.str,b);
}

int main()
{
  A var("Stringa"); //il costruttore inizializza var.str a "Stringa\0"

 B(var); /* Qui var viene passato per valore... ovvero B creerà una copia locale dell'oggetto
            * non essendoci un costruttore di copia il parametro attuale di b sarà in tutto e per tutto
            * uguale a var. Pertanto var.str e param.str punteranno alla stessa locazione.
            * strcpy(param.str,b); effettua una copia di stringhe ma non solo nel parametro attuale
            * ma anche in var dato che var.str e param.str continuano a puntare alla stessa locazione
            * e io non voglio questo comportamento
            */
 
}


errori nel codice a parte penso che ad occhio e croce è questo quello che volevo dire. Volevo solo esser certo che i parametri attuali venissero creati a partire dai costruttori di copia in un passaggio di oggetti per valore.

La quantità di memoria/processing necessaria a referenziare un puntatore è abbastanza ridicola,

infatti ho sottolineato ad essere pignoli :lol:

l codice di gestione dei puntatori è molto molto ottimizzato.

Effettivamente a questo non avevo pensato :-k in fin dei conti a rifletterci bene
int a=10;
int *p=&a;

scrivere a++ o scrivere *p++ implicano comunque dua accessi alla memoria di a

grazie

ciao
Gio
Avatar utente
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Google [Bot], Yahoo [Bot] e 1 ospite