cpp:operator_overloading
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| cpp:operator_overloading [2017/05/04 12:20] – gthanos | cpp:operator_overloading [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Υπερφόρτωση τελεστών ====== | ====== Υπερφόρτωση τελεστών ====== | ||
| - | Η C++ επιτρέπει την // | + | Η C++ επιτρέπει την // |
| <code cpp Time.cpp> | <code cpp Time.cpp> | ||
| Line 76: | Line 76: | ||
| </ | </ | ||
| - | Οι συναρτήσεις υπερφόρτωσης τελεστών είναι κανονικές συναρτήσεις που μπορεί να έχουν οποιαδήποτε συμπεριφορά. Για παράδειγμα, | + | Οι συναρτήσεις υπερφόρτωσης τελεστών είναι κανονικές συναρτήσεις που μπορεί να έχουν οποιαδήποτε συμπεριφορά. Για παράδειγμα, |
| - | Η παράμετρος που λαμβάνει | + | <WRAP info 80% center round> |
| + | Οι τελεστές μπορούν να κατηγοριοποιηθούν σε δύο βασικές κατηγορίες, τους //μοναδιαίους// τελεστές και τους //δυαδικούς// | ||
| - | Επίσης, μία συνάρτηση υπερφόρτωσης | + | Οι παράμετροι των τελεστών στο εξής θα καλούνται τελεστέοι. |
| + | |||
| + | // | ||
| + | |||
| + | Τόσο οι // | ||
| + | </ | ||
| + | |||
| + | Οι συναρτήσεις | ||
| + | * **μέλη της κλάσης: | ||
| + | * Για | ||
| + | * Για δυαδικούς | ||
| + | * **φιλικές συναρτήσεις | ||
| + | * Για μοναδιαίους τελεστές οι φιλικές συναρτήσεις θεωρούν ότι ο τελεστέος είναι το μοναδικό όρισμα της | ||
| + | * Για δυαδικούς τελεστές οι φιλικές συναρτήσεις υπερφόρτωσης λαμβάνουν δύο ορίσματα. Θεωρούν ότι ο αριστερός τελεστέος είναι το πρώτο όρισμα της συνάρτησης υπερφόρτωσης και ο δεξιός τελεστέος το δεύτερο όρισμα. | ||
| Ο παρακάτω πίνακας δίνει τη μορφή της συνάρτησης υπερφόρτωσης για τους τελεστές που είναι διαθέσιμοι προς υπεφόρτωση. Αντικαταστήστε τον χαρακτήρα '' | Ο παρακάτω πίνακας δίνει τη μορφή της συνάρτησης υπερφόρτωσης για τους τελεστές που είναι διαθέσιμοι προς υπεφόρτωση. Αντικαταστήστε τον χαρακτήρα '' | ||
| - | ^ Έκφραση | + | ^ Έκφραση |
| - | | @a | + - * & ! ~ ++ -- | A:: | + | | @a | %%+ - * & ! ~ ++ --%% |
| - | | a@ | ++ -- | A:: | + | | a@ | %%++ --%% |
| - | | a@b | %%+ - * / % ^ & | < > == != <= >= << >> && || ,%% | A:: | + | | a@b | %%+ - * / % ^ | < > == != <= >= << >> && || ,%% | A:: |
| | a@b | %%= += -= *= /= %= ^= &= |= <<= >>= []%% | A:: | | a@b | %%= += -= *= /= %= ^= &= |= <<= >>= []%% | A:: | ||
| - | | a(b, | + | | a(b, |
| | %%a -> b%% | %%-> | | %%a -> b%% | %%-> | ||
| | (TYPE) a | TYPE | A::operator TYPE() | | (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 | + | |
| - | ~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//. | ||
cpp/operator_overloading.1493900420.txt.gz · Last modified: 2017/05/04 11:20 (external edit)
