This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
cpp:operator_overloading [2017/05/04 12:20] gthanos |
cpp:operator_overloading [2021/05/24 06:28] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Υπερφόρτωση τελεστών ====== | ||
| - | |||
| - | Η C++ επιτρέπει την // | ||
| - | |||
| - | <code cpp Time.cpp> | ||
| - | class Time { | ||
| - | int minutes; | ||
| - | int hours; | ||
| - | public: | ||
| - | Time(int hours, int minutes) { | ||
| - | if(hours >= 0) | ||
| - | this-> | ||
| - | else | ||
| - | this-> | ||
| - | if(minutes >= 0) | ||
| - | this-> | ||
| - | else | ||
| - | this-> | ||
| - | } | ||
| - | int getMinutes() { return minutes; } | ||
| - | int getHours() { return hours; } | ||
| - | }; | ||
| - | |||
| - | int main() { | ||
| - | Time t1(10,30), t2(12, 50); | ||
| - | Time t3 = t1 + t2; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Προς το παρόν αυτό που θα συμβεί είναι ότι ο παραπάνω κώδικας δεν μεταγλωττίζεται καθώς δεν ορίζεται κάποια συμπεριφορά για τον τελεστή '' | ||
| - | |||
| - | <code cpp Time.cpp> | ||
| - | |||
| - | #include < | ||
| - | class Time { | ||
| - | int minutes; | ||
| - | int hours; | ||
| - | public: | ||
| - | Time(int hours, int minutes) { | ||
| - | if(hours >= 0) | ||
| - | this-> | ||
| - | else | ||
| - | this-> | ||
| - | if(minutes >= 0) | ||
| - | this-> | ||
| - | else | ||
| - | this-> | ||
| - | } | ||
| - | Time operator+(const Time &t) { | ||
| - | Time f(hours, minutes); | ||
| - | f.minutes += t.minutes; | ||
| - | if(f.minutes> | ||
| - | f.minutes -= 60; | ||
| - | f.hours++; | ||
| - | f.hours += t.hours; | ||
| - | if(f.hours > 24) | ||
| - | f.hours -= 24; | ||
| - | return f; | ||
| - | } | ||
| - | int getMinutes() { return minutes; } | ||
| - | int getHours() { return hours; } | ||
| - | }; | ||
| - | |||
| - | int main() { | ||
| - | Time t1(10,30), t2(12, 50); | ||
| - | Time t3 = t1 + t2; | ||
| - | std::cout << "t3: " << t3.getHours() <<" | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | <WRAP center round info 80%> | ||
| - | Η λειτουργία υπεφόρτωσης ενός τελεστή μπορεί να κληθεί είτε χρησιμοποιώντας τον τελεστή, | ||
| - | <code cpp> | ||
| - | Time t3 = t1.operator+(t2); | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | Οι συναρτήσεις υπερφόρτωσης τελεστών είναι κανονικές συναρτήσεις που μπορεί να έχουν οποιαδήποτε συμπεριφορά. Για παράδειγμα, | ||
| - | |||
| - | Η παράμετρος που λαμβάνει μία συνάρτηση υπερφόρτωσης είναι συνήθως ο τελεστέος που βρίσκεται στα δεξιά του τελεστή. Το παραπάνω είναι χαρακτηριστικό για τελεστές που έχουν τελεστέους τόσο στα αριστερά όσο και στα δεξιά τους (//binary operators// | ||
| - | |||
| - | Επίσης, | ||
| - | |||
| - | Ο παρακάτω πίνακας δίνει τη μορφή της συνάρτησης υπερφόρτωσης για τους τελεστές που είναι διαθέσιμοι προς υπεφόρτωση. Αντικαταστήστε τον χαρακτήρα '' | ||
| - | |||
| - | ^ Έκφραση | ||
| - | | @a | + - * & ! ~ ++ -- | A:: | ||
| - | | a@ | ++ -- | A:: | ||
| - | | a@b | %%+ - * / % ^ & | < > == != <= >= << >> && || ,%% | A:: | ||
| - | | a@b | %%= += -= *= /= %= ^= &= |= <<= >>= []%% | A:: | ||
| - | | a(b, | ||
| - | | %%a -> b%% | %%-> | ||
| - | | (TYPE) a | TYPE | A::operator TYPE() | ||
| - | |||
| - | Οι τελεστές που δεν υπερφορτώνονται είναι οι εξής: | ||
| - | | :: | .* | . | ?: | | ||
| - | |||
| - | ===== Παράδειγμα Υπερφόρτωσης Τελεστών ===== | ||
| - | |||
| - | Ας υποθέσουμε ότι έχουμε την παρακάτω κλάση //Vector// η οποία υλοποιεί ένα μονοδιάστατο πίνακα από ακεραίους. | ||
| - | <code cpp Vector.cpp> | ||
| - | #include < | ||
| - | #include < | ||
| - | using namespace std; | ||
| - | |||
| - | class Vector { | ||
| - | int *array; | ||
| - | unsigned int size; | ||
| - | | ||
| - | public: | ||
| - | Vector(unsigned int length=0); | ||
| - | Vector(const Vector &v); | ||
| - | Vector(const Vector *v); | ||
| - | ~Vector(); | ||
| - | unsigned int length() const; | ||
| - | int & | ||
| - | int find(int a); | ||
| - | }; | ||
| - | |||
| - | Vector:: | ||
| - | size = length; | ||
| - | array = new (nothrow) int[size]; | ||
| - | if(array==NULL) { | ||
| - | cerr << " | ||
| - | exit(-1); | ||
| - | } | ||
| - | for(int i=0; i<size; i++) | ||
| - | array[i] = 0; | ||
| - | } | ||
| - | |||
| - | Vector:: | ||
| - | size = v.length(); | ||
| - | array = new (nothrow) int[size]; | ||
| - | if(array==NULL) { | ||
| - | cerr << " | ||
| - | exit(-1); | ||
| - | } | ||
| - | for(int i=0; i<size; i++) | ||
| - | array[i] = v.valueAt(i); | ||
| - | } | ||
| - | |||
| - | Vector:: | ||
| - | size = v-> | ||
| - | array = new (nothrow) int[size]; | ||
| - | if(array==NULL) { | ||
| - | cerr << " | ||
| - | exit(-1); | ||
| - | } | ||
| - | for(int i=0; i<size; i++) | ||
| - | array[i] = v-> | ||
| - | } | ||
| - | |||
| - | Vector:: | ||
| - | delete [] array; | ||
| - | } | ||
| - | |||
| - | unsigned int Vector:: | ||
| - | return size; | ||
| - | } | ||
| - | |||
| - | int & | ||
| - | if(pos> | ||
| - | cerr << " | ||
| - | | ||
| - | } | ||
| - | return array[pos]; | ||
| - | } | ||
| - | |||
| - | int Vector:: | ||
| - | for(int i=0; i<size; i++) | ||
| - | if(array[i] == a) | ||
| - | return i; | ||
| - | return -1; | ||
| - | } | ||
| - | |||
| - | int main() { | ||
| - | Vector v(5); | ||
| - | v.valueAt(0) = 2; v.valueAt(1) = 3; | ||
| - | v.valueAt(2) = 4; v.valueAt(3) = 5; v.valueAt(4) = 6; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Για την κλάση //Vector//. | ||