// 6.2: overloading (metodo e funzioni)
#include <iostream>
using namespace std;
class Prova {
private:
int dato;
public:
// metodi per l'accesso a dato
int get_dato() { return dato; };
void set_dato(int ndato) { dato = ndato; };
// overloading degli operatori
const Prova &operator<<(int op) {
cout << "Invocato operator<< metodo\n";
dato += op;
}
const Prova operator+(int a) {
Prova r(*this);
cout << "Invocato operator+ metodo\n";
r.dato += a;
return r;
}
const Prova operator+=(int a) {
Prova r(*this);
cout << "Invocato operator+= metodo\n";
r.dato += a;
return r;
}
Prova()
: dato(0) { };
};
const Prova operator+(int op, const Prova &a) {
Prova r(a);
cout << "Invocato operator+ funzione\n";
r.set_dato(r.get_dato() + op);
return r;
}
int main() {
Prova a, b;
a << 3;
b = a + 1;
b = 1 + b; // invoca la funzione operator+(int, Prova)
b = b + 1; // invoca il metodo Prova::operator+(int)
b += 1; // invoca il metodo Prova::operator+=(int)
cout << "a.dato vale " << a.get_dato() << endl;
cout << "b.dato vale " << b.get_dato() << endl;
}