===== Υπερφόρτωση δυαδικών τελεστών μπορούν να υλοποιηθούν μόνο ως μέλη της κλάσης =====
Σε αυτή την ενότητα, θα δούμε παραδείγματα υπερφόρτωσης, τα οποία μεταβάλλουν τον αριστερό τελεστέο και μπορούν να υλοποιηθού __μόνο ως μέλη της κλάσης__.
^ Τελεστής ^ Αριστερός τελεστέος ^ Δεξιός τελεστέος ^ Περιγραφή (//>σε όλες τις συναρτήσεις υπερφόρτωσης επιστρέφεται μία αναφορά στον αριστερό τελεστέο//) ^
| %%=%% | //Vector// | //Vector// | Ο αριστερός τελεστέος γίνεται ίσος με τον δεξιό τελεστέο. Επιστρέφεται μία αναφορά στο τρέχον αντικείμενο. |
| %%[ ]%% | //Vector// | //int// | Επιστρέφει μία αναφορά στο **i**-στο στοιχείο του //Vector//, **i** η θέση που προσδιορίζεται από τον δεξιό τελεστή. |
| %%+=%% | //Vector// | //Vector// | Σε κάθε στοιχείο του αριστερού τελεστέου προστίθεται το αντίστοιχο στοιχείο του δεξιού τελεστέου. Επιστρέφεται μία αναφορά στο τρέχον αντικείμενο. |
| %%+=%% | //Vector// | //int// | Σε κάθε στοιχείο του αριστερού τελεστέου προστίθεται ο δεξιός τελεστέος |
| %%-=%% | //Vector// | //Vector// | Σε κάθε στοιχείο του αριστερού τελεστέου αφαιρείται το αντίστοιχο στοιχείο του δεξιού τελεστέου. Επιστρέφεται μία αναφορά στο τρέχον αντικείμενο. |
| %%-=%% | //Vector// | //int// | Σε κάθε στοιχείο του αριστερού τελεστέου αφαιρείται ο δεξιός τελεστέος. Επιστρέφεται μία αναφορά στο τρέχον αντικείμενο. |
| %%*=%% | //Vector// | //Vector// | Κάθε στοιχείο του αριστερού τελεστέου πολλαπλασιάζεται με το αντίστοιχο στοιχείο του δεξιού τελεστέου και το αποτέλεσμα αποθηκεύεται στο στοιχείο του αριστερού τελεστέου. Επιστρέφεται μία αναφορά στο τρέχον αντικείμενο. |
| %%*=%% | //Vector// | //int// | Κάθε στοιχείο του αριστερού τελεστέου πολλαπλασιάζεται με τον δεξιό τελεστέο και το αποτέλεσμα αποθηκεύεται στο στοιχείο του αριστερού τελεστέου. Επιστρέφεται μία αναφορά στο τρέχον αντικείμενο.|
| %%/=%% | //Vector// | //int// | Κάθε στοιχείο του αριστερού τελεστέου διαιρείται με τον δεξιό τελεστέο και το αποτέλεσμα της ακέραιας διαίρεσης αποθηκεύεται στο στοιχείο του αριστερού τελεστέου. Επιστρέφεται μία αναφορά στο τρέχον αντικείμενο. |
| %% %=%% | //Vector// | //int// | Κάθε στοιχείο του αριστερού τελεστέου διαιρείται με τον δεξιό τελεστέο και το υπόλοιπο της ακέραιας διαίρεσης αποθηκεύεται στο στοιχείο του αριστερού τελεστέου. Επιστρέφεται μία αναφορά στο τρέχον αντικείμενο. |
| %%<<=%% | //Vector// | //int// | Τα στοιχεία του αριστερού τελεστέου ολισθένουν αριστερά κατά τόσα bits όσα προσδιορίζει ο δεξιός τελεστέος. Επιστρέφεται μία αναφορά στο τρέχον αντικείμενο. |
| %%>>=%% | //Vector// | //int// | Τα στοιχεία του αριστερού τελεστέου ολισθένουν δεξιά κατά τόσα bits όσα προσδιορίζει ο δεξιός τελεστέος. Επιστρέφεται μία αναφορά στο τρέχον αντικείμενο.|
#include
#include
#include
using namespace std;
#ifndef _VECTOR_HPP_
#define _VECTOR_HPP_
class Vector {
int *array;
int size;
public:
Vector(int length=0);
Vector(const Vector& v);
Vector(const Vector *v);
~Vector();
int length() const; // return Vector's length.
int &valueAt(int pos) const; // return a reference to element at position pos
int find(int a) const; // check if a exists in Vector. Return it position >0 or -1
// if not element not found
void print() const; // print vector values to standard output
void print(string &msg) const; // print vector values to standard output
/* binary operators that don't modify left operand */
Vector operator+(const Vector& v) const;
Vector operator-(const Vector& v) const;
Vector operator*(Vector& v) const;
/* binary operators that modify left operand */
Vector& operator=(const Vector& v);
Vector& operator+=(const Vector& v);
Vector& operator+=(int a);
Vector& operator-=(const Vector& v);
Vector& operator-=(int a);
Vector& operator*=(const Vector& v);
Vector& operator*=(int a);
Vector& operator/=(int a);
Vector& operator%=(int a);
Vector& operator<<=(int a);
Vector& operator>>=(int a);
int &operator[](int a) const;
};
#endif
#include "Vector.hpp"
Vector::Vector(int length) {
size = length;
array = new (nothrow) int[size];
if(array==NULL) {
cerr << "Memory allocation failure!" << endl;
exit(-1);
}
for(int i=0; ilength();
array = new (nothrow) int[size];
if(array==NULL) {
cerr << "Memory allocation failure!" << endl;
exit(-1);
}
for(int i=0; ivalueAt(i);
}
Vector::~Vector() {
delete [] array;
}
int Vector::length() const {
return size;
}
int &Vector::valueAt(int pos) const {
if(pos>=length()) {
cerr << "Invalid access position!\n";
return array[size-1];
}
return array[pos];
}
int Vector::find(int a) const {
for(int i=0; i v.length())
length = size;
else
length = v.length();
Vector n(length);
for(int i=0; i v.length())
length = size;
else
length = v.length();
Vector n(length);
for(int i=0; i size) {
Vector n(v);
n = n + *this;
*this = n;
}
else {
*this = *this + v;
}
return *this;
}
Vector& Vector::operator+=(int a) {
for(int i=0; i size) {
Vector n(v);
n = n - *this;
*this = n;
}
else {
*this = *this - v;
}
return *this;
}
Vector& Vector::operator-=(int a) {
for(int i=0; i>=(int a) {
for(int i=0; i>= a;
return *this;
}
int &Vector::operator[](int pos) const {
return array[pos];
}
#include "Vector.hpp"
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 = "Vector v: ";
v.print(msg);
Vector f , g;
f = g = v;
f.print(msg="Vector f: ");
g.print(msg="Vector g: ");
g = f += v;
g.print(msg="g = f += v: ");
f -= v;
f.print(msg="f -= v: ");
f *= v;
f.print(msg="f *= v: ");
f = v;
f += 2;
f.print(msg="f += 2: ");
f -= 2;
f.print(msg="f -= 2: ");
f *= 2;
f.print(msg="f *= 2: ");
f /= 2;
f.print(msg="f /= 2: ");
f %= 2;
f.print(msg="f %= 2: ");
cout << "v[2]: " << v[2] << endl;
v[2] = 100;
v.print(msg="[v[2] = 100] v: ");
}