This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
cpp:vector_overloading_unary_operators [2019/05/16 07:16] gthanos |
cpp:vector_overloading_unary_operators [2021/05/24 06:38] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Υπερφόρτωση μοναδιαίων τελεστών (unary operators) ====== | ||
| - | |||
| - | ^ Τελεστής | ||
| - | | %%+%% | Πριν | ||
| - | | %%-%% | Πριν | ||
| - | | %%++%% | ||
| - | | %%--%% | ||
| - | | %%++%% | ||
| - | | %%--%% | ||
| - | | %%*%% | Πριν | ||
| - | | %%!%% | Πριν | ||
| - | | %%~%% | Πριν | ||
| - | |||
| - | <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.cpp> | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | using namespace std; | ||
| - | |||
| - | 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. | ||
| - | }; | ||
| - | |||
| - | 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; | ||
| - | } | ||
| - | |||
| - | |||
| - | 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 = " | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | |||