Συνιστάται, 2024

Επιλογή Συντάκτη

Διαφορά μεταξύ κατασκευαστή αντιγράφων και χειριστή εκχώρησης σε C ++

Ο κατασκευαστής αντιγράφων και ο χειριστής εκχώρησης είναι οι δύο τρόποι για την προετοιμασία ενός αντικειμένου χρησιμοποιώντας άλλο αντικείμενο. Η θεμελιώδης διαφορά μεταξύ του κατασκευαστή αντιγράφων και του χειριστή εκχώρησης είναι ότι ο κατασκευαστής αντιγράφων διαθέτει χωριστή μνήμη τόσο στα αντικείμενα, δηλαδή στο νεοδημιουργημένο αντικείμενο στόχου και στο αντικείμενο προέλευσης. Ο χειριστής εκχώρησης διαθέτει την ίδια θέση μνήμης στο νεοδημιουργημένο αντικείμενο στόχο καθώς και πηγαίου αντικειμένου.

Ας μελετήσουμε τη διαφορά μεταξύ του κατασκευαστή αντιγράφων και του χειριστή εκχώρησης.

Συγκριτικό διάγραμμα

Βάση σύγκρισηςΑντιγραφή κατασκευαστήΔιαχειριστής εκχώρησης
ΒασικόςΟ κατασκευαστής αντιγράφων είναι ένας υπερφορτωμένος κατασκευαστής.Ο τελεστής εκχώρησης είναι ένας δυαδικός χειριστής.
ΕννοιαΟ κατασκευαστής αντιγράφων αρχικοποιεί το νέο αντικείμενο με ένα ήδη υπάρχον αντικείμενο.Ο χειριστής εκχώρησης εκχωρεί την τιμή ενός αντικειμένου σε ένα άλλο αντικείμενο που ήδη υπάρχουν.
Σύνταξηclass_name (cont name_name_name_name_name_name) {
// σώμα του κατασκευαστή
}}
class_name Ob1, Ob2;
Ob2 = Ob1;
Επικαλείται(1) Ο κατασκευαστής αντιγράφων καλείται όταν αρχικοποιείται ένα νέο αντικείμενο με το υπάρχον.
(2) Το αντικείμενο μεταβιβάστηκε σε μια συνάρτηση ως παράμετρος μη αναφοράς.
(3) Το αντικείμενο επιστρέφεται από τη λειτουργία.
Ο χειριστής εκχώρησης ενεργοποιείται μόνο κατά την εκχώρηση του υπάρχοντος αντικειμένου σε νέο αντικείμενο.
Κατανομή μνήμηςΤόσο το αντικείμενο προορισμού όσο και το αρχικό αντικείμενο μοιράζονται τις διαφορετικές θέσεις μνήμης.Τόσο το αντικείμενο στόχου όσο και το αρχικό αντικείμενο μοιράζονται την ίδια μνήμη που έχει κατανεμηθεί.
ΠροκαθορισμένοΑν δεν ορίσετε κανένα κατασκευαστή αντιγράφων στο πρόγραμμα, ο συντάκτης C ++ παρέχει σιωπηρά ένα.Εάν δεν υπερφορτώσετε τον χειριστή "=", τότε θα γίνει ένα bitwise αντίγραφο.

Ορισμός του κατασκευαστή αντιγράφων

Ένας "κατασκευαστής αντιγράφων" είναι μια μορφή υπερφορτωμένου κατασκευαστή . Ένας κατασκευαστής αντιγράφων καλείται ή καλείται μόνο για σκοπούς αρχικοποίησης. Ένας κατασκευαστής αντιγράφων αρχικοποιεί το νεοδημιουργημένο αντικείμενο από ένα άλλο υπάρχον αντικείμενο. Όταν ένας κατασκευαστής αντιγράφων χρησιμοποιείται για την προετοιμασία του νεοδημιουργημένου αντικειμένου στόχου, τότε τόσο το αντικείμενο προορισμού όσο και το αντικείμενο προέλευσης μοιράζονται διαφορετική θέση μνήμης. Οι αλλαγές που έγιναν στο αντικείμενο προέλευσης δεν αντικατοπτρίζονται στο αντικείμενο προορισμού. Η γενική μορφή του κατασκευαστή αντιγράφων είναι

 class_name (class_name & object_name) {. // σώμα κατασκευαστή αντιγράφων. } // όνομα_αντικειμένου αναφέρεται στο αντικείμενο στη δεξιά πλευρά της αρχικοποίησης. 

Εάν ο προγραμματιστής δεν δημιουργήσει έναν κατασκευαστή αντιγράφων σε ένα πρόγραμμα C ++, τότε ο μεταγλωττιστής παρέχει σιωπηρά έναν κατασκευαστή αντιγράφων. Ένας έμμεσος κατασκευαστής αντιγράφων που παρέχεται από τον μεταγλωττιστή κάνει το μέλος-αντίγραφο του αντικειμένου προέλευσης. Όμως, μερικές φορές το αντίγραφο του μέλους δεν είναι αρκετό, καθώς το αντικείμενο μπορεί να περιέχει μια μεταβλητή δείκτη. Αντιγραφή μιας μεταβλητής δείκτη σημαίνει ότι αντιγράψουμε τη διεύθυνση που είναι αποθηκευμένη στη μεταβλητή δείκτη, αλλά δεν θέλουμε να αντιγράψουμε τη διεύθυνση που είναι αποθηκευμένη στη μεταβλητή δείκτη, αντί να θέλουμε να αντιγράψουμε ποιος δείκτης δείχνει. Ως εκ τούτου, υπάρχει ανάγκη σαφούς «κατασκευαστή αντιγράφων» στο πρόγραμμα για την επίλυση τέτοιων προβλημάτων.

Ένας κατασκευαστής αντιγράφων επικαλείται σε τρεις συνθήκες ως εξής:

  • Ο κατασκευαστής αντιγράφων επικαλείται όταν αρχικοποιείται ένα νέο αντικείμενο με το υπάρχον.
  • Το αντικείμενο μεταβιβάστηκε σε μια συνάρτηση ως παράμετρος μη αναφοράς.
  • Το αντικείμενο επιστρέφεται από τη λειτουργία.

Ας καταλάβουμε τον κατασκευαστή αντιγράφων με ένα παράδειγμα.

 class copy {int num; δημόσια: αντίγραφο () {} // αντίγραφο του αρχικού κατασκευαστή (int a) {// αρχικοποίηση του κατασκευαστή num = a; } αντιγράψτε (αντιγράψτε & c) {// Αντιγραφή κατασκευαστή num = c.num; } άκυρη εμφάνιση () {cout << num; }}. int main () {αντίγραφο Α (200); // Αντικείμενο Ένα δημιουργημένο και αρχικοποιημένο αντίγραφο B (A). // Κατασκευαστής αντιγραφής που ονομάζεται αντίγραφο C = A. // Κατασκευαστής αντιγραφής που ονομάζεται αντίγραφο D. D = Α. // constructor αντιγραφής δεν ονομάζεται επειδή αντικείμενο D δεν έχει δημιουργηθεί πρόσφατα αντικείμενο. // πρόκειται για εργασία εκχώρησης. επιστροφή 0? }} 

Στον παραπάνω κώδικα είχα δηλώσει ρητά έναν κατασκευαστή "αντίγραφο (copy & c)". Αυτός ο κατασκευαστής αντιγράφων καλείται όταν το αντικείμενο Β αρχικοποιείται χρησιμοποιώντας το αντικείμενο Α. Δεύτερη φορά ονομάζεται όταν το αντικείμενο C αρχικοποιείται χρησιμοποιώντας το αντικείμενο Α. Όταν το αντικείμενο D αρχικοποιείται χρησιμοποιώντας το αντικείμενο Α, ο κατασκευαστής αντιγράφων δεν καλείται επειδή όταν αρχικοποιείται το D είναι ήδη στην ύπαρξη, όχι το νεοδημιουργημένο. Ως εκ τούτου, εδώ καλείται ο χειριστής εκχώρησης.

Ορισμός του χειριστή εκχώρησης

Ο διαχειριστής εκχώρησης είναι ένας εκχωρητής του C ++. Ο χειριστής "=" χρησιμοποιείται για να καλέσει τον τελεστή εκχώρησης. Αντιγράφει τα δεδομένα σε ένα αντικείμενο με τον ίδιο τρόπο σε άλλο αντικείμενο. Ο διαχειριστής εκχώρησης αντιγράφει ένα αντικείμενο σε άλλο μέλος. Αν δεν υπερφορτώσετε τον τελεστή εκχώρησης, εκτελεί το bitwise αντίγραφο. Επομένως, πρέπει να υπερφορτώσετε τον τελεστή εκχώρησης.

 class copy {int num; δημόσια: αντίγραφο () {} // αντίγραφο του αρχικού κατασκευαστή (int a) {// αρχικοποίηση του κατασκευαστή num = a; } άκυρη εμφάνιση () {cout << num; }}. int main () {αντίγραφο Α (200); // Αντικείμενο Ένα δημιουργημένο και αρχικοποιημένο αντίγραφο B (300). // Αντικείμενο B δημιουργήθηκε και αρχικοποιηθεί B = A; // ο διαχειριστής εκχώρησης επικαλέστηκε αντίγραφο C, C = Α. // τελεστής εκχώρησης που επικαλείται επιστροφή 0? }} 

Στον παραπάνω κώδικα, όταν το objectA εκχωρείται στο αντικείμενο B, ο χειριστής εκχώρησης καλείται καθώς και τα δύο αντικείμενα υπάρχουν ήδη. Ομοίως, το ίδιο ισχύει και όταν το αντικείμενο C αρχικοποιείται με το αντικείμενο Α.

Όταν εκτελείται η αντιστοίχιση δυαδικών ψηφίων, τόσο το αντικείμενο μοιράζεται την ίδια θέση μνήμης, όσο και οι αλλαγές σε ένα αντικείμενο αντικατοπτρίζουν ένα άλλο αντικείμενο.

Διαφορές κλειδιών μεταξύ κατασκευαστή αντιγράφων και χειριστή εκχώρησης

  1. Ένας κατασκευαστής αντιγράφων είναι ένας υπερφορτωμένος κατασκευαστής όπου ένας χειριστής εκχώρησης είναι ένας δυαδικός χειριστής.
  2. Χρησιμοποιώντας τον κατασκευαστή αντιγράφων μπορείτε να αρχικοποιήσετε ένα νέο αντικείμενο με ένα ήδη υπάρχον αντικείμενο. Από την άλλη πλευρά, ένας χειριστής εκχώρησης αντιγράφει ένα αντικείμενο στο άλλο αντικείμενο, και τα δύο ήδη υπάρχουν.
  3. Ένας κατασκευαστής αντιγράφων αρχικοποιείται κάθε φορά που αρχικοποιείται ένα νέο αντικείμενο με ένα ήδη υπάρχον αντικείμενο, όταν ένα αντικείμενο μεταβιβάζεται σε μια συνάρτηση ως παράμετρος non refrence ή όταν ένα αντικείμενο επιστρέφεται από μια συνάρτηση. Από την άλλη πλευρά, ένας χειριστής εκχώρησης χρησιμοποιείται μόνο όταν ένα αντικείμενο έχει εκχωρηθεί σε άλλο αντικείμενο.
  4. Όταν ένα αντικείμενο αρχικοποιείται χρησιμοποιώντας κατασκευαστή αντιγράφων, το αρχικό αντικείμενο και το αρχικοποιημένο αντικείμενο μοιράζονται τη διαφορετική θέση μνήμης. Από την άλλη πλευρά, όταν ένα αντικείμενο αρχικοποιείται χρησιμοποιώντας έναν χειριστή εκχώρησης, τότε τα αρχικά και τα αρχικά αντικείμενα μοιράζονται την ίδια θέση μνήμης.
  5. Αν δεν ορίσετε ρητά έναν κατασκευαστή αντιγράφων, τότε ο μεταγλωττιστής παρέχει ένα. Από την άλλη πλευρά, εάν δεν υπερφορτώσετε έναν χειριστή τροφοδοσίας, τότε εκτελείται μια λειτουργία bitwise copy.

Συμπέρασμα:

Ο κατασκευαστής αντιγράφων είναι καλύτερο για την αντιγραφή ενός αντικειμένου σε άλλο όταν το αντικείμενο περιέχει ακατέργαστους δείκτες.

Top