Operatorii de incrementare (++) și decrementare (--) sunt unari, deoarece se aplică la un singur operand. Ei sunt totuși speciali, deoarece:
- pot fi prefixați (
++ X) sau postfixați (X ++); - efectul este modificare obiectului curent (de exemplul mărirea cu
1sau altă modificare, în funcție de specificul clasei pentru care îi definim); - rezultatul diferă:
- pentru operatorul prefixat, rezultatul este obiectul curent, după modificare;
- pentru operatorul postfixat, rezultatul este o copie a obiectului curent, înainte de modificare.
Implementarea se realizează astfel, ca metodă:
- pentru operatorul prefixat se utilizează o metodă fără parametri, care modifică obiectul curent și returnează o referință la acesta;
- pentru operatorul postfixat se utilizează, prin convenție, o metodă cu un parametru, de tip
int; metoda modifică obiectul curent și returnează o copie a acestuia, realizață înainte de modificare.
Programul de mai jos supraîncarcă operatorii de preincrementare și postincrementare pentru clasa Fracție. Operațiile de decrementare se pot realiza similar.
#include <iostream>
using namespace std;
class Fractie{
private:
int numarator, numitor;
public:
Fractie(int a = 0, int b = 1) /// constructor
{
if(b < 0)
a = -a, b = -b;
numarator = a, numitor = b;
}
friend ostream & operator << (ostream & out , const Fractie & F)
{
out << F.numarator << "/" << F.numitor;
return out;
}
// incrementare prefixata
Fractie & operator ++()
{
numarator += numitor;
return * this;
}
// incrementare postfixata
Fractie operator ++(int)
{
Fractie tmp = Fractie(numarator , numitor);
numarator += numitor;
return tmp;
}
};
int main(){
Fractie X , Y;
Y = Fractie(1 , 2);
X = Y ++;
cout << X << " " << Y << endl; // 1/2 3/2
Y = Fractie(1 , 2);
X = ++ Y;
cout << X << " " << Y << endl; // 3/2 3/2
return 0;
}
Observație: Operatorii ++ și -- pot fi implemntați și ca funcții prietene. Exemplu:
#include <iostream>
using namespace std;
class Fractie{
private:
int numarator, numitor;
public:
Fractie(int a = 0, int b = 1) /// constructor
{
if(b < 0)
a = -a, b = -b;
numarator = a, numitor = b;
}
friend ostream & operator << (ostream & out , const Fractie & F)
{
out << F.numarator << "/" << F.numitor;
return out;
}
// incrementare prefixata
friend Fractie & operator ++(Fractie & F)
{
F.numarator += F.numitor;
return F;
}
// incrementare postfixata
friend Fractie operator ++(Fractie & F, int)
{
Fractie tmp = Fractie(F.numarator , F.numitor);
F.numarator += F.numitor;
return tmp;
}
};
int main(){
Fractie X , Y;
Y = Fractie(1 , 2);
X = Y ++;
cout << X << " " << Y << endl; // 1/2 3/2
Y = Fractie(1 , 2);
X = ++ Y;
cout << X << " " << Y << endl; // 3/2 3/2
return 0;
}
In cazul implementării prin funcții prietene, parametrul obiect trebuie tranmis prin referință, pentru a se întoarce din funcție modificat.