Professional Documents
Culture Documents
Obiective:
Supraîncărcarea operatorilor (operator overloading)
Exemple
1
Mihai TOGAN
Sunt facilităţi puse la dispoziţie de limbajele OOP. Pot fi realizate folosind următoarele
mecanisme:
Supraîncărcarea funcțiilor
o funcții cu acelaşi nume dar cu parametrii și funcționalitate diferită.
Supraîncărcarea operatorilor (standard)
o operatori cu acelaşi nume, dar cu operanzi (parametrii) și funcționalitate probabil
diferită.
Supraîncărcarea operatorilor
Extinderea unui operator pentru a putea lucra cu tipuri de operanzi definiţi de utilizator
(clase, structuri).
La nivelul unei clase/structuri utilizatorul poate defini un operator care să implementeze o
operaţie asupra unui obiect din acea clasă.
Nu pot fi definiți (supraîncărcaţi) decât operatorii standard (built-in).
Exemplu:
#include <iostream>
using namespace std;
class Complex {
public:
Complex(double re,double im) :real(re),imag(im) {};
void print() {printf ("(%lf, %lf)", real, imag);}
private:
double real;
double imag;
};
/****************************************************************************/
void main ()
{
Complex a(1.2,1.3);
Complex b(2.1,3);
a.print();cout << " + "; b.print(); cout << " = "; c.print();
cout << endl;
}
/*****************************************************************************/
2
Mihai TOGAN
Fără această facilitate, am fi putut rezolva operaţia de adunare de două numere complexe
definind o funcție dedicată la nivelul clasei Complex:
Complex c = a.Add(b);
Observaţie: singura diferenţă între cele două abordări este cea de claritate a secvenţelor de
cod. Este mult mai intuitiv și mai lizibil utilizarea operatorului „+” ȋn această situaţie.
/*************************************************************************/
void main ()
{
Complex a(1.2,1.3);
Complex d = a + 2;
d.print();
}
/*************************************************************************/
Operatorii işi păstrează întotdeauna tipul (operator unar, binar, etc.) și precedenţa.
Operatorul de scop „::” și cel de selectare de membrii „ .” nu pot fi supraîncărcaţi.
Toţi operatorii, cu excepţia operatorului de atribuire „=”, se moştenesc.
3
Mihai TOGAN
Secvenţa următoare de cod prezintă un exemplu de supraîncărcare pentru operatorul de
asignare „=”
class Complex
{
public:
//..
Complex& operator= (const Complex& C);
};
return *this;
}
/***************************************************************************/
void main ()
{
Complex a(1.2,1.3);
// ATENTIE !!
Complex d = a; //aici, este invocat constructorul de copiere și nu operatorul =
}
/***************************************************************************/
Observaţie: operatorul se putea declara și defini fără a se utiliza referinţa la tipul de return al
funcţiei (discuţie în sală):
class Complex {
//..
Complex operator= (const Complex& C);
};
private:
double real;
double imag;
/****************************************************************************/
void main ()
{
Complex a(1.2,1.3);
Complex b(2.1,3);
Complex c = a + b;
a.print();cout << " + "; b.print(); cout << " = "; c.print();
Complex d = a + 2;
d.print();
}
/****************************************************************************/
Există situaţii când numai aşa putem obţine un caz particular de supraîncărcare a unui
operator.
Exemplu: în cazul în care dorim să putem realiza operaţia de mai sus păstrând proprietatea
de comutativitate specifică operatorului „+” :
Complex d = 2 + a;
Ȋn acest caz, singura variantă de implementare este cea bazată pe funcții friend:
/****************************************************************************/
class Complex
{
public:
Complex operator+ (const Complex& C);
Complex operator+ (int k);
5
Mihai TOGAN
/****************************************************************************/
void main ()
{
Complex a(1.2,1.3);
Complex d = 2 + a;
d.print();
}
/****************************************************************************/
/****************************************************************************/
void main ()
{
Complex a(1.2,1.3);
Complex b(2.1,3);
cout<<a<<b;
cin>> b;
cout << b;
}
/****************************************************************************/