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 [2017/05/05 08:41] gthanos |
cpp:vector_overloading_unary_operators [2021/05/24 06:38] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Υπερφόρτωση μοναδιαίων τελεστών (unary operators) ====== | ||
| - | |||
| - | ^ Τελεστής | ||
| - | | %%+%% | Πριν | ||
| - | | %%-%% | Πριν | ||
| - | | %%++%% | ||
| - | | %%--%% | ||
| - | | %%++%% | ||
| - | | %%--%% | ||
| - | | %%*%% | Πριν | ||
| - | | %%!%% | Πριν | ||
| - | | %%~%% | Πριν | ||
| - | |||
| - | <color red> | ||
| - | |||
| - | <WRAP center round tip 80%> | ||
| - | Προκειμένου να μπορέσουμε να παρακολουθήσουμε την υπερφόρτωση των τελεστών υπερφορτώνουμε τον τελεστή **=**. Η επεξήγηση της υπερφόρτωσης του τελεστή **=** θα δοθεί στη συνέχεια. | ||
| - | </ | ||
| - | |||
| - | <WRAP center round tip 80%> | ||
| - | Προσέξτε τη διαφορετική δήλωση της συνάρτησης υπερφόρτωσης ανάμεσα στους μοναδιαίους τελεστές αύξησης και μείωσης κατά ένα (%%++, --%%) όταν αυτοί εφαρμόζονται πριν και μετά το αντικείμενο (//prefix// και //postfix operators// | ||
| - | |||
| - | Το // | ||
| - | <code cpp> | ||
| - | Vector operator++(); | ||
| - | Vector operator--(); | ||
| - | </ | ||
| - | Στην περίπτωση δήλωσης του τελεστή μετά το αντικείμενο η δήλωση είναι | ||
| - | <code cpp> | ||
| - | Vector operator++(int a); | ||
| - | Vector operator--(int a); | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | <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; | ||
| - | friend Vector operator!(const Vector & | ||
| - | | ||
| - | 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 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 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 = " | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | <WRAP center round tip 80%> | ||
| - | Από τα παραπάνω παρατηρούμε τα εξής: | ||
| - | * Οι συναρτήσεις που δεν μεταβάλλουν το αντικείμενο στο οποίο εφαρμόζονται δηλώνονται ως **// | ||
| - | * Σε όλες τις περιπτώσεις επιστρέφεται ένα νέο αντικείμενο ανεξάρτητα εάν μεταβλήθηκε το αντικείμενο πάνω στο οποίο εφαρμόζεται ο τελεστής ή όχι. | ||
| - | </ | ||