Sunteți pe pagina 1din 29

SUPRANCRCAREA OPERATORIILOR

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

CE ESTE SUPRANCRCAREA OPERATORILOR?


Suprancrcarea operatoriilor Permite definirea comportamentului operatorilor cnd sunt aplicai obiectelor unei clase Ce operatori trebui suprancrcai? Cei care au sens pentru noul tip de date definit Restricii?

CE ESTE SUPRANCRCAREA OPERATORILOR?


Suprancrcarea operatoriilor Permite definirea comportamentului operatorilor cnd sunt aplicai obiectelor unei clase Ce operatori trebui suprancrcai? Cei care au sens pentru noul tip de date definit Restricii?

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

Argumentele sunt 1 sau 2 operanzii n funcie de n-aritatea operatorului

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)

Observaii Nu este bine s modificm sensul operatoriilor


+ sa nu nsemne scdere

Oferim definii consistente


Dac + este definit, atunci i += ar trebui definit

CARE OPERATORI POT FI SUPRANCRCAI?


Aproape toi operatorii Aritmetici
+, -, *, /, %, ++, --

Operatorii pe bii
^, &, >>, <<

Operatorii logici
&&, ||, !

Operatorii relaionali
>, <, <=, >=, ==, !=

Operatorul de indexare, funcie, virgul


[], (), , , ->, ->*

Operatorul de atribuire i cei compui


=, ^=, |=, &=, +=, -=, *=, /=, %=, <<=, >>=,

Suprancrcai global de ctre compilator


new, delete, =, &, ->*, ->

SINTAX
Definire funcie cu numele tip_returnat operator simbol (lista_de_parametri); simbol orice operator C++ cu excepia
. .* :: ?: sizeof

Invocare funcii operator


Operatori unari
Utilizare: !a, ++b4

Operatori binari
Utilizare: a+b, c<=d

MODURI DE SUPRANCRCARE
Cum se mapeaz operatorii la funcii? Ex. utilizare a+b Soluii

Ca funcii prietene ale clasei


friend complex operator+ (const complex &a, const complex &b);

Ca funcii membre ale clasei


complex operator+ (const complex &otherObj) const;

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); }

Ca funcii membre ale clasei


complex complex::operator + (const complex& otherObj) const { return complex(_real+ otherObj._real, _imag+ otherObj._imag); }

OPERATORI SUPRANCRCAI N MOD UZUAL


Uni dintre operatori suprancrcai n mod uzual sunt <<, >> = <

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 =

SUPRANCRCAREA OPERATORILOR << I >>


Operatorii << i >> se suprancarc pentru a putea insera n fluxurile de ieire i extrage din fluxurile de intrare Biblioteca iostream suprascrie operaiile de scriere/citire pentru tipurile implicite Pentru noile tipuri de date definite de utilizatori acetia sunt responsabili cu suprascrierea lor Nu pot fi suprancrcai ca funcii membre, trebuie utilizate funcii non-membere, deoarece primul operand este un obiect de tipul ostream/istream i nu o referin la clas

SUPRANCRCAREA OPERATORILOR << I >>


ostream &operator<<(ostream &, const complex &);

istream &operator>> (istream &, complex &);


Valoare de return are aceai tip cu primul operand Primul operand pot fi obiecte cin sau cout Citirea modific al doilea operand

Utilizare
complex c1(7,9); cin >> c1; cout << c1 << endl;

SUPRANCRCAREA OPERATORILOR << I >>


Recomandare Nu introducei mesaje i formatare cnd suprancrcai operatorii << i >>
ostream &operator<<(ostream &out, const complex &c) {

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 &); };

complex operator+ (const complex &c1, const complex &c2) {


return complex(c1._real+c2._real, c1._imag+c2._imag); } complex& complex ::operator+= (const complex &c) { _real += c._real; _imag += c._imag; return *this; }

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 &); };

Cum arata suprancrcarea operatorului egal folosind funcii membre?

complex operator+ (const complex &c1, const complex &c2) {


return complex(c1._real+c2._real, c1._imag+c2._imag); } complex& complex ::operator+= (const complex &c) { _real += c._real; _imag += c._imag; return *this; }

complex& operator+= (const complex &c) { return *this = *this + s2; }

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 &); };

complex operator+ (const complex &c1, const complex &c2) {


return complex(c1._real+c2._real, c1._imag+c2._imag); } complex& complex ::operator+= (const complex &c) { _real += c._real; _imag += c._imag; return *this; }

complex complex::operator+ (const complex &c2) const { return complex(_real+c2._real, _imag+c2._imag); }

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 &); };

Funcia este constanta pentru a nu modifica valoarea obiectului curent

complex operator+ (const complex &c1, const complex &c2) {


return complex(c1._real+c2._real, c1._imag+c2._imag); } complex& complex ::operator+= (const complex &c) { _real += c._real; _imag += c._imag; return *this; }

complex complex::operator+ (const complex &c2) const { return complex(_real+c2._real, _imag+c2._imag); }

SUPRANCRCAREA OPERATORILOR RELAIONALI


Recomandare Suprancrcai ca funcii non-membre, deoarece primul operand ar putea fi o valoare de tip diferit fa de clas Valorile operanzilor nu se modific, deci ar trebui s fie referine constante Valoarea de return ar trebui s fie de tip bool Dac sunt specificaii ca funcii membre, ele trebuie s fie constante

SUPRANCRCAREA OPERATORILOR RELAIONALI


class complex{

public:
friend bool operator< (double &, const complex &); friend bool operator< (const complex &, double &); friend bool operator< (const complex &, const complex &);

friend bool operator== (double &, const complex &);


friend bool operator== (const complex &, double &); friend bool operator== (const complex &, const complex &); }; bool operator< (const complex &c1, const complex &c2) { return (modul(c1)<modul(c2)); }

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

S-ar putea să vă placă și

  • Curs 11
    Curs 11
    Document35 pagini
    Curs 11
    _SirGod_
    Încă nu există evaluări
  • Curs 13
    Curs 13
    Document22 pagini
    Curs 13
    _SirGod_
    Încă nu există evaluări
  • Curs 12
    Curs 12
    Document25 pagini
    Curs 12
    _SirGod_
    Încă nu există evaluări
  • Curs 10
    Curs 10
    Document23 pagini
    Curs 10
    _SirGod_
    Încă nu există evaluări
  • Curs 08
    Curs 08
    Document32 pagini
    Curs 08
    _SirGod_
    Încă nu există evaluări
  • Curs 09
    Curs 09
    Document17 pagini
    Curs 09
    _SirGod_
    Încă nu există evaluări
  • Curs 06
    Curs 06
    Document27 pagini
    Curs 06
    _SirGod_
    Încă nu există evaluări
  • Top Down
    Top Down
    Document4 pagini
    Top Down
    c1872524
    Încă nu există evaluări
  • Capitolul Nr8
    Capitolul Nr8
    Document8 pagini
    Capitolul Nr8
    _SirGod_
    Încă nu există evaluări
  • Curs 04
    Curs 04
    Document27 pagini
    Curs 04
    _SirGod_
    Încă nu există evaluări
  • pII Curs1
    pII Curs1
    Document34 pagini
    pII Curs1
    Nanu
    Încă nu există evaluări
  • Curs 02
    Curs 02
    Document33 pagini
    Curs 02
    _SirGod_
    Încă nu există evaluări
  • Curs 03
    Curs 03
    Document32 pagini
    Curs 03
    _SirGod_
    Încă nu există evaluări
  • Curs de Geometrie
    Curs de Geometrie
    Document99 pagini
    Curs de Geometrie
    mary
    100% (3)
  • Limbaje Formale
    Limbaje Formale
    Document110 pagini
    Limbaje Formale
    Andrei Manescu
    Încă nu există evaluări
  • Capitolul Nr11
    Capitolul Nr11
    Document23 pagini
    Capitolul Nr11
    _SirGod_
    Încă nu există evaluări
  • Capitolul Nr10
    Capitolul Nr10
    Document24 pagini
    Capitolul Nr10
    _SirGod_
    Încă nu există evaluări
  • Capitolul Nr7
    Capitolul Nr7
    Document22 pagini
    Capitolul Nr7
    _SirGod_
    Încă nu există evaluări
  • Capitolul Nr9
    Capitolul Nr9
    Document13 pagini
    Capitolul Nr9
    _SirGod_
    Încă nu există evaluări
  • Arhitectura Calculatoarelor Bibliografie
    Arhitectura Calculatoarelor Bibliografie
    Document3 pagini
    Arhitectura Calculatoarelor Bibliografie
    _SirGod_
    Încă nu există evaluări
  • Capitolul Nr6
    Capitolul Nr6
    Document19 pagini
    Capitolul Nr6
    _SirGod_
    Încă nu există evaluări
  • Capitolul Nr5
    Capitolul Nr5
    Document18 pagini
    Capitolul Nr5
    _SirGod_
    Încă nu există evaluări
  • Suport de Curs - Comunicare
    Suport de Curs - Comunicare
    Document9 pagini
    Suport de Curs - Comunicare
    f1784748
    Încă nu există evaluări