Costruttori di copia
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.
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.
- Blizzard
- Master
- Messaggi: 1509
- Iscritto il: mar 2 gen 2007, 22:53
- Nome Cognome: Giovanni Santostefano
- Slackware: 12.2
- Kernel: 2.6.27.7-smp
- Desktop: Fluxbox
- Contatta:
Costruttori di copia
[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
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
Re: Costruttori di copia
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.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
- gallows
- Staff
- Messaggi: 3470
- Iscritto il: lun 20 set 2004, 0:00
- Slackware: 64-current
- Kernel: 5.10.7
- Località: ~/
- Contatta:
Re: Costruttori di copia
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);
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);
- Blizzard
- Master
- Messaggi: 1509
- Iscritto il: mar 2 gen 2007, 22:53
- Nome Cognome: Giovanni Santostefano
- Slackware: 12.2
- Kernel: 2.6.27.7-smp
- Desktop: Fluxbox
- Contatta:
Re: Costruttori di copia
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 )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
Si! si! era solo per curiosità :PIn una funzione, non passare un oggetto per valore, ma per const reference:
void f(const Fred& object);
è 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
ciao
Gio
- nuitari
- Linux 3.x
- Messaggi: 777
- Iscritto il: dom 14 ott 2007, 12:51
- Slackware: 12.0
- Località: San Colombano al Lambro
- Contatta:
Re: Costruttori di copia
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.
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.
- Blizzard
- Master
- Messaggi: 1509
- Iscritto il: mar 2 gen 2007, 22:53
- Nome Cognome: Giovanni Santostefano
- Slackware: 12.2
- Kernel: 2.6.27.7-smp
- Desktop: Fluxbox
- Contatta:
Re: Costruttori di copia
ciao,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è.
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
*/
}
infatti ho sottolineato ad essere pignoliLa quantità di memoria/processing necessaria a referenziare un puntatore è abbastanza ridicola,
Effettivamente a questo non avevo pensato in fin dei conti a rifletterci benel codice di gestione dei puntatori è molto molto ottimizzato.
int a=10;
int *p=&a;
scrivere a++ o scrivere *p++ implicano comunque dua accessi alla memoria di a
grazie
ciao
Gio