Nwlapcug.com


Come utilizzare i costruttori di copia in C++

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

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 {

int num;

pubblico:

X (): num(0) {}

~X();

};

4

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 {

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;

}

};

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.