Copia di oggetti classe
Le operazioni di assegnazione e di inizializzazione comportano entrambe la copia degli oggetti.
Assegnazione: Quando il valore di un oggetto viene assegnato a un altro oggetto, il primo oggetto viene copiato nel secondo oggetto. Pertanto,
Point a, b; ... a = b;
comporta che il valore di b venga copiato in a.
Inizializzazione: l'inizializzazione si verifica quando viene dichiarato un nuovo oggetto, quando gli argomenti vengono passati alle funzioni per valore o quando i valori vengono restituiti dalle funzioni per valore.
È possibile definire la semantica di "copia" per gli oggetti di tipo classe. Si consideri, ad esempio, il seguente codice:
TextFile a, b;
a.Open( "FILE1.DAT" );
b.Open( "FILE2.DAT" );
b = a;
Il codice precedente potrebbe significare "copia il contenuto di FILE1.DAT in FILE2.DAT" o "ignora FILE2.DAT e imposta b come secondo handle per FILE1.DAT". È necessario associare la semantica di copia appropriata a ciascuna classe, come illustrato di seguito.
Utilizzando l'operatore di assegnazione operator= facendo riferimento al tipo di classe, come tipo restituito, e al parametro passato da const, ad esempio ClassName& operator=(const ClassName& x);.
Utilizzando il costruttore di copia. Per ulteriori informazioni sui costruttori di copia, vedere Regole per la dichiarazione di costruttori.
Se non si dichiara un costruttore di copia, il compilatore genera un costruttore di copia per membro. Se non si dichiara un operatore di assegnazione di copia, il compilatore genera un operatore di assegnazione di copia per membro. Dichiarando un costruttore di copia, non si elimina l'operatore di assegnazione di copia generato dal compilatore, e viceversa. Se si implementa uno dei due, è consigliabile implementare anche l'altro, in modo che il significato del codice sia chiaro.
L'assegnazione per membro è descritta dettagliatamente in Assegnazione e inizializzazione membro per membro.
Il costruttore di copia accetta un argomento di tipo class-name**&**, dove class-name è il nome della classe per cui il costruttore viene definito. Di seguito è riportato un esempio.
// spec1_copying_class_objects.cpp
class Window
{
public:
Window( const Window& ); // Declare copy constructor.
// ...
};
int main()
{
}
Nota
È bene scegliere il tipo dell'argomento const class-name& del costruttore di copia appena possibile.Ciò impedisce al costruttore di copia di modificare accidentalmente l'oggetto da cui viene copiato.In questo modo, inoltre, viene abilitata la copia da oggetti const.