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

Σε αυτό το σεμινάριο, θα μάθουμε για την υπερφόρτωση του χειριστή με τη βοήθεια παραδειγμάτων.

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

Ας υποθέσουμε ότι έχουμε δημιουργήσει τρία αντικείμενα c1, c2 και είναι αποτέλεσμα μιας κλάσης που ονομάζεται Complexπου αντιπροσωπεύει πολύπλοκους αριθμούς.

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

 result = c1 + c2;

αντί για κάτι σαν

 result = c1.addNumbers(c2);

Αυτό καθιστά τον κώδικα διαισθητικό και κατανοητό.

Σημείωση: Δεν μπορείτε να χρησιμοποιήσετε χειριστή υπερφόρτωση των θεμελιωδών τύπων δεδομένων, όπως int, float, charκαι ούτω καθεξής.

Σύνταξη για υπερφόρτωση χειριστή C ++

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

 class className (… public returnType operator symbol (arguments) (… )… );

Εδώ,

  • returnType είναι ο τύπος επιστροφής της συνάρτησης.
  • τελεστής είναι μια λέξη-κλειδί.
  • symbolείναι ο χειριστής που θέλουμε να υπερφορτώσουμε. Όπως: +, <, -, ++, κ.λπ.
  • arguments είναι τα ορίσματα που μεταβιβάζονται στη συνάρτηση.

Υπερφόρτωση χειριστή σε Unary χειριστές

Οι Unary χειριστές λειτουργούν με έναν μόνο τελεστή. Ο τελεστής αύξησης ++και ο τελεστής μείωσης --είναι παραδείγματα μη λειτουργικών τελεστών.

Παράδειγμα 1: Υπερφόρτωση χειριστή ++ (Unary Operator)

 // Overload ++ when used as prefix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++ () ( ++value; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++ ()" function ++count1; count1.display(); return 0; )

Παραγωγή

 Πλήθος: 6

Εδώ, όταν χρησιμοποιούμε ++count1;, το void operator ++ ()λέγεται. Αυτό αυξάνει το χαρακτηριστικό τιμής για το αντικείμενο 1 κατά 1.

Σημείωση: Όταν υπερφορτώνουμε τους χειριστές, μπορούμε να το χρησιμοποιήσουμε για να δουλέψουμε με όποιον τρόπο θέλουμε. Για παράδειγμα, θα μπορούσαμε να χρησιμοποιήσουμε ++για να αυξήσουμε την αξία κατά 100.

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

Το παραπάνω παράδειγμα λειτουργεί μόνο όταν ++χρησιμοποιείται ως πρόθεμα. Για να κάνουμε τη ++δουλειά ως επιδιόρθωση χρησιμοποιούμε αυτήν τη σύνταξη.

 void operator ++ (int) ( // code )

Παρατηρήστε το intεσωτερικό των παρενθέσεων. Είναι η σύνταξη που χρησιμοποιείται για τη χρήση unary τελεστών ως postfix. δεν είναι παράμετρος συνάρτησης.

Παράδειγμα 2: Υπερφόρτωση χειριστή ++ (Unary Operator)

 // Overload ++ when used as prefix and postfix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++ () ( ++value; ) // Overload ++ when used as postfix void operator ++ (int) ( ++value; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++ (int)" function count1++; count1.display(); // Call the "void operator ++ ()" function ++ count1; count1.display(); return 0; )

Παραγωγή

 Πλήθος: 6 Πλήθος: 7

Το Παράδειγμα 2 λειτουργεί όταν ++χρησιμοποιείται τόσο ως πρόθεμα όσο και ως μετά επιδιόρθωση. Ωστόσο, δεν λειτουργεί αν προσπαθήσουμε να κάνουμε κάτι τέτοιο:

 Count count1, result; // Error result = ++count1;

Αυτό συμβαίνει επειδή ο τύπος επιστροφής της λειτουργίας χειριστή μας είναι void. Μπορούμε να λύσουμε αυτό το πρόβλημα κάνοντας Countτον τύπο επιστροφής της λειτουργίας χειριστή.

 // return Count when ++ used as prefix Count operator ++ () ( // code ) // return Count when ++ used as postfix Count operator ++ (int) ( // code )

Παράδειγμα 3: Τιμή επιστροφής από τη λειτουργία χειριστή (++ χειριστής)

 #include using namespace std; class Count ( private: int value; public : // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix Count operator ++ () ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; ) // Overload ++ when used as postfix Count operator ++ (int) ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1, result; // Call the "Count operator ++ ()" function result = ++count1; result.display(); // Call the "Count operator ++ (int)" function result = count1++; result.display(); return 0; )

Παραγωγή

 Πλήθος: 6 Πλήθος: 7

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

 // Overload ++ when used as prefix Count operator ++ () ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; )

The code for the postfix operator overloading is the same as well. Notice that we have created an object temp and returned its value to the operator function.

Also notice the code

 temp.value = ++value; 

The variable value belongs to the count1 object in main() because count1 is calling the function, while temp.value belongs to the temp object.

Operator Overloading in Binary Operators

Binary operators work on two operands. For example,

 result = num + 9;

Here, + is a binary operator that works on the operands num and 9.

When we overload the binary operator for user-defined types by using the code:

 obj3 = obj1 + obj2;

The operator function is called using the obj1 object and obj2 is passed as an argument to the function.

Example 4: C++ Binary Operator Overloading

 // C++ program to overload the binary operator + // This program adds two complex numbers #include using namespace std; class Complex ( private: float real; float imag; public: // Constructor to initialize real and imag to 0 Complex() : real(0), imag(0) () void input() ( cout <> real; cin>> imag; ) // Overload the + operator Complex operator + (const Complex& obj) ( Complex temp; temp.real = real + obj.real; temp.imag = imag + obj.imag; return temp; ) void output() ( if (imag < 0) cout << "Output Complex number: " << real << imag << "i"; else cout << "Output Complex number: " << real << "+" << imag << "i"; ) ); int main() ( Complex complex1, complex2, result; cout << "Enter first complex number:"; complex1.input(); cout << "Enter second complex number:"; complex2.input(); // complex1 calls the operator function // complex2 is passed as an argument to the function result = complex1 + complex2; result.output(); return 0; )

Output

 Εισαγάγετε τον πρώτο αριθμό συμπλέγματος: Εισαγάγετε αληθινά και φανταστικά μέρη αντίστοιχα: 9 5 Εισαγάγετε τον δεύτερο αριθμό συμπλέγματος: Εισαγάγετε πραγματικά και φανταστικά μέρη αντίστοιχα: 7 6 Αριθμός συγκροτήματος εξόδου: 16 + 11i

Σε αυτό το πρόγραμμα, η λειτουργία του χειριστή είναι:

 Complex operator + (const Complex& obj) ( // code )

Αντί για αυτό, θα μπορούσαμε επίσης να γράψουμε αυτήν τη λειτουργία όπως:

 Complex operator + (Complex obj) ( // code )

Ωστόσο,

  • Η χρήση &καθιστά τον κώδικά μας αποτελεσματικό με αναφορά στο αντικείμενο complex2 αντί να δημιουργεί διπλό αντικείμενο μέσα στη λειτουργία του χειριστή.
  • Η χρήση constθεωρείται καλή πρακτική επειδή εμποδίζει τη λειτουργία του χειριστή από την τροποποίηση του συμπλέγματος2.
Υπερφόρτωση δυαδικών τελεστών στο C ++

Πράγματα που πρέπει να θυμάστε στην υπερφόρτωση χειριστή C ++

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

Επισκεφτείτε αυτές τις σελίδες για να μάθετε περισσότερα σχετικά με:

  • Πώς να υπερφορτώσετε τον χειριστή αύξησης με σωστό τρόπο;
  • Πώς να υπερφορτώσετε το δυαδικό χειριστή - για να αφαιρέσετε πολύπλοκους αριθμούς;

ενδιαφέροντα άρθρα...