Υπερφόρτωση χειριστή C ++ με παραδείγματα

Πίνακας περιεχομένων:

Anonim

Τι είναι η υπερφόρτωση χειριστή;

Χρησιμοποιώντας υπερφόρτωση χειριστή στο C ++, μπορείτε να καθορίσετε περισσότερες από μία έννοιες για έναν χειριστή σε ένα πεδίο. Ο σκοπός της υπερφόρτωσης του χειριστή είναι να παρέχει μια ειδική έννοια ενός χειριστή για έναν τύπο δεδομένων που καθορίζεται από το χρήστη.

Με τη βοήθεια της υπερφόρτωσης του χειριστή, μπορείτε να επαναπροσδιορίσετε την πλειονότητα των χειριστών C ++. Μπορείτε επίσης να χρησιμοποιήσετε υπερφόρτωση χειριστή για να εκτελέσετε διαφορετικές λειτουργίες χρησιμοποιώντας έναν χειριστή.

Σε αυτό το σεμινάριο C ++, θα μάθετε:

  • Τι είναι η υπερφόρτωση χειριστή;
  • Σύνταξη
  • Διαφορετικές προσεγγίσεις για υπερφόρτωση χειριστή σε C ++
  • Μπορούν όλοι οι χειριστές C ++ να υπερφορτωθούν;
  • Πράγματα που πρέπει να θυμάστε:
  • Κανόνες για υπερφόρτωση χειριστή:
  • Πώς να υπερφορτώσετε τον χειριστή:

Σύνταξη

Για να υπερφορτώσετε έναν χειριστή C ++, πρέπει να ορίσετε μια ειδική λειτουργία εντός της κλάσης ως εξής:

class class_name{… publicreturn_type operator symbol (argument(s)){… }… };

Ακολουθεί μια εξήγηση για την παραπάνω σύνταξη:

  • Ο τύπος return_type είναι ο τύπος επιστροφής για τη συνάρτηση.
  • Στη συνέχεια, αναφέρετε τη λέξη-κλειδί χειριστή.
  • Το σύμβολο δηλώνει το σύμβολο χειριστή που πρέπει να υπερφορτωθεί. Για παράδειγμα, +, -, <, ++.
  • Τα ορίσματα μπορούν να μεταβιβαστούν στη λειτουργία χειριστή με τον ίδιο τρόπο όπως οι συναρτήσεις.

Παράδειγμα 1:

#include using namespace std;class TestClass {private:int count;public:TestClass() : count(5) {}void operator --() {count = count - 3;}void Display() {cout << "Count: " << count; }};int main() {TestClass tc;--tc;tc.Display();return 0;}

Παραγωγή:

Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:

Επεξήγηση κώδικα:

  1. Συμπεριλαμβανομένου του αρχείου κεφαλίδας iostream στον κώδικα μας για χρήση των λειτουργιών του.
  2. Συμπεριλάβετε το std namespace στο πρόγραμμά μας για να χρησιμοποιήσετε τις τάξεις του χωρίς να το καλέσετε.
  3. Δημιουργήστε μια τάξη με το όνομα TestClass.
  4. Χρησιμοποιήστε τον τροποποιητή ιδιωτικής πρόσβασης, ο οποίος επισημαίνει ένα μέλος τάξης ως ιδιωτικά προσβάσιμο.
  5. Δημιουργήστε έναν ακέραιο αριθμό μεταβλητών. Αυτή η μεταβλητή θα είναι ιδιωτική.
  6. Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης, ο οποίος χαρακτηρίζει ένα μέλος της τάξης ως ιδιωτικά προσβάσιμο.
  7. Χρησιμοποιήστε έναν κατασκευαστή κλάσης για να αρχικοποιήσετε τη μεταβλητή μετρητή σε 5.
  8. Υπερφορτώστε την έννοια του - χειριστή.
  9. Ο τελεστής θα μειώσει την τιμή της μεταβλητής x κατά 1.
  10. Τέλος του τμήματος υπερφόρτωσης του χειριστή. Ο χειριστής έχει λάβει ένα νέο όνομα.
  11. Ορισμός μιας συνάρτησης που ονομάζεται συνάρτηση Display ().
  12. Εκτυπώστε την τιμή του αριθμού μεταβλητών μαζί με άλλο κείμενο στην κονσόλα όταν καλείται η λειτουργία Display (). Το} σηματοδοτεί το τέλος του σώματος της λειτουργίας Display ().
  13. Τέλος του σώματος της τάξης.
  14. Καλέστε την κύρια λειτουργία (). Η λογική του προγράμματος πρέπει να προστεθεί σε αυτήν τη συνάρτηση.
  15. Δημιουργήστε μια παρουσία της κλάσης TestClass και δώστε το το όνομα tc.
  16. Αυτό θα καλέσει τη λειτουργία χειριστή - ().
  17. Χρησιμοποιήστε τη στάση του TestClass Class για να καλέσετε τη λειτουργία Display ().
  18. Η συνάρτηση πρέπει να επιστρέψει την τιμή μετά την επιτυχή ολοκλήρωση.
  19. Τέλος του σώματος της κύριας συνάρτησης ().

Διαφορετικές προσεγγίσεις για υπερφόρτωση χειριστή σε C ++

Μπορείτε να εκτελέσετε υπερφόρτωση χειριστή εφαρμόζοντας οποιονδήποτε από τους ακόλουθους τύπους λειτουργιών:

  1. Λειτουργία μέλους
  2. Λειτουργία εκτός μέλους
  3. Λειτουργία φίλου
  • Η λειτουργία υπερφόρτωσης χειριστή μπορεί να είναι συνάρτηση μέλους όταν ένας αριστερός τελεστής είναι αντικείμενο της κλάσης.
  • Όταν ο αριστερός τελεστής είναι διαφορετικός, η λειτουργία υπερφόρτωσης του χειριστή θα πρέπει να είναι μια συνάρτηση χωρίς μέλη.

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

Μπορούν όλοι οι χειριστές C ++ να υπερφορτωθούν;

Όχι. Υπάρχουν χειριστές C ++ που δεν μπορούν να υπερφορτωθούν.

Περιλαμβάνουν:

  • :: -Χειριστής ανάλυσης πεδίου
  • ;: -δενικός χειριστής.
  • . - Επιλογέας μελών
  • Μέγεθος χειριστή
  • * - Επιλογέας δείκτη μέλους

Πράγματα που πρέπει να θυμάστε:

  1. Με την υπερφόρτωση του χειριστή, μπορείτε να επαναπροσδιορίσετε τον τρόπο που λειτουργεί ένας χειριστής μόνο για τους τύπους που καθορίζονται από το χρήστη (αντικείμενα, δομές). Δεν μπορείτε να το χρησιμοποιήσετε για ενσωματωμένους τύπους (float, char, int κ.λπ.).
  2. Οι τελεστές = και & C ++ είναι υπερφορτωμένοι από προεπιλογή. Για παράδειγμα, μπορείτε να αντιγράψετε τα αντικείμενα της ίδιας κλάσης απευθείας χρησιμοποιώντας τον τελεστή =.
  3. Η προτεραιότητα του χειριστή δεν αλλάζει τη συσχέτιση και την προτεραιότητα των χειριστών Ωστόσο, μπορείτε να αλλάξετε τη σειρά αξιολόγησης χρησιμοποιώντας παρένθεση.
  4. Υπάρχουν τέσσερις τελεστές που δεν μπορείτε να υπερφορτώσετε στο C ++. Περιλαμβάνουν τον τελεστή ανάλυσης πεδίου (: :), τον τελεστή επιλογής μέλους (.), Την επιλογή μέλους μέσω ενός τελεστή δείκτη προς λειτουργία (. *) Και τον τρισδιάστατο τελεστή (? :).

Κανόνες για υπερφόρτωση χειριστή:

Ακολουθούν κανόνες για υπερφόρτωση χειριστή:

  • Για να λειτουργήσει, τουλάχιστον ένας τελεστής πρέπει να είναι ένα αντικείμενο κλάσης που ορίζεται από το χρήστη.
  • Μπορείτε να υπερφορτώσετε μόνο υπάρχοντες χειριστές. Δεν μπορείτε να υπερφορτώσετε νέους χειριστές.
  • Ορισμένοι χειριστές δεν μπορούν να υπερφορτωθούν χρησιμοποιώντας μια λειτουργία φίλου. Ωστόσο, τέτοιοι χειριστές μπορούν να υπερφορτωθούν χρησιμοποιώντας τη λειτουργία μέλους.

Πώς να υπερφορτώσετε τον χειριστή:

Παράδειγμα 1:

#include using namespace std;class OperatorOverload {private:int x;public:OperatorOverload() : x(10) {}void operator ++() {x = x + 2;}void Print() {cout << "The Count is: " << x;}};int main() {OperatorOverload ov;++ov;ov.Print();return 0;}

Παραγωγή:

Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:

Επεξήγηση κώδικα:

  1. Συμπεριλαμβανομένου του αρχείου κεφαλίδας iostream στον κώδικα μας για χρήση των λειτουργιών του.
  2. Συμπεριλάβετε το std namespace στο πρόγραμμά μας για να χρησιμοποιήσετε τις τάξεις του χωρίς να το καλέσετε.
  3. Δημιουργήστε μια τάξη με το όνομα OperatorOverload.
  4. Χρησιμοποιήστε τον τροποποιητή ιδιωτικής πρόσβασης, ο οποίος επισημαίνει ένα μέλος τάξης ως ιδιωτικά προσβάσιμο.
  5. Δημιουργήστε μια ακέραια μεταβλητή x. Αυτή η μεταβλητή θα είναι ιδιωτική.
  6. Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης, ο οποίος χαρακτηρίζει ένα μέλος της τάξης ως ιδιωτικά προσβάσιμο.
  7. Χρησιμοποιήστε έναν κατασκευαστή κλάσης για να αρχικοποιήσετε τη μεταβλητή x έως 10.
  8. Υπερφορτώστε την έννοια του χειριστή ++.
  9. Ο τελεστής θα αυξήσει την τιμή της μεταβλητής x με 2.
  10. Τέλος του τμήματος υπερφόρτωσης του χειριστή. Ο χειριστής έχει λάβει ένα νέο όνομα.
  11. Κλήση της λειτουργίας Εκτύπωσης ().
  12. Εκτυπώστε την τιμή της μεταβλητής x μαζί με άλλο κείμενο στην κονσόλα όταν καλείται η συνάρτηση Print ().
  13. Τέλος του κυρίως σώματος της λειτουργίας Print ().
  14. Τέλος του σώματος της τάξης.
  15. Καλέστε την κύρια λειτουργία (). Η λογική του προγράμματος πρέπει να προστεθεί σε αυτήν τη συνάρτηση.
  16. Δημιουργήστε μια παρουσία της κλάσης OperatorOverload που ονομάζεται ov.
  17. Αυτό θα καλέσει τη λειτουργία χειριστή κενού ++ ().
  18. Χρησιμοποιήστε τη θέση της κλάσης OperatorOverload για να καλέσετε τη λειτουργία Print ().
  19. Η συνάρτηση πρέπει να επιστρέψει την τιμή μετά την επιτυχή ολοκλήρωση.
  20. Τέλος του σώματος της κύριας συνάρτησης ().

Παράδειγμα 2:

#includeusing namespace std;class TestClass {private:int real, over;public:TestClass(int rl = 0, int ov = 0) {real = rl;over = ov;}TestClass operator + (TestClass const &obj) {TestClass result;result.real = real + obj.real;result.over = over + obj.over;return result;}void print() {cout << real << " + i" << over << endl;}};int main(){TestClass c1(9, 5), c2(4, 3);TestClass c3 = c1 + c2;c3.print();}

Παραγωγή:

Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:

Επεξήγηση κώδικα:

  1. Συμπερίληψη του αρχείου κεφαλίδας iostream στο πρόγραμμά μας για τη χρήση των λειτουργιών του.
  2. Συμπεριλάβετε το std namespace στο πρόγραμμά μας για να χρησιμοποιήσετε τις τάξεις του χωρίς να το καλέσετε.
  3. Δημιουργήστε μια τάξη με το όνομα TestClass. Το {σηματοδοτεί την αρχή του σώματος της τάξης.
  4. Χρησιμοποιήστε τον τροποποιητή ιδιωτικής πρόσβασης για να επισημάνετε τις μεταβλητές ως ιδιωτικές, που σημαίνει ότι είναι προσβάσιμες μόνο από την Κλάση
  5. Ορίστε δύο ακέραιες μεταβλητές, πραγματικές και πάνω.
  6. Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης για να επισημάνετε τον κατασκευαστή ως δημόσιο, πράγμα που σημαίνει ότι θα είναι προσβάσιμος ακόμη και εκτός της κλάσης.
  7. Δημιουργία του κατασκευαστή τάξης και αρχικοποίηση των μεταβλητών.
  8. Αρχικοποιήστε την τιμή της πραγματικής μεταβλητής.
  9. Αρχικοποιήστε την τιμή της μεταβλητής over.
  10. Άκρο του κατασκευαστή.
  11. Παράκαμψη της έννοιας του τελεστή +.
  12. Δημιουργήστε το αποτέλεσμα τύπου δεδομένων του τύπου TestClass.
  13. Χρησιμοποιήστε τον τελεστή + με σύνθετους αριθμούς. Αυτή η γραμμή θα προσθέσει το πραγματικό μέρος ενός αριθμού στο πραγματικό μέρος ενός άλλου αριθμού.
  14. Χρησιμοποιήστε τον τελεστή + με σύνθετους αριθμούς. Αυτή η γραμμή θα προσθέσει το φανταστικό μέρος ενός αριθμού στο φανταστικό μέρος ενός άλλου αριθμού.
  15. Το πρόγραμμα θα επιστρέψει την τιμή του μεταβλητού αποτελέσματος κατά την επιτυχή εκτέλεση.
  16. Τέλος του ορισμού της νέας έννοιας του + χειριστή, δηλαδή υπερφόρτωση.
  17. Καλέστε τη μέθοδο εκτύπωσης ().
  18. Εκτυπώστε το νέο σύνθετο αριθμό μετά την προσθήκη στην κονσόλα.
  19. Λειτουργία στο τέλος του σώματος εκτύπωσης ().
  20. Τέλος του σώματος της κλάσης TestClass.
  21. Κλήση της κύριας λειτουργίας ().
  22. Περνώντας τις τιμές τόσο των πραγματικών όσο και των σύνθετων μερών που πρέπει να προστεθούν. Το πρώτο μέρος του c1 θα προστεθεί στο πρώτο μέρος του c2, δηλαδή 9 + 4. Το δεύτερο μέρος του c1 θα προστεθεί στο δεύτερο μέρος του c, δηλαδή 5 + 3.
  23. Εκτέλεση λειτουργίας χρησιμοποιώντας τον υπερφορτωμένο χειριστή + και αποθήκευση του αποτελέσματος στη μεταβλητή c3.
  24. Εκτύπωση της τιμής της μεταβλητής c3 στην κονσόλα.
  25. Τέλος του σώματος της κύριας () λειτουργίας.

Περίληψη:

  • Μπορείτε να καθορίσετε περισσότερες από μία έννοιες για έναν χειριστή C ++ σε ένα πεδίο.
  • Αυτό ονομάζεται υπερφόρτωση χειριστή.
  • Η υπερφόρτωση χειριστή παρέχει μια ειδική έννοια ενός χειριστή για έναν τύπο δεδομένων που καθορίζεται από το χρήστη.
  • Μπορείτε να επαναπροσδιορίσετε την πλειονότητα των χειριστών C ++ μέσω υπερφόρτωσης χειριστή.
  • Δεν μπορούν να φορτωθούν όλοι οι χειριστές C ++.
  • Για να υπερφορτωθεί ένας χειριστής, τουλάχιστον ένας από τους τελεστές πρέπει να είναι ένα αντικείμενο που ορίζεται από το χρήστη.
  • Μόνο οι υπάρχοντες χειριστές μπορούν να υπερφορτωθούν. Δεν μπορείτε να υπερφορτώσετε νέους χειριστές.