Documente Academic
Documente Profesional
Documente Cultură
CURS 5 PROGRAMARE II
CURS ANTERIOR
Cuvntul cheie this Funcii prietene
Membri statici
Relaii ntre clase Asociere Agregare Compoziie Motenire
CUPRINS
Suprancrcarea operatoriilor Funcii membre Funcii prietene
Suprancrcarea operatoriilor
Asignare Binari Prescurtai Relaionali Incrementare/decrementare Indexare
Nu ne permit s schimbm nelesul operatoriilor cnd sunt aplicai asupra tipurilor de baz Nu ne permite definirea de noi simboluri pentru operatori
SUPRANCRCAREA OPERATORILOR
Similar cu suprancrcarea funciilor Numele funciei este nlocuit de cuvntul cheie operator urmat de simbolul operatorului Tipul de return reprezint tipul valori care va fi rezultatul operaiei
SUPRANCRCAREA OPERATORILOR
Exemplu Numerele complexe
Bun exemplu din cauza utilizri naturale cu aceast clas class complex { public: ... private: double _real; double _imag; };
SUPRANCRCAREA OPERATORILOR
Nu se poate modifica n-aritatea Asociativitatea Prioritatea Nu se pot utiliza valori implicite (default)
Operatorii pe bii
^, &, >>, <<
Operatorii logici
&&, ||, !
Operatorii relaionali
>, <, <=, >=, ==, !=
SINTAX
Definire funcie cu numele tip_returnat operator simbol (lista_de_parametri); simbol orice operator C++ cu excepia
. .* :: ?: sizeof
Operatori binari
Utilizare: a+b, c<=d
MODURI DE SUPRANCRCARE
Cum se mapeaz operatorii la funcii? Ex. utilizare a+b Soluii
MODURI DE SUPRANCRCARE
Ca funcii prietene ale clasei
complex operator + (const complex& a, const complex& b) { return complex(a._real+b._real, a._imag+b._imag); }
SUPRANCRCAREA OPERATORULUI =
n lipsa suprancrcri compilatorul genereaz o copiere membru cu membru a datelor clasei Comportament similar cu constructorul de copiere
Operatorul de atribuire trebuie s fie suprancrcat ca funcie membr, nu modific al doilea operand (ar trebuie s fie o referin constant)
Operatorul de asignare poate fi nlnuit, deci ar trebui s ntoarc o referin Modific obiectul curent, deci nu poate fi funcie non-membr
SUPRANCRCAREA OPERATORULUI =
class Student{ char * nume; Student & operator = (const Student &); //operator atribuire
};
Student & Student::operator = (const Student & s2) {
if (this == &s2)
return *this; //verificare autoreferinta if (nume) //stergere valoare existenta delete []nume; nume = new char[strlen(s2.nume)+1];
strcpy(nume, s2.nume);
return *this; }
SUPRANCRCAREA OPERATORULUI =
Observaie Dac o clas conine variabile membru de tip pointer urmtoarele funcii trebuie implementate
Constructor Constructor de copiere Destructor Suprancrcarea operatorului =
Utilizare
complex c1(7,9); cin >> c1; cout << c1 << endl;
out << Complex[ << c._real << + << c._imag << i];
return out; } istream &operator<<(istream &in, complex &c) { cout << Introduceti partea reala; in >> c._real; cout << Introduceti partea imaginara; in >> c._imag; return in; }
SUPRANCRCAREA OPERATORILOR + I +=
Pentru consisten dac suprancrcm operatorul + este bine s suprancrcm i operatorul +=
class complex{ public: friend complex operator+ (double &, const complex &); friend complex operator+ (const complex &, double &); friend complex operator+ (const complex &, const complex &); complex & operator += (double &); complex & operator += (const complex &); };
SUPRANCRCAREA OPERATORILOR + I +=
Pentru consisten dac suprancrcm operatorul + este bine s suprancrcm i operatorul +=
class complex{ public: friend complex operator+ (double &, const complex &); friend complex operator+ (const complex &, double &); friend complex operator+ (const complex &, const complex &); complex & operator += (double &); complex & operator += (const complex &); };
SUPRANCRCAREA OPERATORILOR + I +=
Pentru consisten dac suprancrcm operatorul + este bine s suprancrcm i operatorul +=
class complex{ public: friend complex operator+ (double &, const complex &); friend complex operator+ (const complex &, double &); friend complex operator+ (const complex &, const complex &); complex & operator += (double &); complex & operator += (const complex &); };
SUPRANCRCAREA OPERATORILOR + I +=
Pentru consisten dac suprancrcm operatorul + este bine s suprancrcm i operatorul +=
class complex{ public: friend complex operator+ (double &, const complex &); friend complex operator+ (const complex &, double &); friend complex operator+ (const complex &, const complex &); complex & operator += (double &); complex & operator += (const complex &); };
public:
friend bool operator< (double &, const complex &); friend bool operator< (const complex &, double &); friend bool operator< (const complex &, const complex &);
SUPRANCRCAREA OPERATORILOR ++ I - Operatorii ++ i -- pot fi utilizai n dou moduri prefixai i postfixai Recomandare Ar trebui definii ca funcii membre Prefixat Contor & Contor ::operator ++ () { .... //corp} Contor & Contor ::operator --() { .... //corp} Postfixat Contor & Contor ::operator ++ (int a) { .... //corp} Contor & Contor ::operator --(int a) { .... //corp}
SUPRANCRCAREA OPERATORULUI []
Recomandri Ar trebui suprancrcat ca funcie membr, primul operand ar trebui s fi un membru al clasei Pentru consistent al doilea operator ar trebui s fie de tip ntreg (transmis prin valoare) Deoarece starea obiectului nu se modific funcia ar trebui s fie constant Valoarea de return ar trebui s fie de tipul tabloului de elemente coninut de clas
SUPRANCRCAREA OPERATORULUI []
class string { char*str; int len; public: char & operator [] (int) const; }; char & string::operator [] (int index) const { return str[index];
CURS URMATOR
Conversii de tip Excepii