Copia superficiale vs. Copia profonda
Prima di guardare l'esempio della copia profonda, è necessario comprendere anche la copia superficiale. Quindi, la copia superficiale è stata creata quando si desidera copiare tutte le variabili di un oggetto a un altro oggetto. Puoi chiamarla un'immagine speculare, ma non è quella originale. Sia gli oggetti originali che nuovi, io.e., replica, faranno riferimento allo stesso indirizzo di memoria all'interno della copia superficiale. Ciò significa che gli oggetti originali e replica saranno riconosciuti e recuperati con lo stesso indirizzo di memoria. Quando un utente cerca di apportare modifiche in un oggetto, rifletterà automaticamente anche le modifiche in un altro oggetto a causa dello stesso indirizzo di memoria. Ciò può causare molti errori durante l'esecuzione e l'oggetto reale e replica verrà distrutto. Pertanto, si dice che eviti di usare una copia superficiale quando si lavora con variabili allocate dinamicamente di un determinato oggetto.
Si consiglia di utilizzare la copia profonda anziché la copia superficiale durante l'utilizzo delle variabili allocate dinamicamente. La copia profonda può essere ottenuta copiando tutti i dati di un oggetto, i.e., Valori variabili, allocazione della memoria e risorse, a quello nuovo mentre sia l'oggetto reale che replica ha un indirizzo di memoria completamente diverso. Può essere usato per un oggetto con variabili che vengono allocate dinamicamente. Quindi, iniziamolo.
Esempio: copia profonda
Abbiamo iniziato il nostro esempio per dimostrare il concetto di copia profonda all'interno della programmazione C ++ aprendo la console Shell di Ubuntu 20.04 Sistema. La prima cosa da fare è produrre un nuovo file C ++ per il codice. Il comando eterno, vecchio e più semplice fornito dalla distribuzione Linux per creare un documento nel suo terminale di shell è l'istruzione "Touch". La parola semplice "touch" verrà utilizzata con il titolo di un documento da generare. Assicurati di aggiungere l'estensione C ++ alla fine del nome del documento; Altrimenti, il codice non funzionerà sulla shell sull'esecuzione del file. Dopo questa creazione di file, arriva il passo per aprirlo.
La cosa migliore di Ubuntu 20.04 è, viene fornito con alcuni editor integrati per aprire e modificare i file. Contiene l'editor "VIM" per modificare in un ambiente molto colorato, l'editor di testo per aggiornare e modificare il codice nell'ambiente più semplice e l'editor GNU Nano per creare e modificare il codice all'interno della shell. Quindi, abbiamo eliminato l'editor di codice, io.e., GNU Nano Editor nel nostro caso e la Nano Word viene utilizzata per aprire il documento “Deep.CC ". Le istruzioni per generare e lanciare il documento "Deep.CC ”sono indicati nello screenshot qui sotto.
Dopo che l'editor GNU Nano per il codice ha lanciato il documento di testo "Deep.cc "in esso, dobbiamo aggiungere prima alcune biblioteche. Queste librerie sono necessarie per l'esecuzione del codice in un certo modo. Il flusso di input-output "io" è incluso usando la parola "include" con un carattere hash, i.e., "#". L'uso di uno spazio dei nomi standard è necessario per il codice C ++ per utilizzare le istruzioni CIN e COUT. Il codice è stato avviato con la dichiarazione di una nuova classe denominata "test". Questa classe è stata inizializzata con tre membri di dati interi di tipo privato. Le variabili "len" e "wid" sono le normali variabili di intero, mentre "età" è una variabile puntatore. Il costruttore test () è stato inizializzato e viene utilizzato per inizializzare direttamente il puntatore "età" con un valore di tipo intero dinamicamente.
È stata avviata una funzione definita dall'utente denominata "set" senza tipo di ritorno. Ci vogliono tre argomenti di tipo intero nei suoi parametri, i.e., "L", "W" e "A". Questa funzione viene utilizzata qui per ottenere i valori dalla funzione principale () e archiviarli all'interno delle variabili, o i membri dei dati dichiarati prima all'inizio di una classe "test" i.e., "Len", "wid" e tipo puntatore variabile "età". Un'altra funzione definita dall'utente denominata "display ()" è stata utilizzata senza valori parametrici. Questa funzione utilizza un'unica istruzione Cout standard al suo interno. L'istruzione Cout utilizza le variabili "len", "wid" e "*età" per visualizzare i valori già impostati mediante la funzione set ().
Ora, abbiamo utilizzato il test di funzione del costruttore parametrizzato (Test "di classe per implementare il concetto di copia profonda nel nostro programma. Questo costruttore parametrizzato verrà chiamato quando viene creato un nuovo oggetto. Sta ottenendo il puntatore di tipo "test" di classe nel suo parametro, i.e., Oggetto originale. Questo primo oggetto passato all'interno dei parametri verrà utilizzato per copiare tutti i dati dell'oggetto originale all'interno del nuovo oggetto come è dimostrato nell'immagine. Il Destructor Test di classe è stato utilizzato per distruggere l'oggetto del test di classe mentre elimina la variabile di memoria allocata in modo dinamico dopo che l'esecuzione del programma sta per completare. La classe di test è stata chiusa qui e l'esecuzione verrà iniziata con la funzione principale.
Ora, arriva la funzione principale. L'esecuzione inizia da qui quando viene creato il primo oggetto, "T1" del test della classe. Il costruttore "test ()" verrà eseguito automaticamente con la creazione di oggetto "T1" e assegnando la memoria dinamica a cupola alla variabile dinamica "età". La funzione set () è stata chiamata usando l'oggetto T1 e per impostare i valori sulle variabili, la funzione display () verrà chiamata per mostrare i valori sulla shell. Il secondo oggetto, T2, è stato creato un file in profondità di tutti i dati dell'oggetto T1 per assegnazione. Il costruttore parametrizzato verrà chiamato qui. Quando chiamiamo il metodo Display () con l'oggetto T2, mostrerà lo stesso risultato per l'oggetto 1. Il Destructor verrà eseguito automaticamente poiché l'oggetto ha finito di funzionare.
Dopo la compilazione con G ++ ed esecuzione con "./UN.fuori ", abbiamo ottenuto gli stessi risultati del metodo Display () per gli oggetti T1 e T2.
Conclusione
All'interno di questa guida agli articoli, scoprirai la spiegazione di una copia profonda insieme a una dimostrazione di esempio. Abbiamo avviato questa guida definendo i termini di copia, copia profonda e copia superficiale. Quindi, abbiamo trattato la differenza tra l'utilizzo di copia profonda e copia superficiale all'interno del codice C ++ per copiare gli oggetti. Abbiamo aggiunto un breve e semplice esempio del programma di copia profonda per dimostrarlo di più. Pertanto, riteniamo che questo articolo sarebbe molto utile per tutti gli utenti ingenui di C ++ e per coloro che sono già esperti nel loro dominio.