This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
|
cpp:vector_overloading [2017/05/04 13:38] gthanos [Μοναδιαίοι τελεστές (unary operators)] |
cpp:vector_overloading [2019/05/16 07:29] gthanos |
||
|---|---|---|---|
| Line 9: | Line 9: | ||
| class Vector { | class Vector { | ||
| int *array; | int *array; | ||
| - | | + | int size; |
| | | ||
| public: | public: | ||
| - | Vector(unsigned | + | Vector(int length=0); |
| Vector(const Vector &v); | Vector(const Vector &v); | ||
| Vector(const Vector *v); | Vector(const Vector *v); | ||
| ~Vector(); | ~Vector(); | ||
| - | | + | int length() const;// return Vector' |
| - | int & | + | int & |
| int find(int a) const; | int find(int a) const; | ||
| // if not element not found | // if not element not found | ||
| Line 24: | Line 24: | ||
| }; | }; | ||
| - | Vector:: | + | Vector:: |
| size = length; | size = length; | ||
| array = new (nothrow) int[size]; | array = new (nothrow) int[size]; | ||
| Line 61: | Line 61: | ||
| } | } | ||
| - | unsigned | + | int Vector:: |
| return size; | return size; | ||
| } | } | ||
| - | int & | + | int & |
| if(pos> | if(pos> | ||
| cerr << " | cerr << " | ||
| Line 99: | Line 99: | ||
| Για την παραπάνω κλάση κλάση //Vector// θέλουμε να υπερφορτώσουμε τους τελεστές ανά κατηγορία ως εξής: | Για την παραπάνω κλάση κλάση //Vector// θέλουμε να υπερφορτώσουμε τους τελεστές ανά κατηγορία ως εξής: | ||
| - | + | | |
| - | ===== Μοναδιαίοι τελεστές (unary operators) ===== | + | |
| - | + | * [[cpp: | |
| - | ^ Τελεστής | + | |
| - | | %%+%% | Πριν | + | |
| - | | %%-%% | Πριν | + | |
| - | | %%++%% | + | |
| - | | %%--%% | + | |
| - | | %%++%% | + | |
| - | | %%--%% | + | |
| - | | %%*%% | Πριν | + | |
| - | | %%!%% | Πριν | + | |
| - | | %%~%% | Πριν | + | |
| - | + | ||
| - | <color red> | + | |
| - | + | ||
| - | <WRAP center round tip 80%> | + | |
| - | Προκειμένου να μπορέσουμε να παρακολουθήσουμε την υπερφόρτωση των τελεστών υπερφορτώνουμε τον τελεστή %%=%%. Η επεξήγηση της | + | |
| - | </ | + | |
| - | + | ||
| - | <WRAP center round tip 80%> | + | |
| - | Προσέξτε τη διαφορετική συμπεριφορά ανάμεσα στους μοναδιαίους τελεστές αύξησης | + | |
| - | </ | + | |
| - | + | ||
| - | <code cpp Vector.cpp> | + | |
| - | #include < | + | |
| - | #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) const; | + | |
| - | // if not element not found | + | |
| - | + | ||
| - | void print() const; | + | |
| - | void print(string &msg) const; | + | |
| - | void operator=(const Vector &v); | + | |
| - | + | ||
| - | int operator+() const; | + | |
| - | Vector operator-() const; | + | |
| - | Vector operator++(); | + | |
| - | Vector operator--(); | + | |
| - | int operator*() const; | + | |
| - | Vector operator~() const; | + | |
| - | Vector operator!() const; | + | |
| - | + | ||
| - | Vector operator++(int ); // postfix increment | + | |
| - | Vector operator--(int ); // postfix decrement | + | |
| - | }; | + | |
| - | + | ||
| - | 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; | + | |
| - | } | + | |
| - | + | ||
| - | void Vector:: | + | |
| - | for(int i=0; i<size; i++) { | + | |
| - | cout << array[i]; | + | |
| - | if(i==size-1) | + | |
| - | cout << endl; | + | |
| - | else | + | |
| - | cout << ", "; | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | void Vector:: | + | |
| - | cout << msg; | + | |
| - | for(int i=0; i<size; i++) { | + | |
| - | cout << array[i]; | + | |
| - | if(i==size-1) | + | |
| - | cout << endl; | + | |
| - | else | + | |
| - | cout << ", "; | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | void 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.valueAt(i); | + | |
| - | } | + | |
| - | + | ||
| - | 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]++; | + | |
| - | } | + | |
| - | Vector v(this); | + | |
| - | return v; | + | |
| - | } | + | |
| - | //prefix decrement | + | |
| - | Vector Vector:: | + | |
| - | for(int i=0; i<size; i++) { | + | |
| - | array[i]--; | + | |
| - | } | + | |
| - | Vector v(this); | + | |
| - | return v; | + | |
| - | } | + | |
| - | + | ||
| - | int Vector:: | + | |
| - | int product = 1; | + | |
| - | for(int i=0; i<size; i++) | + | |
| - | product *= array[i]; | + | |
| - | return product; | + | |
| - | } | + | |
| - | + | ||
| - | Vector Vector:: | + | |
| - | Vector v(size); | + | |
| - | for(int i=0; i<size; i++) | + | |
| - | v.valueAt(i) = ~array[i]; | + | |
| - | return v; | + | |
| - | } | + | |
| - | + | ||
| - | Vector Vector:: | + | |
| - | Vector v(size); | + | |
| - | for(int i=0; i<size; i++) | + | |
| - | v.valueAt(i) = array[size-1-i]; | + | |
| - | return v; | + | |
| - | } | + | |
| - | + | ||
| - | //postfix increment | + | |
| - | Vector Vector:: | + | |
| - | Vector v(this); | + | |
| - | for(int i=0; i<size; i++) { | + | |
| - | array[i]++; | + | |
| - | } | + | |
| - | return v; | + | |
| - | } | + | |
| - | + | ||
| - | //postfix decrement | + | |
| - | Vector Vector:: | + | |
| - | Vector v(this); | + | |
| - | for(int i=0; i<size; i++) { | + | |
| - | array[i]--; | + | |
| - | } | + | |
| - | return v; | + | |
| - | } | + | |
| - | + | ||
| - | + | ||
| - | 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); | + | |
| - | int sum = +v; | + | |
| - | cout << "Sum of elements: " << sum << endl; | + | |
| - | + | ||
| - | Vector f = -v; | + | |
| - | f.print(msg=" | + | |
| - | int product = *v; | + | |
| - | cout << " | + | |
| - | + | ||
| - | f = !v; | + | |
| - | f.print(msg = " | + | |
| - | + | ||
| - | f = ~v; | + | |
| - | f.print(msg = " | + | |
| - | + | ||
| - | msg = " | + | |
| - | cout << msg << endl; | + | |
| - | f = ++v; | + | |
| - | v.print(msg = " | + | |
| - | f.print(msg = " | + | |
| - | + | ||
| - | msg = " | + | |
| - | cout << msg << endl; | + | |
| - | f = v--; | + | |
| - | v.print(msg = " | + | |
| - | f.print(msg = " | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Από τα παραπάνω παρατηρούμε τα εξής: | + | |
| - | + | ||
| - | * Οι συναρτήσεις | + | |
| - | * Το // | + | |
| - | <code cpp> | + | |
| - | Στην περίπτωση δήλωσης του | + | |
| - | Vector operator++(); | + | |
| - | Vector operator--(); | + | |
| - | Στην περίπτωση δήλωσης του τελεστή μετά το αντικείμενο η δήλωση είναι | + | |
| - | Vector operator++(int a); | + | |
| - | Vector operator--(int a); | + | |
| - | </ | + | |
| - | * Σε όλες τις | + | |