cpp:vector_overloading_unary_operators
                Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| cpp:vector_overloading_unary_operators [2017/05/05 08:41] – gthanos | cpp:vector_overloading_unary_operators [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Υπερφόρτωση μοναδιαίων τελεστών (unary operators) ====== | ====== Υπερφόρτωση μοναδιαίων τελεστών (unary operators) ====== | ||
| - | ^  Τελεστής | + | Ο παρακάτω πίνακας περιγράφει την υπερφόρτωση των τελεστών στο παράδειγμα της κλάσης //Vector// που ακολουθεί. | 
| - | |  %%+%%  |  Πριν | + | |
| - | |  %%-%%  |  Πριν | + | ^  Τελεστής | 
| - | |  %%++%% | + | |  %%+%%  |  Πριν | 
| - | |  %%--%% | + | |  %%-%%  |  Πριν | 
| - | |  %%++%% | + | |  %%++%% | 
| - | |  %%--%% | + | |  %%--%% | 
| - | |  %%*%%  |  Πριν | + | |  %%++%% | 
| - | |  %%!%%  |  Πριν | + | |  %%--%% | 
| - | |  %%~%%  |  Πριν | + | |  %%*%%  |  Πριν | 
| + | |  %%!%%  |  Πριν | ||
| + | |  %%~%%  |  Πριν | ||
| <color red> | <color red> | ||
| - | <WRAP center round tip 80%> | ||
| Προκειμένου να μπορέσουμε να παρακολουθήσουμε την υπερφόρτωση των τελεστών υπερφορτώνουμε τον τελεστή **=**. Η επεξήγηση της υπερφόρτωσης του τελεστή **=** θα δοθεί στη συνέχεια. | Προκειμένου να μπορέσουμε να παρακολουθήσουμε την υπερφόρτωση των τελεστών υπερφορτώνουμε τον τελεστή **=**. Η επεξήγηση της υπερφόρτωσης του τελεστή **=** θα δοθεί στη συνέχεια. | ||
| - | </ | ||
| <WRAP center round tip 80%> | <WRAP center round tip 80%> | ||
| Line 33: | Line 33: | ||
| </ | </ | ||
| - | <code cpp Vector.cpp> | + | |
| + | <WRAP center round tip 80%> | ||
| + | Επίσης, | ||
| + | <code cpp> | ||
| + | Vector | ||
| + | </ | ||
| + | επιστρέφει ένα νέο αντικείμενο του οποίου τα στοιχεία είναι το binary NOT του αρχικού. Ο αρχικός πίνακας παραμένει αμετάβλητος. | ||
| + | </ | ||
| + | |||
| + | < | ||
| #include < | #include < | ||
| #include < | #include < | ||
| #include < | #include < | ||
| using namespace std; | using namespace std; | ||
| + | |||
| + | #ifndef _VECTOR_HPP_ | ||
| + | #define _VECTOR_HPP_ | ||
| class Vector { | class Vector { | ||
| int *array; | int *array; | ||
| - |  | + | int size; | 
|  |  | ||
| public: | public: | ||
| Line 48: | Line 60: | ||
| Vector(const Vector *v); | Vector(const Vector *v); | ||
| ~Vector(); | ~Vector(); | ||
| - | unsigned int length() const; | + | unsigned int length() const; | 
| - | int & | + | int& valueAt(unsigned int pos); // return a reference to element at position pos | 
| - | int find(int a) const; | + | |
| - | // if not element not found | + | |
|  |  | ||
| - |  | + |  | 
| - | void print(string &msg) const; | + |  | 
| - | void operator=(const Vector &v); | + | // Otherwise, return -1 | 
|  |  | ||
| - |  | + |  | 
| - |  | + |  | 
| - | Vector operator++(); // prefix increment | + | Vector& operator=(const Vector &v); | 
| - | Vector operator--(); | + | |
| - | int operator*() const; | + | |
| - | Vector operator~() const; | + | |
| - | friend Vector operator!(const Vector & | + | |
|  |  | ||
| - | Vector operator++(int ); | + |  | 
| - | Vector operator--(int ); | + | friend int operator*(const Vector& | 
| + | |||
| + | Vector operator-() const; | ||
| + | // values of the original vector. | ||
| + | Vector& operator++(); | ||
| + | friend Vector& operator--(Vector& | ||
| + |  | ||
| + |  | ||
| + | |||
| + | Vector operator~() const; | ||
| + | friend Vector operator!(const Vector & | ||
| + | // elements in inverted sequence. | ||
| }; | }; | ||
| + | |||
| + | #endif | ||
| + | </ | ||
| + | |||
| + | <code cpp Vector.cpp> | ||
| + | #include " | ||
| Vector:: | Vector:: | ||
| Line 88: | Line 111: | ||
| } | } | ||
| for(int i=0; i<size; i++) | for(int i=0; i<size; i++) | ||
| - | array[i] = v.valueAt(i); | + | array[i] = v.array[i]; | 
| } | } | ||
| Line 99: | Line 122: | ||
| } | } | ||
| for(int i=0; i<size; i++) | for(int i=0; i<size; i++) | ||
| - | array[i] = v->valueAt(i); | + | array[i] = v->array[i]; | 
| } | } | ||
| Line 110: | Line 133: | ||
| } | } | ||
| - | int & | + | int& Vector:: | 
| if(pos> | if(pos> | ||
| - | cerr << " | + | cerr << " | 
|  |  | ||
| } | } | ||
| Line 119: | Line 142: | ||
| int Vector:: | int Vector:: | ||
| - | for(int i=0; i<size; i++) | + | for(int i=0; i<size; i++) { | 
| if(array[i] == a) | if(array[i] == a) | ||
| return i; | return i; | ||
| - |  | + | } | 
| + |  | ||
| } | } | ||
| Line 137: | Line 161: | ||
| void Vector:: | void Vector:: | ||
| cout << msg; | cout << msg; | ||
| - |  | + |  | 
| - | cout << array[i]; | + | |
| - | if(i==size-1) | + | |
| - | cout << endl; | + | |
| - | else | + | |
| - | cout << ", "; | + | |
| - | } | + | |
| } | } | ||
| - | void Vector:: | + | Vector &Vector:: | 
| if(array!=NULL) | if(array!=NULL) | ||
| delete [] array; | delete [] array; | ||
| Line 156: | Line 174: | ||
| } | } | ||
| for(int i=0; i<size; i++) | for(int i=0; i<size; i++) | ||
| - | array[i] = v.valueAt(i); | + | array[i] = v.array[i]; | 
| + | return *this; | ||
| } | } | ||
| Line 176: | Line 195: | ||
| //prefix increment | //prefix increment | ||
| - | Vector Vector:: | + | Vector& Vector:: | 
| for(int i=0; i<size; i++) { | for(int i=0; i<size; i++) { | ||
| array[i]++; | array[i]++; | ||
| } | } | ||
| - |  | + | return | 
| - |  | + | |
| } | } | ||
| + | |||
| //prefix decrement | //prefix decrement | ||
| - | Vector | + | Vector& operator--(Vector& v) { | 
| - | for(int i=0; i<size; i++) { | + | for(int i=0; i<v.size; i++) { | 
| - | array[i]--; | + |  | 
| } | } | ||
| - | Vector v(this); | ||
| return v; | return v; | ||
| } | } | ||
| - | int Vector::operator*() const{ | + | int operator*(const | 
| int product = 1; | int product = 1; | ||
| - | for(int i=0; i<size; i++) | + | for(int i=0; i<v.size; i++) | 
| - | product *= array[i]; | + | product *= v.array[i]; | 
| return product; | return product; | ||
| } | } | ||
| Line 223: | Line 241: | ||
| //postfix decrement | //postfix decrement | ||
| - | Vector | + | Vector operator--(Vector& v, int a) { | 
| - | Vector | + | Vector | 
| - | for(int i=0; i<size; i++) { | + | for(int i=0; i<v.size; i++) { | 
| - | array[i]--; | + |  | 
| } | } | ||
| - | return | + | return | 
| } | } | ||
| + | </ | ||
| + | |||
| + | <code cpp VectorUsage.cpp> | ||
| + | #include " | ||
| int main() { | int main() { | ||
| Line 239: | Line 261: | ||
| string msg = " | string msg = " | ||
|  |  | ||
| - | v.print(msg); | + | v.print(msg); | 
| - | int sum = +v; | + | cout << "+v: " << | 
| - | cout << "Sum of elements: " << | + | |
|  |  | ||
| Vector f = -v; | Vector f = -v; | ||
| - | f.print(msg=" | + | f.print(msg=" | 
| - |  | + | |
| - | cout << "Product of elements: " << | + | cout << "*v: " << | 
|  |  | ||
| f = !v; | f = !v; | ||
| - | f.print(msg = "Inverted sequence: "); | + | f.print(msg = "f = !v: "); cout << endl; | 
|  |  | ||
| + | cout << "~2: "<< | ||
| f = ~v; | f = ~v; | ||
| - | f.print(msg = "Binary inverted: "); | + | f.print(msg = "f = ~v: "); cout << endl; | 
|  |  | ||
| - | msg = "-------------\nPrefix increment"; | + |  | 
| - |  | + | f.print(msg = "f = ++v: "); | 
| - | f = ++v; | + |  | 
| - |  | + | f = --v; | 
| - |  | + |  | 
| + |  | ||
| + | cout << endl; | ||
|  |  | ||
| - | msg = "-------------\nPostfix decrement"; | + |  | 
| - |  | + | f.print(msg = "f = v++: "); | 
| + |  | ||
| f = v--; | f = v--; | ||
| - |  | + |  | 
| - |  | + |  | 
| } | } | ||
| </ | </ | ||
| - | <WRAP center round tip 80%> | + | |
| - | Από τα παραπάνω παρατηρούμε τα εξής: | + | |
| - | * Οι συναρτήσεις που δεν μεταβάλλουν το αντικείμενο στο οποίο εφαρμόζονται δηλώνονται ως **// | + | |
| - | * Σε όλες τις περιπτώσεις επιστρέφεται ένα νέο αντικείμενο ανεξάρτητα εάν μεταβλήθηκε το αντικείμενο πάνω στο οποίο εφαρμόζεται ο τελεστής ή όχι. | + | |
| - | </ | + | |
cpp/vector_overloading_unary_operators.1493973677.txt.gz · Last modified: 2017/05/05 07:41 (external edit)
                
                