- •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
§16. Supraîncărcarea unor operatori speciali
Pe lângă operatori tradiţionali, cum ar fi, de exemplu, +, -, *, / pot fi supraîncărcaţi şi o serie de operatori speciali unii având şi anumite particularităţi.
Operatorii de incrementare şi decrementare
Făcând referinţă la operatorii de incrementare şi decrementare, trebuie de ţinut cont că fiecare dintre ei are două forme: prefix (++i sau --i) şi postfix (i++ sau i--). De aceea, dacă se doreşte o utilizare flexibilă a acestor operatori, este necesar de a supraîncărca atât forma prefix, cât şi forma postfix. Aceşti operatori pot fi supraîncărcaţi prin ambele metode: prin funcţii membre şi prin funcţii prietene. Deoarece operatorii sunt unari, rezultă că funcţiile care realizează supraîncărcarea fie că nu au parametri fictivi pentru metoda funcţiilor membre, fie au un parametru fictiv pentru metoda funcţiilor prietene. Pentru a obţine supraîncărcare şi pentru cealaltă formă, funcţia care realizează supraîncărcarea va fi dotată cu un parametru formal ne-utilizabil. Deci, vorbind despre supraîncărcarea operatorului de incrementare prin metoda funcţiilor membre, într-o clasă oarecare vor exista descrise prototipurile:
class nume_cl
{
. . .
tip_r operator ++ (); // forma prefix
tip_r operator ++ (int i); // forma postfix
. . .
};
Într-un mod similar va fi făcută descrierea pentru operatorul de decrementare, dacă este necesar acest lucru.
Pentru clasa concretă complex, vor fi următoarele prototipuri:
class complex
{
. . .
complex operator ++ ();
complex operator ++ (int i);
. . .
};
Prototipurilor acestea le corespund următoarele funcţii membre, care sunt incluse în descrierea clasei complex:
- forma prefix:
complex complex :: operator ++()
{
r++;
return *this;
}
- forma postfix:
complex complex :: operator ++(int i)
{
complex a= *this;
r++ ;
return a;
}
La supraîncărcarea operatorului de incrementare prin metoda funcţiilor prietene, într-o clasă oarecare vor exista descrise prototipurile:
class nume_cl
{
. . .
// forma prefix
friend tip_r operator ++ (nume_cl &ob);
// forma postfix
friend tip_r operator ++ (nume_cl &ob, int i);
. . .
};
Întrucât operatorul de incrementare schimbă obiectul asupra căruia acţionează, parametrii fictivi de tip obiect sunt transmişi prin referinţă, pentru ca transformarea lor în cadrul funcţiei să fie vizibilă şi în exteriorul funcţiei.
Cu referire la clasa complex, pot fi făcute următoarele descrieri:
- descrierea prototipurilor:
class complex
{
. . .
friend complex operator ++(complex &c);
friend complex operator ++(complex &c, int i);
. . .
};
- forma prefix:
complex operator ++(complex &c)
{
c.r++;
return c;
}
- forma postfix:
complex operator ++(complex &c, int i)
{
complex a = c;
c.r++;
return a;
}
Supraîncărcarea operatorului de decrementare se realizează într-un mod similar.
