Operatorul overloading
Clasa reala ostream defineste operatorul << pentru a-l face convenabil sa scrie diferite obiecte cu o singura instructiune.
Pentru a defini @, unde @ este o 242e418c rice operator C++ pentru un tip definit de utilizator, noi definim o functie numita operator@ care are argumente de tip corespunzator. De exemplu:
class ostream;
ostream ostream::operator<<(char* p)
defineste operatorul <<, ca membru al clasei ostream, asa ca s<<p se interpreteaza ca s.operator<<(p) cind s este un ostream si p este un pointer spre caractere. Operatorul << este binar, dar functia operator<<(char*) pare la prima vedere sa aiba un singur argument; el totusi are de asemenea argumentul standard implicit this.
Revenind din ostream ni se permite sa aplicam << la rezultatul unei operatii de iesire. De exemplu, s<<p<<q se interpreteaza (s.operator << (p) ) .operator << (q). Acesta este modul in care operatiile sint furnizate pentru tipuri predefinite.
Utilizind setul de operatii furnizate cu membri publici ai clasei ostream, noi putem acum defini << pentru tipuri utilizator cum ar fi cel complex, fara a modifica declaratia clasei ostream:
ostream operator<<(ostream s, complex z)
//un complex are doua parti: real si imaginar
// se scrie un complex ca (real, imag)
Intrucit operator<<(ostream, complex) nu este o functie membru, este necesar sa explicitam argumentele ca sa fie binare.
Se vor scrie valorile in ordine corecta caci <<, ca si majoritatea operatorilor C++ se grupeaza de la stinga la dreapta; adica a<<b<<c inseamna (a<<b)<<c.
Compilatorul cunoaste diferenta dintre functiile membru si nemembru cind interpreteaza operatorii. De exemplu, daca z este o variabila complexa, s<<z va fi expandata utilizind apelul functiei standard (nemembru) operator<<(s,z).
|