This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision | Previous revision Next revision Both sides next revision | ||
|
cpp:vector_overloading_unary_operators [2021/05/24 06:38] |
cpp:vector_overloading_unary_operators [2021/05/24 07:37] gthanos |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Υπερφόρτωση μοναδιαίων τελεστών (unary operators) ====== | ||
| + | |||
| + | Ο παρακάτω πίνακας περιγράφει την υπερφόρτωση των τελεστών στο παράδειγμα της κλάσης //Vector// που ακολουθεί. | ||
| + | |||
| + | ^ Τελεστής | ||
| + | | %%+%% | Πριν | ||
| + | | %%-%% | Πριν | ||
| + | | %%++%% | ||
| + | | %%--%% | ||
| + | | %%++%% | ||
| + | | %%--%% | ||
| + | | %%*%% | Πριν | ||
| + | | %%!%% | Πριν | ||
| + | | %%~%% | Πριν | ||
| + | |||
| + | <color red> | ||
| + | |||
| + | Προκειμένου να μπορέσουμε να παρακολουθήσουμε την υπερφόρτωση των τελεστών υπερφορτώνουμε τον τελεστή **=**. Η επεξήγηση της υπερφόρτωσης του τελεστή **=** θα δοθεί στη συνέχεια. | ||
| + | |||
| + | <WRAP center round tip 80%> | ||
| + | Προσέξτε τη διαφορετική δήλωση της συνάρτησης υπερφόρτωσης ανάμεσα στους μοναδιαίους τελεστές αύξησης και μείωσης κατά ένα (%%++, --%%) όταν αυτοί εφαρμόζονται πριν και μετά το αντικείμενο (//prefix// και //postfix operators// | ||
| + | |||
| + | Το // | ||
| + | <code cpp> | ||
| + | Vector operator++(); | ||
| + | Vector operator--(); | ||
| + | </ | ||
| + | Στην περίπτωση δήλωσης του τελεστή μετά το αντικείμενο η δήλωση είναι | ||
| + | <code cpp> | ||
| + | Vector operator++(int a); | ||
| + | Vector operator--(int a); | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP center round tip 80%> | ||
| + | Επίσης, | ||
| + | <code cpp> | ||
| + | Vector operator~() const; | ||
| + | </ | ||
| + | επιστρέφει ένα νέο αντικείμενο του οποίου τα στοιχεία είναι το binary NOT του αρχικού. Ο αρχικός πίνακας παραμένει αμετάβλητος. | ||
| + | </ | ||
| + | |||
| + | <code cpp Vector.hpp> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | using namespace std; | ||
| + | |||
| + | #ifndef _VECTOR_HPP_ | ||
| + | #define _VECTOR_HPP_ | ||
| + | |||
| + | class Vector { | ||
| + | int *array; | ||
| + | int size; | ||
| + | | ||
| + | public: | ||
| + | Vector(unsigned int length=0); | ||
| + | Vector(const Vector &v); | ||
| + | Vector(const Vector *v); | ||
| + | ~Vector(); | ||
| + | unsigned int length() const; | ||
| + | int& valueAt(unsigned int pos); // return a reference to element at position pos | ||
| + | | ||
| + | int find(int a) const; | ||
| + | // If found, return the position of the element. | ||
| + | // Otherwise, return -1 | ||
| + | | ||
| + | void print() const; | ||
| + | void print(string &msg) const; | ||
| + | Vector& operator=(const Vector &v); | ||
| + | | ||
| + | int operator+() const; | ||
| + | friend int operator*(const Vector& | ||
| + | | ||
| + | Vector operator-() const; | ||
| + | // values of the original vector. | ||
| + | Vector& operator++(); | ||
| + | friend Vector& operator--(Vector& | ||
| + | Vector operator++(int ); // postfix increment. Returns a new Vector. | ||
| + | friend Vector operator--(Vector&, | ||
| + | | ||
| + | Vector operator~() const; | ||
| + | friend Vector operator!(const Vector & | ||
| + | // elements in inverted sequence. | ||
| + | }; | ||
| + | |||
| + | #endif | ||
| + | </ | ||
| + | |||
| + | <code cpp Vector.cpp> | ||
| + | #include " | ||
| + | |||
| + | 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.array[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& Vector:: | ||
| + | if(pos> | ||
| + | cerr << " | ||
| + | | ||
| + | } | ||
| + | return array[pos]; | ||
| + | } | ||
| + | |||
| + | int Vector:: | ||
| + | for(int i=0; i<size; i++) { | ||
| + | if(array[i] == a) | ||
| + | return i; | ||
| + | } | ||
| + | return -1; | ||
| + | } | ||
| + | |||
| + | void Vector:: | ||
| + | for(int i=0; i<size; i++) { | ||
| + | cout << array[i]; | ||
| + | if(i==size-1) | ||
| + | cout << endl; | ||
| + | else | ||
| + | cout << ", "; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void Vector:: | ||
| + | cout << msg; | ||
| + | print(); | ||
| + | } | ||
| + | |||
| + | Vector & | ||
| + | if(array!=NULL) | ||
| + | delete [] array; | ||
| + | size = v.length(); | ||
| + | array = new (nothrow) int[size]; | ||
| + | if(array==NULL) { | ||
| + | cerr << " | ||
| + | exit(-1); | ||
| + | } | ||
| + | for(int i=0; i<size; i++) | ||
| + | array[i] = v.array[i]; | ||
| + | return *this; | ||
| + | } | ||
| + | |||
| + | int Vector:: | ||
| + | int sum=0.0; | ||
| + | for(int i=0; i<size; i++) { | ||
| + | sum += array[i]; | ||
| + | } | ||
| + | return sum; | ||
| + | } | ||
| + | |||
| + | Vector Vector:: | ||
| + | Vector v(size); | ||
| + | for(int i=0; i<size; i++) { | ||
| + | v.valueAt(i) = -array[i]; | ||
| + | } | ||
| + | return v; | ||
| + | } | ||
| + | |||
| + | //prefix increment | ||
| + | Vector& Vector:: | ||
| + | for(int i=0; i<size; i++) { | ||
| + | array[i]++; | ||
| + | } | ||
| + | return *this; | ||
| + | } | ||
| + | |||
| + | //prefix decrement | ||
| + | Vector& operator--(Vector& | ||
| + | for(int i=0; i< | ||
| + | v.array[i]--; | ||
| + | } | ||
| + | return v; | ||
| + | } | ||
| + | |||
| + | int operator*(const Vector& v){ | ||
| + | int product = 1; | ||
| + | for(int i=0; i< | ||
| + | product *= v.array[i]; | ||
| + | return product; | ||
| + | } | ||
| + | |||
| + | Vector Vector:: | ||
| + | Vector v(size); | ||
| + | for(int i=0; i<size; i++) | ||
| + | v.valueAt(i) = ~array[i]; | ||
| + | return v; | ||
| + | } | ||
| + | |||
| + | Vector operator!(const Vector &v) { | ||
| + | Vector n = v; | ||
| + | for(int i=0; i< | ||
| + | n.array[i] = v.array[v.size-1-i]; | ||
| + | return n; | ||
| + | } | ||
| + | |||
| + | //postfix increment | ||
| + | Vector Vector:: | ||
| + | Vector v(this); | ||
| + | for(int i=0; i<size; i++) { | ||
| + | array[i]++; | ||
| + | } | ||
| + | return v; | ||
| + | } | ||
| + | |||
| + | //postfix decrement | ||
| + | Vector operator--(Vector& | ||
| + | Vector w(v); | ||
| + | for(int i=0; i< | ||
| + | v.array[i]--; | ||
| + | } | ||
| + | return w; | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | <code cpp Vector.cpp> | ||
| + | #include " | ||
| + | |||
| + | 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; | ||
| + | | ||
| + | string msg = " | ||
| + | | ||
| + | v.print(msg); | ||
| + | cout << "+v: " << +v << endl; | ||
| + | | ||
| + | Vector f = -v; | ||
| + | f.print(msg=" | ||
| + | | ||
| + | cout << "*v: " << *v << endl; | ||
| + | | ||
| + | f = !v; | ||
| + | f.print(msg = "f = !v: "); cout << endl; | ||
| + | | ||
| + | cout << "~2: "<< | ||
| + | f = ~v; | ||
| + | f.print(msg = "f = ~v: "); cout << endl; | ||
| + | | ||
| + | f = ++v; | ||
| + | f.print(msg = "f = ++v: " | ||
| + | v.print(msg = " | ||
| + | f = --v; | ||
| + | f.print(msg = "f = --v: " | ||
| + | v.print(msg = " | ||
| + | cout << endl; | ||
| + | | ||
| + | f = v++; | ||
| + | f.print(msg = "f = v++: "); | ||
| + | v.print(msg = " | ||
| + | f = v--; | ||
| + | f.print(msg = "f = v--: "); | ||
| + | v.print(msg = " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||