User Tools

Site Tools


cpp:operator_overloading

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revisionBoth sides next revision
cpp:operator_overloading [2017/04/26 14:00] – created gthanoscpp:operator_overloading [2020/04/28 08:20] gthanos
Line 68: Line 68:
 } }
 </code> </code>
 +
 +<WRAP center round info 80%>
 +Η λειτουργία υπεφόρτωσης ενός τελεστή μπορεί να κληθεί είτε χρησιμοποιώντας τον τελεστή, όπως στο παραπάνω παράδειγμα, είτε καλώντας τη συνάρτηση υπερφόρτωσης. Η κλήση της συνάρτησης υπερφόρτωσης για το παραπάνω παράδειγμα έχει ως εξής:
 +<code cpp>
 +Time t3 = t1.operator+(t2);
 +</code>
 +</WRAP>
 +
 +Οι συναρτήσεις υπερφόρτωσης τελεστών είναι κανονικές συναρτήσεις που μπορεί να έχουν οποιαδήποτε συμπεριφορά. Για παράδειγμα, δεν υπάρχει κανένας περιορισμός ότι ο τελεστής ''+'' θα πρέπει να υλοποιεί την διαδικασία της πρόσθεσης για αντικείμενα τύπου //Time// αν και η διατήρηση της συγκεκριμένης συμπεριφοράς συμβάλει στην αναγνωσιμότητα του κώδικα. Γενικά, είναι καλή πρακτική η διατήρηση της παραδοσιακής συμπεριφοράς των τελεστών που υπερφορτώνονται.
 +
 +<WRAP info 80% center round>
 +Οι τελεστές μπορούν να κατηγοριοποιηθούν σε δύο βασικές κατηγορίες, τους //μοναδιαίους// τελεστές και τους //δυαδικούς// τελεστές. //Μοναδιαίοι// είναι οι τελεστές που λαμβάνουν μόνο ένα μία παράμετρο στα δεξιά ή τα αριστερά τους. Παραδείγματα μοναδιαίων τελεστών είναι τα εξής: **!a, -a, a++**. 
 +
 +Οι παράμετροι των τελεστών στο εξής θα καλούνται τελεστέοι.
 +
 +//Δυαδικοί// τελεστές είναι εκείνοι που έχουν δύο τελεστέους, συνήθως ένα στα αριστερά και ένα στα δεξιά του τελεστή. Παραδείγματα δυαδικών τελεστών είναι τα εξής: **a+=b, a+b**.
 +
 +Τόσο οι //μοναδιαίοι// τελεστές όσο και οι //δυαδικοί// τελεστές είναι δυνατόν να μεταβάλλουν ή να μη μεταβάλλουν το αντικείμενο στο οποίο εφαρμόζονται.
 +</WRAP>
 +
 +Οι συναρτήσεις υπερφόρτωσης χωρίζονται σε δύο βασικές κατηγορίες **//α)//** μέλη της κλάσης και **//β)//** φιλικές συναρτήσεις. Για κάθε μία από τις παραπάνω δύο κατηγορίες ισχύουν τα εξής:
 +  * **μέλη της κλάσης:** Για συναρτήσεις υπερφόρτωσης τελεστών που αποτελούν μέλη της κλάσης ισχύουν τα εξής:
 +    * Για μοναδιαίους τελεστές οι συναρτήσεις μέλη θεωρούν ο τελεστέος είναι το αντικείμενο στο οποίο ανήκει η συνάρτηση. Συνήθως οι συναρτήσεις υπερφόρτωσης των μοναδιαίων τελεστών δεν έχουν ορίσματα. Εξαίρεση αποτελούν οι τελεστές αύξησης ή μείωσης κατά ένα (%%++ ή --%%) όταν αυτοί εφαρμόζονται στα δεξιά του αντικειμένου (//postfix increment/decrement operators//), όπου λαμβάνουν ως μοναδικό όρισμα έναν ακέραιο.
 +    * Για δυαδικούς τελεστές οι συναρτήσεις υπερφόρτωσης θεωρούν ότι ο αριστερός τελεστέος είναι το αντικείμενο στο οποίο ανήκει η συνάρτηση και ο δεξιός τελεστέος δίνεται ως η μοναδική παράμετρος.
 +  * **φιλικές συναρτήσεις της κλάσης:** Για φιλικές συναρτήσεις υπερφόρτωσης ισχύουν τα εξής:
 +    * Για μοναδιαίους τελεστές οι φιλικές συναρτήσεις θεωρούν ότι ο τελεστέος είναι το μοναδικό όρισμα της συνάρτησης. Εξαίρεση αποτελούν οι τελεστές αύξησης ή μείωσης κατά ένα (%%++ ή --%%) όταν αυτοί εφαρμόζονται στα δεξιά του αντικειμένου (//postfix increment/decrement operators//), όπου λαμβάνουν δύο ορίσματα με την παρακάτω σειρά α) το αντικείμενο στο οποίο εφαρμόζονται (τελεστέος) και β) έναν ακέραιο.
 +    * Για δυαδικούς τελεστές οι φιλικές συναρτήσεις υπερφόρτωσης λαμβάνουν δύο ορίσματα. Θεωρούν ότι ο αριστερός τελεστέος είναι το πρώτο όρισμα της συνάρτησης υπερφόρτωσης και ο δεξιός τελεστέος το δεύτερο όρισμα.  
 +
 +Ο παρακάτω πίνακας δίνει τη μορφή της συνάρτησης υπερφόρτωσης για τους τελεστές που είναι διαθέσιμοι προς υπεφόρτωση. Αντικαταστήστε τον χαρακτήρα ''@'' με τον εκάστοτε τελεστή. 
 +
 +^  Έκφραση  ^  Τελεστής  ^  Υπερφόρτωση ως μέλος της κλάσης  ^  Υπερφόρτωση ως φιλική συνάρτηση  ^
 +|  @a  | %%+ - * & ! ~ ++ --%%  |  A::operator@()  |  operator@(A)  |
 +|  a@  | %%++ --%%  |  A::operator@(int)  |  operator@(A,int)  |
 +|  a@b  | %%+ - * / %  ^  | < > == != <= >= << >> && || ,%%  |  A::operator@(B)  |  operator@(A,B)  |
 +|  a@b  | %%= += -= *= /= %= ^= &= |= <<= >>= []%%  |  A::operator@(B)  |  -  |
 +|  a(b,c...)  | %%()%%  |  A::operator()(B,C...)  |  -  |
 +|  %%a -> b%%  | %%->%%  |  %%A::operator->()%%  |  -  |
 +|  (TYPE) a  | TYPE  |  A::operator TYPE()  |  -  |
 +
 +Οι τελεστές που δεν υπερφορτώνονται είναι οι εξής:
 +|  **::**  |  **.* **  |  **.**  |  **?:**  |
 +
 +
cpp/operator_overloading.txt · Last modified: 2021/05/24 06:28 (external edit)