Newsgroup: it.comp.lang.c++
Titolo: Assegnazioni di oggetti

Salve a  tutti, avrei bisogno di un aiuto per comprendere meglio questo 
fenomeno nel caso standard, cioe' quando l'operatore '=' e' privo di 
overload.
#include <iostream.h>
class V
{
	public:
		int vett[10];
};
main()
{
	V x,y;
	x.vett[2] = 200;
	y = x;
	cout << "y.vett[2] = " << y.vett[2] << endl;
	y.vett[2] = 0;
	cout << "x.vett[2] = " << x.vett[2] << endl;
}
Il mio testo universitario dice che nel caso standard y = x "ha come 
effetto di assegnare ad ognuno dei campi di y il valore del rispettivo 
campo di b". Definizione terribile a mio avviso. Lo Schildt (si lo so e' 
cattivo manuale, ma lo uso solo come riferimento per questo genere di 
cose), parla di "copia bit a bit dei dati della classe".
Dando per 'corretta' la seconda definizione (la prima mi sembra 
veramente assurda.. in questo esempio, io dovrei pensare che y=x ---> 
y.vett=x.vett, che non e' vero), nel caso di vettori allocati 
dinamicamente cosa cambia rispetto a questa situazione?
Io mi aspetterei  che 'copiando bit a bit' un vettore allocato 
dinamicamente su un altro comunque non vi sia condivisone di memoria, in 
quanto la memoria verrebbe allocata o alla costruzione dell'oggetto, o 
prima dell'assegnazione e pertanto se si fossero usati vettori allocati 
dinamicamente si sarebbe ottenuto lo stesso risultato.
Ho ragione o mi sbaglio?
Vi ringrazio in anticpo per tutti i commenti, e mi scuso per la 
prolissita' e l'eventuale poca chiarezza.
Gavrila

 dinamicamente si sarebbe ottenuto lo stesso risultato.
Uhm... non ho capito quali ti aspetti che sia il comportamento, 
onestamente :P.
Cmq: se hai vettori allocati dinamicamenti, avrai come attributi della 
classe dei puntatori:
class W
{
public:
   char* vett;
   W()
   {
     vett = new char[20];
   }
   ~W()
   {
     delete vett;
   }
};
Ora, la copia 'bit a bit' implica che la variabile 'vett' venga copiata 
bit a bit. Quindi, in:
W w1, w2;
w2 = w1;
alla fine, w2.vett = w1.vett - ovvero, puntano allo stesso oggetto in 
memoria. Tra l'altro, facendo cosi', la memoria che aveva allocato 
inizialmente w2 non puo' piu' essere deallocata, in compenso quella di 
w1, quando vengono chiamati i costruttori, viene deallocata _due volte_ :P
-- 
/**
  * Mattia Belletti - Undergraduate student @ 
cs.unibo.it
  * ICQ: 33292311   - email: 
mbel...@cs.unibo.it
  * IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
  * Linux registered user 299762 @ Linux registered machine 213003
  */

 
Ma allora  nell'esempio che ho riportato perche'
  y.vett[2] = 0;
     cout << "x.vett[2] = " << x.vett[2] << endl;
stampa cmq 200?? Eseguendo la 'copia bit a bit' ( :D ),l'istruzione y = 
x  dovrebbe equivalere  y.vett = x.vett
ora poiche' e' stato definito
	public:
		int vett[10];
ne segue che il tipo di vett e' int*.
Pertanto  y.vett = x.vett copia l'indirizzo contenuto in x.vett, nel 
puntatore y.vett.
quando si fa y.vett[2] = 0; e' euqivalente a scrivere *(y.vett+2)=0;
Ma questo per quanto detto sopra dovrebbe essere *(x.vett+2) = 0;
e quindi dovrebbe modificarsi il valore di x.vett[2] che invece 
eseguendo il codice resta a duecento.
Dov'e' che sbaglio?
Grazie ancora,
Gavri

 questa situazione?
Vettori o array?  Allocati da chi?
In ogni caso l'assegnamento di default fa sempre un assegnamento
membro a membro.  Se un membro e` un puntatore viene copiato il
puntatore.
Esempio:
  class Test2 {
    int * ptr;
  };
L'operatore di assegnamento di default e` equivalente a:
  Test2 & Test2::operator = (const Test2 & t) {
    ptr = t.ptr;
    return *this;
  }
L'eventuale memoria allocata e puntata da ptr *non* e` un membro della
classe e non viene copiata.
Se la classe deve gestire memoria dinamica, bisogna definire un
opportuno operatore di assegnamento (e anche il costruttore di copia e
il distruttore). Esempio:
  struct Test3 {
    int * ptr;
    ....
    Test3 & operator = (const Test3 & t) {
      *ptr = *(t.ptr);
    }
  };
        Mauro      


Sbagli ad identificare array e puntatori. In determinate circostanze un 
array può "decadere" in un puntatore (ad es. quando viene passato come 
argomento ad una funzione con una certa signature), ma in generale array e 
puntatori sono nozioni diverse, che è bene non confondere. Nota, inoltre, 
che in C++ è possibile passare un array per riferimento. In questo caso non 
ha senso parlare di "decadimento", né di puntatori.
   void func( char ( & arg )[ 100 ] ); // riferimento a un array di 100 char
Per evidenti motivi, questa non è un opzione disponibile in C.
Max