July 4
Un costruttore di copia è una funzione di membro speciale all'interno di una classe. Esso accetta un riferimento a un oggetto esistente dello stesso tipo di classe e fa una copia completa di tale oggetto. Una copia in profondità non solo gli esemplari tutti i campi membro, ma anche copie ogni allocati dinamicamente la memoria. Compilatori C ++ si copiano automaticamente la costruzione. È necessario definire un costruttore di copia quando la classe comporta memoria dinamica.
1 Commenta quando chiamare un costruttore di copia. Ci sono tre situazioni: quando si crea un oggetto da un oggetto esistente dello stesso tipo, quando si passa un oggetto per valore a una funzione e quando una funzione restituisce un oggetto.
2 Sapere quando la classe C ++ ha bisogno di un costruttore di copia. Si riduce a questo. Se la classe ha puntatori e svolge allocazione dinamica della memoria, è necessario dare un costruttore di copia esplicita.
3 Guardate un esempio in cui non si dispone di definire un costruttore per una classe C ++. Classe X è impilare solo variabili e puntatori. Una copia superficiale è sufficiente per copiare i valori di un oggetto esistente a un nuovo oggetto. Il compilatore può fare questo automaticamente, quindi non c'è bisogno di definire un costruttore di copia per la classe X:
class X {
int num;
pubblico:
X (): num (0) {}
~ X ();
};
4 Studiare un esempio che richiede una definizione esplicita costruttore di copia. Come si può vedere, la dimensione della stringa, N, non è un valore hard-coded, ma è determinato dall'utente. Per creare B da A come nell'espressione "ZB (A)," bisogna dire al compilatore la quantità di memoria da allocare per B. Il luogo per farlo è nel costruttore di copia, come segue:
Classe Z {
int N;
char * str;
pubblico:
Z (int n): N (n) {
str = new char [N];
}
Z (Z e altro) {
str = new char [other.GetLen ()];
// Copiare i dati dal str di "altro" al str di "questo"
}
~ Z () {
delete [] str;
}
int GetLen () const {
ritornare N;
}
};