This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
cpp:vector_overloading_binary_operators [2017/05/05 12:55] gthanos |
cpp:vector_overloading_binary_operators [2021/05/24 06:42] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Υπερφόρτωση δυαδικών τελεστών που δεν μεταβάλλουν τον αριστερό τελεστέο (binary operators overloading) ===== | ||
| - | |||
| - | Παρακάτω θα δούμε την υπερφόρτωση τελεστών που δεν μεταβάλλουν τον αριστερό τελεστέο. Οι τελεστές περιγράφονται στον παρακάτω πίνακα. | ||
| - | |||
| - | ^ Τελεστής | ||
| - | | %%+%% | // | ||
| - | | %%-%% | // | ||
| - | | %%+%% | // | ||
| - | | %%+%% | // | ||
| - | | %%-%% | // | ||
| - | | %%*%% | // | ||
| - | | %%*%% | // | ||
| - | | %%/%% | // | ||
| - | | % | // | ||
| - | | %%<< | ||
| - | | %%>> | ||
| - | |||
| - | <WRAP center round info 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; | ||
| - | |||
| - | /* binary operators that don't modify left operand */ | ||
| - | void operator=(const Vector &v); | ||
| - | Vector operator+(const Vector &v) const; | ||
| - | //friend Vector operator+(const Vector &v1, const Vector v2); | ||
| - | Vector operator-(const Vector &v) const; | ||
| - | Vector operator+(int a) const; | ||
| - | friend Vector operator+(int a, const Vector &v); | ||
| - | Vector operator-(int a) const; | ||
| - | Vector operator*(int a) const; | ||
| - | friend Vector operator*(int a, const Vector &v); | ||
| - | Vector operator/ | ||
| - | Vector operator%(int a) const; | ||
| - | | ||
| - | Vector operator << (int a) const; | ||
| - | //friend Vector operator<< | ||
| - | Vector operator >> (int a) const; | ||
| - | //friend Vector operator>> | ||
| - | | ||
| - | }; | ||
| - | |||
| - | 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); | ||
| - | } | ||
| - | |||
| - | Vector Vector:: | ||
| - | int length; | ||
| - | if (size > v.length()) | ||
| - | length = size; | ||
| - | else | ||
| - | length = v.length(); | ||
| - | Vector n(length); | ||
| - | for(int i=0; i< | ||
| - | int sum = 0; | ||
| - | if(i< | ||
| - | sum += array[i]; | ||
| - | if(i< | ||
| - | sum += v.array[i]; | ||
| - | n.array[i] = sum; | ||
| - | } | ||
| - | return n; | ||
| - | } | ||
| - | |||
| - | /* | ||
| - | Vector operator+(const Vector &v1, const Vector v2) { | ||
| - | int length; | ||
| - | if (v1.size > v2.size) | ||
| - | length = v1.length(); | ||
| - | else | ||
| - | length = v2.length(); | ||
| - | Vector n(length); | ||
| - | for(int i=0; i< | ||
| - | int sum = 0; | ||
| - | if(i< | ||
| - | sum += v1.array[i]; | ||
| - | if(i< | ||
| - | sum += v2.array[i]; | ||
| - | n.array[i] = sum; | ||
| - | } | ||
| - | return n; | ||
| - | }*/ | ||
| - | |||
| - | Vector Vector:: | ||
| - | int length; | ||
| - | if (size > v.length()) | ||
| - | length = size; | ||
| - | else | ||
| - | length = v.length(); | ||
| - | Vector n(length); | ||
| - | for(int i=0; i< | ||
| - | int sum = 0; | ||
| - | if(i< | ||
| - | sum += array[i]; | ||
| - | if(i< | ||
| - | sum -= v.array[i]; | ||
| - | n.array[i] = sum; | ||
| - | } | ||
| - | return n; | ||
| - | } | ||
| - | |||
| - | Vector Vector:: | ||
| - | Vector n(size); | ||
| - | for(int i=0; i<size; i++) | ||
| - | n.array[i] = array[i] + a; | ||
| - | return n; | ||
| - | } | ||
| - | |||
| - | Vector operator+(int a, const Vector &v) { | ||
| - | Vector n(v); | ||
| - | for(int i=0; i< | ||
| - | n.array[i] += a; | ||
| - | } | ||
| - | return n; | ||
| - | } | ||
| - | |||
| - | Vector Vector:: | ||
| - | Vector n(size); | ||
| - | for(int i=0; i<size; i++) | ||
| - | n.array[i] = array[i] - a; | ||
| - | return n; | ||
| - | } | ||
| - | |||
| - | Vector Vector:: | ||
| - | Vector n(size); | ||
| - | for(int i=0; i<size; i++) | ||
| - | n.array[i] = array[i] * a; | ||
| - | return n; | ||
| - | } | ||
| - | |||
| - | Vector operator*(int a, const Vector &v) { | ||
| - | Vector n(v); | ||
| - | for(int i=0; i< | ||
| - | n.array[i] *= a; | ||
| - | } | ||
| - | return n; | ||
| - | } | ||
| - | |||
| - | Vector Vector:: | ||
| - | Vector n(size); | ||
| - | for(int i=0; i<size; i++) | ||
| - | n.array[i] = array[i] / a; | ||
| - | return n; | ||
| - | } | ||
| - | |||
| - | Vector Vector:: | ||
| - | Vector n(size); | ||
| - | for(int i=0; i<size; i++) | ||
| - | n.array[i] = array[i] % a; | ||
| - | return n; | ||
| - | } | ||
| - | /* | ||
| - | Vector operator<< | ||
| - | Vector n(v); | ||
| - | int *array_new = new (nothrow) int [n.size+1]; | ||
| - | if(array_new==NULL) { | ||
| - | cerr << " | ||
| - | exit(-1); | ||
| - | } | ||
| - | for(int i=0; i< | ||
| - | array_new[i] = n.array[i]; | ||
| - | array_new[n.size] = a; | ||
| - | n.size++; | ||
| - | delete [] n.array; | ||
| - | n.array = array_new; | ||
| - | return n; | ||
| - | }*/ | ||
| - | |||
| - | Vector Vector:: | ||
| - | Vector n(*this); | ||
| - | int *array_new = new (nothrow) int [n.size+1]; | ||
| - | if(array_new==NULL) { | ||
| - | cerr << " | ||
| - | exit(-1); | ||
| - | } | ||
| - | for(int i=0; i< | ||
| - | array_new[i] = n.array[i]; | ||
| - | array_new[n.size] = a; | ||
| - | n.size++; | ||
| - | delete [] n.array; | ||
| - | n.array = array_new; | ||
| - | return n; | ||
| - | } | ||
| - | |||
| - | /*Vector operator>> | ||
| - | int pos = v.find(a); | ||
| - | if(pos< | ||
| - | return v; | ||
| - | Vector n(v); | ||
| - | int *array_new = new (nothrow) int [n.size-1]; | ||
| - | if(array_new==NULL) { | ||
| - | cerr << " | ||
| - | exit(-1); | ||
| - | } | ||
| - | for(int i=0; i< | ||
| - | if(i< | ||
| - | array_new[i] = n.array[i]; | ||
| - | if(i==pos) | ||
| - | continue; | ||
| - | if(i> | ||
| - | array_new[i-1] = n.array[i]; | ||
| - | } | ||
| - | n.size--; | ||
| - | delete [] n.array; | ||
| - | n.array = array_new; | ||
| - | return n; | ||
| - | }*/ | ||
| - | |||
| - | Vector Vector:: | ||
| - | int pos = find(a); | ||
| - | if(pos< | ||
| - | return *this; | ||
| - | Vector n(*this); | ||
| - | int *array_new = new (nothrow) int [n.size-1]; | ||
| - | if(array_new==NULL) { | ||
| - | cerr << " | ||
| - | exit(-1); | ||
| - | } | ||
| - | for(int i=0; i< | ||
| - | if(i< | ||
| - | array_new[i] = n.array[i]; | ||
| - | if(i==pos) | ||
| - | continue; | ||
| - | if(i> | ||
| - | array_new[i-1] = n.array[i]; | ||
| - | } | ||
| - | n.size--; | ||
| - | delete [] n.array; | ||
| - | n.array = array_new; | ||
| - | return n; | ||
| - | } | ||
| - | |||
| - | |||
| - | 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); | ||
| - | | ||
| - | Vector f = v; | ||
| - | v.print(msg=" | ||
| - | Vector k; | ||
| - | k = f + v; | ||
| - | k.print(msg=" | ||
| - | k = f - v; | ||
| - | k.print(msg=" | ||
| - | k = f + 2; | ||
| - | k.print(msg=" | ||
| - | k = f - 2; | ||
| - | k.print(msg=" | ||
| - | k = f * 2; | ||
| - | k.print(msg=" | ||
| - | k = f / 2; | ||
| - | k.print(msg=" | ||
| - | k = f % 2; | ||
| - | k.print(msg=" | ||
| - | f = f << 7; | ||
| - | f.print(msg=" | ||
| - | f = f << 7; | ||
| - | f.print(msg=" | ||
| - | f = f >> 6; | ||
| - | f.print(msg=" | ||
| - | f = f >> 6; | ||
| - | f.print(msg=" | ||
| - | | ||
| - | } | ||
| - | </ | ||
| - | |||