C++ Operator Υπερφόρτωση με Παραδείγματα
Τι είναι Operator Υπερφόρτωση;
Χρησιμοποιώντας υπερφόρτωση χειριστή in C++, μπορείτε να καθορίσετε περισσότερες από μία σημασίες για έναν τελεστή σε ένα πεδίο. Ο σκοπός της υπερφόρτωσης του χειριστή είναι να παρέχει μια ειδική έννοια του τελεστή για έναν τύπο δεδομένων που ορίζεται από το χρήστη.
Με τη βοήθεια της υπερφόρτωσης του χειριστή, μπορείτε να επαναπροσδιορίσετε την πλειοψηφία των C++ χειριστές. Μπορείτε επίσης να χρησιμοποιήσετε την υπερφόρτωση χειριστή για να εκτελέσετε διαφορετικές λειτουργίες χρησιμοποιώντας έναν τελεστή.
Σύνταξη
Για υπερφόρτωση α C++ τελεστή, θα πρέπει να ορίσετε μια ειδική συνάρτηση εντός της Τάξης ως εξής:
class class_name { ... .. ... public return_type operator symbol (argument(s)) { ... .. ... } ... .. ... };
Ακολουθεί μια εξήγηση για την παραπάνω σύνταξη:
- Το return_type είναι ο τύπος επιστροφής για τη συνάρτηση.
- Στη συνέχεια, αναφέρετε τη λέξη-κλειδί τελεστή.
- Το σύμβολο υποδηλώνει το σύμβολο χειριστή που πρόκειται να υπερφορτωθεί. Για παράδειγμα, +, -, <, ++.
- Τα ορίσματα μπορούν να περάσουν στη συνάρτηση τελεστή με τον ίδιο τρόπο όπως οι συναρτήσεις.
Παράδειγμα 1
#include <iostream> 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; }
Παραγωγή:
Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:
Επεξήγηση κώδικα:
- Συμπερίληψη του αρχείου κεφαλίδας iostream στον κώδικά μας για να χρησιμοποιήσουμε τις λειτουργίες του.
- Συμπεριλάβετε τον χώρο ονομάτων std στο πρόγραμμά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
- Δημιουργήστε μια τάξη με το όνομα TestClass.
- Χρησιμοποιήστε τον τροποποιητή ιδιωτικής πρόσβασης, ο οποίος επισημαίνει ένα μέλος κλάσης ως ιδιωτικά προσβάσιμο.
- Δημιουργήστε έναν ακέραιο αριθμό μεταβλητών. Αυτή η μεταβλητή θα είναι ιδιωτικά προσβάσιμη.
- Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης, ο οποίος επισημαίνει ένα μέλος της τάξης ως ιδιωτικά προσβάσιμο.
- Χρησιμοποιήστε έναν κατασκευαστή κλάσης για να αρχικοποιήσετε τον μετρητή μεταβλητής σε 5.
- Υπερφόρτωση της έννοιας του τελεστή —.
- Ο τελεστής θα μειώσει την τιμή της μεταβλητής x κατά 1.
- Τέλος του τμήματος υπερφόρτωσης χειριστή. Ο χειριστής έλαβε νέο όνομα.
- Καθορισμός μιας συνάρτησης με το όνομα συνάρτηση Display().
- Εκτυπώστε την τιμή του πλήθους μεταβλητών μαζί με άλλο κείμενο στην κονσόλα όταν καλείται η συνάρτηση Display(). Το } σηματοδοτεί το τέλος του σώματος της συνάρτησης Display().
- Τέλος του σώματος της τάξης.
- Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί σε αυτήν τη συνάρτηση.
- Δημιουργήστε μια παρουσία της κλάσης TestClass και δώστε της το όνομα tc.
- Αυτό θα καλέσει τη συνάρτηση void operator –().
- Χρησιμοποιήστε τη στάση της Τάξης TestClass για να καλέσετε τη συνάρτηση Display().
- Η συνάρτηση πρέπει να επιστρέψει τιμή μετά την επιτυχή ολοκλήρωση.
- Τέλος του σώματος της συνάρτησης main().
Διαφορετικές προσεγγίσεις για Operator Υπερφόρτωση μέσα C++
Μπορείτε να εκτελέσετε υπερφόρτωση χειριστή εφαρμόζοντας οποιονδήποτε από τους παρακάτω τύπους λειτουργιών:
- Λειτουργία μέλους
- Λειτουργία μη μέλους
- Λειτουργία φίλου
- Η συνάρτηση υπερφόρτωσης τελεστή μπορεί να είναι συνάρτηση μέλους όταν ένας αριστερός τελεστής είναι αντικείμενο της κλάσης.
- Όταν ο αριστερός τελεστής είναι διαφορετικός, το OperaΗ λειτουργία υπερφόρτωσης tor θα πρέπει να είναι συνάρτηση που δεν είναι μέλος.
Μπορείτε να κάνετε τη λειτουργία υπερφόρτωσης χειριστή ως λειτουργία φίλου, εάν χρειάζεται πρόσβαση στα ιδιωτικά και προστατευμένα μέλη της κλάσης.
Μπορεί όλα C++ Operaτα tors είναι υπερφορτωμένα;
Όχι. Υπάρχουν C++ χειριστές που δεν μπορούν να υπερφορτωθούν.
Αυτά περιλαμβάνουν:
- :: -Χειριστής ανάλυσης πεδίου
- ?: -τριαδικός τελεστής.
- . -επιλογέας μέλους
- Χειριστής Sizeof
- * -επιλογέας δείκτη μέλους
Πράγματα που πρέπει να θυμάστε
- Με την υπερφόρτωση τελεστή, μπορείτε να επαναπροσδιορίσετε τον τρόπο λειτουργίας ενός τελεστή μόνο για τους τύπους που ορίζονται από το χρήστη (αντικείμενα, δομές). Δεν μπορείτε να το χρησιμοποιήσετε για ενσωματωμένους τύπους (float, char, int, κ.λπ.).
- Το = και & C++ οι χειριστές είναι υπερφορτωμένοι από προεπιλογή. Για παράδειγμα, μπορείτε να αντιγράψετε τα αντικείμενα της ίδιας κλάσης απευθείας χρησιμοποιώντας τον τελεστή =.
- OperaΗ προτεραιότητα tor δεν αλλάζει τη συσχέτιση και την προτεραιότητα των τελεστών. Ωστόσο, μπορείτε να αλλάξετε τη σειρά αξιολόγησης χρησιμοποιώντας παρενθέσεις.
- Υπάρχουν τέσσερις τελεστές στους οποίους δεν μπορείτε να υπερφορτώσετε C++. Περιλαμβάνουν τον τελεστή ανάλυσης πεδίου (::), τον τελεστή επιλογής μέλους (.), την επιλογή μέλους μέσω ενός τελεστή δείκτη σε λειτουργία (.*) και τον τριαδικό τελεστή (?:).
Κανόνες για Operator Υπερφόρτωση
Εδώ είναι κανόνες για Operator Υπερφόρτωση:
- Για να λειτουργήσει, τουλάχιστον ένας τελεστής πρέπει να είναι ένα αντικείμενο κλάσης που ορίζεται από το χρήστη.
- Μπορείτε να υπερφορτώσετε μόνο υπάρχοντες χειριστές. Δεν μπορείτε να υπερφορτώνετε νέους χειριστές.
- Δεν είναι δυνατή η υπερφόρτωση ορισμένων χειριστών χρησιμοποιώντας τη λειτουργία φίλου. Ωστόσο, τέτοιοι τελεστές μπορούν να υπερφορτωθούν χρησιμοποιώντας τη λειτουργία μέλους.
Τρόπος υπερφόρτωσης OperaTor
Παράδειγμα 1
#include <iostream> 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; }
Παραγωγή:
Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:
Επεξήγηση κώδικα:
- Συμπερίληψη του αρχείου κεφαλίδας iostream στον κώδικά μας για να χρησιμοποιήσουμε τις λειτουργίες του.
- Συμπεριλάβετε τον χώρο ονομάτων std στο πρόγραμμά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
- Δημιουργήστε μια τάξη με όνομα OperatorΥπερφόρτωση.
- Χρησιμοποιήστε τον τροποποιητή ιδιωτικής πρόσβασης, ο οποίος επισημαίνει ένα μέλος κλάσης ως ιδιωτικά προσβάσιμο.
- Δημιουργήστε μια ακέραια μεταβλητή x. Αυτή η μεταβλητή θα είναι ιδιωτικά προσβάσιμη.
- Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης, ο οποίος επισημαίνει ένα μέλος της τάξης ως ιδιωτικά προσβάσιμο.
- Χρησιμοποιήστε έναν κατασκευαστή κλάσης για να αρχικοποιήσετε τη μεταβλητή x στο 10.
- Υπερφόρτωση της σημασίας του τελεστή ++.
- Ο τελεστής θα αυξήσει την τιμή της μεταβλητής x με 2.
- Τέλος του τμήματος υπερφόρτωσης χειριστή. Ο χειριστής έλαβε νέο όνομα.
- Κλήση της συνάρτησης Print().
- Εκτυπώστε την τιμή της μεταβλητής x μαζί με άλλο κείμενο στην κονσόλα όταν καλείται η συνάρτηση Print().
- Τέλος του σώματος της συνάρτησης Print().
- Τέλος του σώματος της τάξης.
- Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί σε αυτήν τη συνάρτηση.
- Δημιουργήστε ένα παράδειγμα του OperatorOverload Κατηγορία με όνομα ov.
- Αυτό θα καλέσει τη συνάρτηση κενού τελεστή ++().
- Χρησιμοποιήστε τη στάση του OperatorOverload κλάση για να καλέσετε τη συνάρτηση Print().
- Η συνάρτηση πρέπει να επιστρέψει τιμή μετά την επιτυχή ολοκλήρωση.
- Τέλος του σώματος της συνάρτησης main().
Παράδειγμα 2
#include<iostream> using 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(); }
Παραγωγή:
Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:
Επεξήγηση κώδικα:
- Συμπερίληψη του αρχείου κεφαλίδας iostream στο πρόγραμμά μας για να χρησιμοποιήσουμε τις λειτουργίες του.
- Συμπεριλάβετε τον χώρο ονομάτων std στο πρόγραμμά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
- Δημιουργήστε μια τάξη με το όνομα TestClass. Το { σηματοδοτεί την αρχή του σώματος της τάξης.
- Χρησιμοποιήστε τον τροποποιητή ιδιωτικής πρόσβασης για να επισημάνετε τις μεταβλητές ως ιδιωτικές, που σημαίνει ότι είναι δυνατή η πρόσβαση σε αυτές μόνο μέσα από την Τάξη.
- Ορίστε δύο ακέραιες μεταβλητές, πραγματικές και πάνω.
- Χρησιμοποιήστε τον τροποποιητή δημόσιας πρόσβασης για να επισημάνετε τον κατασκευαστή ως δημόσιο, που σημαίνει ότι θα είναι προσβάσιμος ακόμη και εκτός της Τάξης.
- Δημιουργία του κατασκευαστή κλάσης και αρχικοποίηση του μεταβλητές.
- Αρχικοποιήστε την τιμή της μεταβλητής real.
- Αρχικοποιήστε την τιμή της μεταβλητής over.
- Τέλος του σώματος του κατασκευαστή.
- Παράκαμψη της σημασίας του τελεστή +.
- Δημιουργήστε το αποτέλεσμα τύπου δεδομένων τύπου TestClass.
- Χρησιμοποιήστε τον τελεστή + με μιγαδικούς αριθμούς. Αυτή η γραμμή θα προσθέσει το πραγματικό μέρος ενός αριθμού στο πραγματικό μέρος ενός άλλου αριθμού.
- Χρησιμοποιήστε τον τελεστή + με μιγαδικούς αριθμούς. Αυτή η γραμμή θα προσθέσει το φανταστικό μέρος ενός αριθμού στο φανταστικό μέρος ενός άλλου αριθμού.
- Το πρόγραμμα θα επιστρέψει την τιμή του αποτελέσματος της μεταβλητής μετά την επιτυχή εκτέλεση.
- Τέλος του ορισμού της νέας έννοιας του + τελεστή, δηλαδή υπερφόρτωση.
- Καλέστε τη μέθοδο print().
- Εκτυπώστε τον νέο μιγαδικό αριθμό μετά την προσθήκη στην κονσόλα.
- Τέλος του σώματος της συνάρτησης print().
- Τέλος του σώματος της Τάξης TestClass.
- Κλήση της συνάρτησης main().
- Περνώντας τις τιμές τόσο των πραγματικών όσο και των μιγαδικών μερών που θα προστεθούν. Το πρώτο μέρος του c1 θα προστεθεί στο πρώτο μέρος του c2, δηλαδή 9+4. Το δεύτερο μέρος του c1 θα προστεθεί στο δεύτερο μέρος του c, δηλαδή 5+3.
- Εκτέλεση μιας πράξης χρησιμοποιώντας τον τελεστή υπερφορτωμένο + και αποθήκευση του αποτελέσματος στη μεταβλητή c3.
- Εκτύπωση της τιμής της μεταβλητής c3 στην κονσόλα.
- Τέλος του σώματος της συνάρτησης main().
Σύνοψη
- Μπορείτε να καθορίσετε περισσότερες από μία σημασίες για το α C++ χειριστής σε ένα πεδίο.
- Αυτό ονομάζεται υπερφόρτωση χειριστή.
- OperaΗ υπερφόρτωση tor παρέχει μια ειδική έννοια ενός χειριστή για έναν τύπο δεδομένων που ορίζεται από το χρήστη.
- Μπορείτε να επαναπροσδιορίσετε την πλειοψηφία των C++ χειριστές μέσω υπερφόρτωσης χειριστή.
- Οχι όλα C++ οι χειριστές μπορεί να υπερφορτωθούν.
- Για να υπερφορτωθεί ένας τελεστής, τουλάχιστον ένας από τους τελεστές πρέπει να είναι ένα αντικείμενο που ορίζεται από το χρήστη.
- Μόνο οι υπάρχοντες χειριστές μπορούν να υπερφορτωθούν. Δεν μπορείτε να υπερφορτώνετε νέους χειριστές.