cpp:vector_overloading
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
cpp:vector_overloading [2017/05/04 13:32] – [Μοναδιαίοι τελεστές (unary operators)] gthanos | cpp:vector_overloading [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 | ||
---|---|---|---|
Line 2: | Line 2: | ||
Ας υποθέσουμε ότι έχουμε την παρακάτω κλάση //Vector// η οποία υλοποιεί ένα μονοδιάστατο πίνακα από ακεραίους. | Ας υποθέσουμε ότι έχουμε την παρακάτω κλάση //Vector// η οποία υλοποιεί ένα μονοδιάστατο πίνακα από ακεραίους. | ||
- | <code cpp Vector.cpp> | + | <code cpp Vector.hpp> |
#include < | #include < | ||
#include < | #include < | ||
using namespace std; | using namespace std; | ||
+ | |||
+ | #ifndef _VECTOR_HPP_ | ||
+ | #define _VECTOR_HPP_ | ||
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 27: | ||
}; | }; | ||
- | Vector:: | + | #endif |
- | 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 << ", "; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | 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; | + | |
- | } | + | |
</ | </ | ||
- | |||
- | |||
- | Για την παραπάνω κλάση κλάση //Vector// θέλουμε να υπερφορτώσουμε τους τελεστές ανά κατηγορία ως εξής: | ||
- | |||
- | ===== Μοναδιαίοι τελεστές (unary operators) ===== | ||
- | |||
- | ^ Τελεστής | ||
- | | %%+%% | Πριν | ||
- | | %%-%% | Πριν | ||
- | | %%++%% | ||
- | | %%--%% | ||
- | | %%++%% | ||
- | | %%--%% | ||
- | | %%*%% | Πριν | ||
- | | %%!%% | Πριν | ||
- | | %%~%% | Πριν | ||
- | |||
- | <color red> | ||
- | |||
- | <WRAP center round tip 80%> | ||
- | Προκειμένου να μπορέσουμε να παρακολουθήσουμε την υπερφόρτωση των τελεστών υπερφορτώνουμε τον τελεστή %%=%%. Η επεξήγηση της υπερφόρτωσης του τελεστή = θα δοθεί στη συνέχεια. | ||
- | </ | ||
- | |||
- | <WRAP center round tip 80%> | ||
- | Προσέξτε τη διαφορετική συμπεριφορά ανάμεσα στους μοναδιαίους τελεστές αύξησης και μείωσης κατά ένα (%%++, --%%) όταν αυτοί εφαρμόζονται πριν και μετά το αντικείμενο. | ||
- | </ | ||
<code cpp Vector.cpp> | <code cpp Vector.cpp> | ||
- | # | + | # |
- | #include < | + | Vector:: |
- | #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; | size = length; | ||
array = new (nothrow) int[size]; | array = new (nothrow) int[size]; | ||
Line 196: | Line 69: | ||
} | } | ||
- | unsigned | + | int Vector:: |
return size; | return size; | ||
} | } | ||
- | int & | + | int & |
if(pos> | if(pos> | ||
cerr << " | cerr << " | ||
Line 224: | Line 97: | ||
} | } | ||
} | } | ||
+ | </ | ||
- | void Vector:: | + | <code cpp VectorUsage.cpp> |
- | cout << msg; | + | # |
- | | + | |
- | 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; | + | |
- | } | + | |
- | + | ||
- | Vector Vector:: | + | |
- | for(int i=0; i<size; i++) { | + | |
- | array[i]++; | + | |
- | } | + | |
- | Vector v(this); | + | |
- | return v; | + | |
- | } | + | |
- | + | ||
- | 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; | + | |
- | } | + | |
- | + | ||
- | Vector Vector:: | + | |
- | Vector v(this); | + | |
- | for(int i=0; i<size; i++) { | + | |
- | array[i]++; | + | |
- | } | + | |
- | return v; | + | |
- | } | + | |
- | + | ||
- | Vector Vector:: | + | |
- | Vector v(this); | + | |
- | for(int i=0; i<size; i++) { | + | |
- | array[i]--; | + | |
- | } | + | |
- | return v; | + | |
- | } | + | |
- | + | ||
int main() { | int main() { | ||
Vector v(5); | Vector v(5); | ||
v.valueAt(0) = 2; v.valueAt(1) = 3; | v.valueAt(0) = 2; v.valueAt(1) = 3; | ||
v.valueAt(2) = 4; v.valueAt(3) = 5; v.valueAt(4) = 6; | v.valueAt(2) = 4; v.valueAt(3) = 5; v.valueAt(4) = 6; | ||
- | | + | cout << "value 5 at position: " << v.find(5) << endl; |
- | string msg = " | + | cout << "value 10 at position: " << v.find(10) << endl; |
- | + | v.print(); | |
- | v.print(msg); | + | |
- | int sum = +v; | + | |
- | | + | |
- | + | ||
- | Vector f = -v; | + | |
- | f.print(msg=" | + | |
- | int product = *v; | + | |
- | cout << "Product of elements: " << | + | |
- | + | ||
- | 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 = " | + | |
} | } | ||
</ | </ | ||
+ | |||
+ | Για την παραπάνω κλάση κλάση //Vector// θέλουμε να υπερφορτώσουμε τους τελεστές ανά κατηγορία ως εξής: | ||
+ | * [[cpp: | ||
+ | * [[cpp: | ||
+ | * [[cpp: | ||
cpp/vector_overloading.1493904744.txt.gz · Last modified: 2017/05/04 12:32 (external edit)