Come utilizzare il copia Costruttori in C ++

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.

istruzione

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;

}

};

Consigli e avvertenze

  • Immaginate si omette il costruttore di copia in Z. Quando si esegue ZB (A), il compilatore farà una copia. Questo significa che, la str di B avrà ora il valore indirizzo della str di A, che punta a stringa "Ciao \ 0" da qualche parte nel mucchio. Se A viene eliminato, la str di B punterà verso il nulla. Se si tenta di stampare la str di B, si ottiene una violazione di accesso. Quindi assicuratevi di fare costruttori di copia esplicite in cui devi.