- •Programare orientată pe obiecte
- •§1. Principiile programării orientate pe obiecte.
- •§3. Constructori şi destructori.
- •8) Aceste mesaje apar după ce se termină lucrul programului.
- •§4. Operaţii de intrare/ieşire a informaţiei.
- •§5. Moştenire simplă.
- •§6. Moştenire multiplă
- •§7. Moştenirea pe mai multe niveluri. Clase virtuale
- •§9. Definirea şi utilizarea referinţelor
- •§10. Tablouri de obiecte. Pointeri şi referinţe la obiecte. Pointeri la membrii clasei
- •§11. Dirijarea dinamică a memoriei
- •§12. Constructor de copiere
- •§13. Funcţii prietene şi clase prietene
- •§14. Supraîncărcarea operatorilor
- •§15. Supraîncărcarea operatorilor prin funcţii prietene
- •§16. Supraîncărcarea unor operatori speciali
- •Operatorii de incrementare şi decrementare
- •Operatorii de inserţie şi extragere
- •Operatorul indice
- •Operatorul funcţie
- •Operatorii new şi delete
- •Operatorul virgulă
- •Operatorul de conversie
- •§17. Funcţii-şablon şi clase-şablon
- •§18. Realizarea conceptului de polimorfism
- •§19. Clase abstracte
- •§20. Membrii statici ai clasei
- •§23. Tratarea excepţiilor
- •Bibliografie
Operatorii de inserţie şi extragere
Supraîncărcarea operatorilor de inserţie (<<) şi extragere (>>) în cadrul unei clase permite ca operaţiile de afişare şi citire a obiectelor să fie efectuate într-un mod similar ca şi a datelor de tipuri predefinite, adică:
cout << nume_obiect;
sau, respectiv:
cin >> nume_obiect;
Supraîncărcarea operatorilor de inserţie (<<) şi extragere (>>) în cadrul unei clase poate fi realizată doar prin metoda funcţiilor prietene. Fiindcă aceşti operatori inter-acţionează cu fluxurile de intrare şi de ieşire, funcţiile care realizează supraîncărcarea au un parametru fictiv, care reprezintă un obiect de tip flux. Operatorul de inserţie << este supraîncărcat pentru tipurile de date predefinite în clasa ostream, iar operatorul de extragere >> este supraîncărcat pentru tipurile predefinite în clasa istream. De aceea parametrii fictivi care reprezintă obiectul de tip flux vor fi anume de aceste tipuri. Clasa în care are loc supraîncărcarea operatorilor de inserţie şi extragere va conţine următoarele prototipuri de funcţii:
class nume_cl
{
. . .
friend ostream & operator <<(ostream &nume_flux, nume_cl ob);
friend istream & operator >>(istream &nume_flux, nume_cl &ob);
. . .
}
Primul parametru fictiv al ambelor funcţii reprezintă fluxul de intrare sau de ieşire, el fiind transmis prin referinţă, fiindcă fluxul în procesul operaţiei de intrare sau de ieşire se schimbă şi această schimbare trebuie să fie vizibilă şi în exteriorul funcţiei. Al doilea parametru fictiv reprezintă obiectul, care va fi afişat sau care va fi iniţializat cu date citite de la dispozitive de intrare. Pentru ca valoarea obiectului schimbat în procesul iniţializării să fie vizibilă în exteriorul funcţiei în care se produce schimbarea, parametrul este transmis prin referinţă. În cazul afişării, obiectul este transmis prin valoare, fiindcă la afişare obiectul nu-şi schimbă valoarea. Ambele funcţii returnează referinţa la fluxul corespunzător prelucrat. Implementarea operatorilor va avea forma:
ostream & operator <<(ostream &nume_flux, nume_cl ob)
{
.
. // instructiuni
.
}
şi
istream & operator >> (istream &nume_flux, nume_cl &ob)
{
.
. // instructiuni
.
}
Vom supraîncărca aceşti operatori pentru clasa complex:
class complex
{
. . .
friend ostream & operator << (ostream &fluxIes, complex c);
friend istream & operator >> (istream &fluxIn, complex &c);
. . .
};
ostream & operator << (ostream & fluxIes, complex c)
{
if (c.i == 0)
fluxIes << a.r ;
else
if (c.r == 0)
fluxIes << c.i << "i" ;
else
fluxIes << c.r << setiosflags(ios::showpos)
<< c.i << "i"
<< resetiosflags(ios::showpos);
return fluxIes;
}
istream & operator >> (istream &fluxIn, complex &c)
{
fluxIn >> c.r ;
fluxIn >> c.i ;
return fluxIn;
}
