Un costruttore di copia è una funzione membro speciale all'interno di una classe. Si accetta un riferimento a un oggetto esistente dello stesso tipo di classe e rende una copia completa dell'oggetto. Una copia completa non solo copia tutti i campi membro ma anche copia qualsiasi memoria allocata in modo dinamico. Compilatori C++ costruzione di copia automaticamente. È necessario definire un costruttore di copia quando coinvolge la classe di memoria dinamica.
Istruzioni
1
Scrivi una recensione su 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 di valore a una funzione e quando una funzione restituisce un oggetto.
2
Sapere quando la classe C++ richiede un costruttore di copia. Si riduce a questo. Se la classe ha puntatori ed esegue allocazione dinamica della memoria, quindi è necessario assegnargli un costruttore di copia esplicita.
3
int num; pubblico: X (): num(0) {} ~X(); };
Guarda un esempio dove non devi definire un costruttore per una classe C++. Classe X ha solo le variabili dello stack e non puntatori. Una copia superficiale è sufficiente copiare i valori di un oggetto esistente in un nuovo oggetto. Il compilatore può farlo automaticamente, così non devi definire un costruttore di copia per classe x:
Class X {
4
int N; char * str; pubblico: Z (int n): N(n) () { Str = new char [N]; } Z (Z & altro) { Str = new char [altro.... GetLen()]; copiare dati da str di "altro" per lo streptococco di "this" } ~Z(){ delete [] str; } int GetLen() () {const N ritorno; } };
Studiare un esempio che richiede una definizione esplicita del costruttore di copia. Come si può vedere, la dimensione della stringa, N, non è un valore hardcoded ma è determinato dall'utente. Per creare B dalla A come nell'espressione "Z b (a)", è necessario indicare al compilatore che la quantità di memoria da allocare per B. Il posto per fare questo è il costruttore di copia, come segue:
Classe Z {
Consigli & Avvertenze
- Immaginare che si omette il costruttore di copia in Z. Quando fate Z b (a), è necessario che il compilatore farà una copia superficiale. Questo significa, lo streptococco b ora avrà il valore di indirizzo di str di A, che punta alla stringa "Hello\0" da qualche parte nell'heap. Se A viene eliminato, lo streptococco b punterà verso il nulla. Se si tenta di stampare la str di B, si ottiene una violazione di accesso. Quindi assicuratevi di che effettuare costruttori di copia esplicito dove è necessario.