![](http://gadget-info.com/img/difference-between/149/difference-between-copy-constructor.jpg)
Cerchiamo di studiare la differenza tra il costruttore di copie e l'operatore di assegnazione.
Grafico comparativo
Base per il confronto | Copia il costruttore | Operatore di assegnazione |
---|---|---|
Di base | Il costruttore di copie è un costruttore sovraccarico. | L'operatore di assegnazione è un operatore bit a bit. |
Senso | Il costruttore di copie inizializza il nuovo oggetto con un oggetto già esistente. | L'operatore di assegnazione assegna il valore di un oggetto a un altro oggetto entrambi già esistenti. |
Sintassi | class_name (cont class_name e object_name) { // corpo del costruttore } | class_name Ob1, Ob2; Ob2 = Ob1; |
Richiama | (1) Il costruttore di copia invoca quando un nuovo oggetto viene inizializzato con uno esistente. (2) L'oggetto passato a una funzione come parametro non di riferimento. (3) L'oggetto viene restituito dalla funzione. | L'operatore di assegnazione viene richiamato solo quando si assegna all'oggetto esistente un nuovo oggetto. |
Allocazione della memoria | Sia l'oggetto di destinazione che l'oggetto di inizializzazione condividono le diverse posizioni di memoria. | Sia l'oggetto di destinazione che l'oggetto di inizializzazione condividono la stessa memoria allocata. |
Predefinito | Se non si definisce alcun costruttore di copia nel programma, il compilatore C ++ ne fornisce implicitamente uno. | Se non sovraccarichi l'operatore "=", verrà eseguita una copia bit a bit. |
Definizione di Copy Constructor
Un "costruttore di copie" è una forma di un costruttore sovraccarico . Un costruttore di copia viene chiamato o invocato solo per scopi di inizializzazione. Un costruttore di copie inizializza l'oggetto appena creato da un altro oggetto esistente. Quando viene utilizzato un costruttore di copie per inizializzare l'oggetto di destinazione appena creato, sia l'oggetto di destinazione che l'oggetto di origine condividono la diversa posizione di memoria. Le modifiche apportate all'oggetto di origine non si riflettono nell'oggetto di destinazione. La forma generale del costruttore di copie è
class_ name (class_name e object_name) {. // body of copy constructor. } // object_name fa riferimento all'oggetto sul lato destro dell'inizializzazione.
Se il programmatore non crea un costruttore di copia in un programma C ++, allora il compilatore fornisce implicitamente un costruttore di copie. Un costruttore di copie implicito fornito dal compilatore esegue la copia membro-saggio dell'oggetto di origine. Ma a volte la copia membro-saggio non è sufficiente, in quanto l'oggetto può contenere una variabile puntatore. Copiare una variabile puntatore significa che copiamo l'indirizzo memorizzato nella variabile puntatore, ma non vogliamo copiare l'indirizzo memorizzato nella variabile puntatore, ma vogliamo copiare il puntatore a cui punta. Quindi, c'è bisogno di un esplicito "costruttore di copie" nel programma per risolvere questo tipo di problemi.
Un costruttore di copia è invocato in tre condizioni come segue:
- Il costruttore di copia invoca quando un nuovo oggetto viene inizializzato con uno esistente.
- L'oggetto è passato a una funzione come parametro non di riferimento.
- L'oggetto viene restituito dalla funzione.
Cerchiamo di capire costruttore di copie con un esempio.
copia di classe {int num; public: copy () {} // copia predefinita del costruttore (int a) {// initializing constructor num = a; } copy (copy & c) {// Copia costruttore num = c.num; } void show () {cout << num; }}; int main () {copia A (200); // Oggetto Una copia creata e inizializzata B (A); // Copia costruttore chiamato copy C = A; // Copia il costruttore chiamato copy D; D = A; // copia il costruttore non chiamato perché l'oggetto D non è un oggetto appena creato. // è un'operazione di assegnazione. ritorno 0; }
Nel codice sopra, avevo esplicitamente dichiarato un costruttore "copy (copy & c)". Questo costruttore di copia viene chiamato quando l'oggetto B viene inizializzato utilizzando l'oggetto A. La seconda volta viene chiamato quando l'oggetto C viene inizializzato utilizzando l'oggetto A. Quando l'oggetto D viene inizializzato utilizzando l'oggetto A il costruttore di copie non viene chiamato perché D viene inizializzato è già nell'esistenza, non in quello appena creato. Quindi, qui viene richiamato l'operatore di assegnazione.
Definizione di operatore di assegnazione
L'operatore di assegnazione è un operatore di assegnazione di C ++. L'operatore "=" viene utilizzato per richiamare l'operatore di assegnazione. Copia i dati in un oggetto in modo identico a un altro oggetto. L'operatore di assegnazione copia un oggetto in un altro membro. Se non sovraccarichi l'operatore di assegnazione, esegue la copia bit a bit. Pertanto, è necessario sovraccaricare l'operatore di assegnazione.
copia di classe {int num; public: copy () {} // copia predefinita del costruttore (int a) {// initializing constructor num = a; } void show () {cout << num; }}; int main () {copia A (200); // Oggetto Una copia creata e inizializzata B (300); // Oggetto B creato e inizializzato B = A; // operatore di assegnazione invocato copia C; C = A; // operatore di assegnazione invocato return 0; }
Nel codice precedente quando objectA è assegnato all'oggetto B, l'operatore di assegnazione viene invocato poiché entrambi gli oggetti sono già esistenti. Allo stesso modo, lo stesso accade quando l'oggetto C viene inizializzato con l'oggetto A.
Quando viene eseguita l'assegnazione bit a bit, l'oggetto condivide la stessa posizione di memoria e le modifiche in un oggetto si riflettono in un altro oggetto.
Differenze chiave tra il costruttore di copia e l'operatore di assegnazione
- Un costruttore di copie è un contructor sovraccarico in cui un operatore di assegnazione è un operatore bit a bit.
- Usando il costruttore di copie è possibile inizializzare un nuovo oggetto con un oggetto già esistente. D'altra parte, un operatore di assegnazione copia un oggetto sull'altro oggetto, entrambi già esistenti.
- Un costruttore di copie viene inizializzato ogni volta che un nuovo oggetto viene inizializzato con un oggetto già esistente, quando un oggetto viene passato a una funzione come parametro non di rifrazione o quando un oggetto viene restituito da una funzione. D'altra parte, un operatore di assegnazione viene invocato solo quando un oggetto viene assegnato a un altro oggetto.
- Quando un oggetto viene inizializzato utilizzando il costruttore di copie, l'oggetto di inizializzazione e l'oggetto inizializzato condividono la diversa posizione di memoria. D'altra parte, quando un oggetto viene inizializzato utilizzando un operatore di assegnazione, gli oggetti inizializzati e inizializzati condividono la stessa posizione di memoria.
- Se non si definisce esplicitamente un costruttore di copie, il compilatore ne fornisce uno. D'altra parte, se non sovraccarichi un operatore di assegment, viene eseguita un'operazione di copia bit a bit.
Conclusione:
Il costruttore di copia è l'ideale per copiare un oggetto su un altro quando l'oggetto contiene puntatori grezzi.