====== Υπερφόρτωση μοναδιαίων τελεστών (unary operators) ======
Ο παρακάτω πίνακας περιγράφει την υπερφόρτωση των τελεστών στο παράδειγμα της κλάσης //Vector// που ακολουθεί.
^ Τελεστής ^ Θέση (πριν ή μετά το αντικείμενο) ^ Περιγραφή ^ Μεταβάλει το αντικείμενο* ^ Φιλική συνάρτηση ^
| %%+%% | Πριν | Επιστρέφει το άθροισμα των στοιχείων του αντικειμένου. | Όχι | Όχι |
| %%-%% | Πριν | Επιστρέφει ένα νέο αντικείμενο τα στοιχεία του οποίου έχουν αντεστραμμένο πρόσημο σε σχέση με το αντικείμενο που εφαρμόζεται. | Όχι | Όχι |
| %%++%% | Πριν | Επιστρέφει μία αναφορά στο τρέχον αντικείμενο, τα στοιχεία του οποίου έχουν αυξηθεί κατά ένα. | Ναι | Όχι |
| %%--%% | Πριν | Επιστρέφει μία αναφορά στο αντικείμενο που περνιέται ως 1η παράμετρος στη φιλική συνάρτηση (δηλαδή το τρέχον αντικείμενο), τα στοιχεία του οποίου έχουν μειωθεί κατά ένα. | Ναι | Ναι |
| %%++%% | Μετά | Επιστρέφει ένα νέο αντικείμενο, που είναι αντίγραφο του αντικειμένου στο οποίο εφαρμόζεται ο τελεστής, πριν την πράξη της αύξησης. Το αντικείμενο στο οποίο εφαρμόζεται ο τελεστής αυξάνει τις τιμές των στοιχείων του κατά 1. | Ναι | Όχι |
| %%--%% | Μετά | Επιστρέφει ένα νέο αντικείμενο, που είναι αντίγραφο του αντικειμένου στο οποίο εφαρμόζεται ο τελεστής, πριν την πράξη της μείωσης. Το αντικείμενο στο οποίο εφαρμόζεται ο τελεστής μειώνει τις τιμές των στοιχείων του κατά 1. | Ναι | Ναι |
| %%*%% | Πριν | Επιστρέφει έναν ακέραιο που αποτελεί το γινόμενο των στοιχείων του πίνακα. | Όχι | Όχι |
| %%!%% | Πριν | Επιστρέφει ένα νέο αντικείμενο τα στοιχεία του οποίου έχουν αντίστροφη σειρά σε σχέση με το αντικείμενο που εφαρμόζεται. | Όχι | Ναι |
| %%~%% | Πριν | Επιστρέφει ένα νέο αντικείμενο τα στοιχεία του οποίου αποτελούν το //binary NOT// των στοιχείων του αντικειμένου στο οποίο εφαρμόζεται. | Όχι | Όχι |
* **στο οποίο εφαρμόζεται**.
Προκειμένου να μπορέσουμε να παρακολουθήσουμε την υπερφόρτωση των τελεστών υπερφορτώνουμε τον τελεστή **=**. Η επεξήγηση της υπερφόρτωσης του τελεστή **=** θα δοθεί στη συνέχεια.
Προσέξτε τη διαφορετική δήλωση της συνάρτησης υπερφόρτωσης ανάμεσα στους μοναδιαίους τελεστές αύξησης και μείωσης κατά ένα (%%++, --%%) όταν αυτοί εφαρμόζονται πριν και μετά το αντικείμενο (//prefix// και //postfix operators//)
Το //prototype// της συνάρτησης υπερφόρτωσης στην περίπτωση του prefix και postfix increment/decrement τελεστή έχει ως εξής. Στην περίπτωση δήλωσης του τελεστή πριν το αντικείμενο η δήλωση είναι
Vector operator++();
Vector operator--();
Στην περίπτωση δήλωσης του τελεστή μετά το αντικείμενο η δήλωση είναι
Vector operator++(int a);
Vector operator--(int a);
Επίσης, παρατηρήστε ότι οι συναρτήσεις που δεν μεταβάλλουν το αντικείμενο στο οποίο εφαρμόζονται δηλώνονται ως **//const//**. Για παράδειγμα, η συνάρτηση
Vector operator~() const;
επιστρέφει ένα νέο αντικείμενο του οποίου τα στοιχεία είναι το binary NOT του αρχικού. Ο αρχικός πίνακας παραμένει αμετάβλητος.
#include
#include
#include
using namespace std;
#ifndef _VECTOR_HPP_
#define _VECTOR_HPP_
class Vector {
int *array;
int size;
public:
Vector(unsigned int length=0);
Vector(const Vector &v);
Vector(const Vector *v);
~Vector();
unsigned int length() const; // return Vector's length.
int& valueAt(unsigned int pos); // return a reference to element at position pos
int find(int a) const; // check if 'a' exists in Vector. Return the position
// If found, return the position of the element.
// Otherwise, return -1
void print() const; // print to standard output vector values
void print(string &msg) const; // print to standard output msg and vector values
Vector& operator=(const Vector &v);
int operator+() const; // returns the sum of Vector elements
friend int operator*(const Vector&) ; // returns the product of Vector elements
Vector operator-() const; // returns a new Vector, containing the negative
// values of the original vector.
Vector& operator++(); // prefix increment. Returns reference to the existing vector.
friend Vector& operator--(Vector&); // prefix decrement. Returns reference to the existing vector.
Vector operator++(int ); // postfix increment. Returns a new Vector.
friend Vector operator--(Vector&, int); // postfix decrement. Returns a new Vector.
Vector operator~() const; // returns the binary NOT for each element in a new Vector
friend Vector operator!(const Vector &v); // returns a copy of the Vector with
// elements in inverted sequence.
};
#endif
#include "Vector.hpp"
Vector::Vector(unsigned 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; iarray[i];
}
Vector::~Vector() {
delete [] array;
}
unsigned int Vector::length() const {
return size;
}
int& Vector::valueAt(unsigned int pos) {
if(pos>=length()) {
cerr << "Invalid position!\n";
return array[size-1];
}
return array[pos];
}
int Vector::find(int a) const {
for(int i=0; i
#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 = "Initial Vector: ";
v.print(msg);
cout << "+v: " << +v << endl;
Vector f = -v;
f.print(msg="f = -v: "); cout << endl;
cout << "*v: " << *v << endl;
f = !v;
f.print(msg = "f = !v: "); cout << endl;
cout << "~2: "<< ~2 << " | ~3: "<< ~3 << " | ~4: "<< ~4 << endl;
f = ~v;
f.print(msg = "f = ~v: "); cout << endl;
f = ++v;
f.print(msg = "f = ++v: ");
v.print(msg = "v: ");
f = --v;
f.print(msg = "f = --v: ");
v.print(msg = "v: ");
cout << endl;
f = v++;
f.print(msg = "f = v++: ");
v.print(msg = "v: ");
f = v--;
f.print(msg = "f = v--: ");
v.print(msg = "v: ");
}