Professional Documents
Culture Documents
Preklapanje operatora
pogodno je da se operacije mogu predstaviti standardnim operatorima na primer: Complex c1(1,2),c2(3,4),c3; c3=c1+c2; defini u se nova zna enja operatora za korisni ke tipove (klase) princip je sli an kao kod preklapanja imena funkcija
Preklopljeni operatori za klasne tipove su specijalne operatorske funkcije Operatorske funkcije nose ime operator@
Operatorske funkcije preklapaju standaradne operatore (+, -, *, /, ...) Pozivanje operatorskih funkcija u izrazima
Preklapanje operatora
30.10.2005.
Preklapanje operatora
30.10.2005.
ne mogu da se preklope operatori: ., .*, ::, ?:, sizeof i throw dok svi ostali mogu ne mogu da se redefini u zna enja operatora za primitivne (standardne) tipove podataka ne mogu da se uvode novi simboli za operatore ne mogu da se menjaju osobine operatora: n-arnost, prioritet i asocijativnost neki operatori imaju posebna ograni enja za preklapanje: new, delete, i++, i--, =, (), [], ->, (tip)
Preklapanje operatora
30.10.2005.
metode
kod kojih je skrivreni argument levi (za binarne) ili jedini (za unarne) operand po prirodi stvari, levi operand mora biti tipa klase ija je metoda lanica kod kojih je bar jedan argument tipa date klase
= (dodela vrednosti), & (uzimanje adrese), .(pristup lanu), , (lan anje) sve dok ih korisnik ne redefini e (osim .), oni imaju podrazumevano zna enje * (indirektno adresiranje), -> (posredan pristup lanu), [] (indeksiranje) sve dok ih korisnik ne redefini e, i oni imaju podrazumevano zna enje
Vrednosti operatorskih funkcija mogu da budu bilo kog tipa, pa i void Ako se simbol operatora sastoji od slova (npr. new), mora se pisati odvojeno od klju ne re i operator Operatorske f-je ne mogu da imaju podrazumevane vrednosti argumenata
Preklapanje operatora 30.10.2005.
Bo ni efekti koji postoje kod operatora za primitivne tipove ne podrazumevaju se za preklopljene operatore
operatora ++ i - (prefiksnih i postfiksnih) svih operatora dodele (=, +=, -=, *=, ...)
Veze koje postoje izme u operatora za primitivne tipove ne podrazumevaju se za preklopljene operatore
na primer, ako je definisan operator+, a+=b ne zna i automatski a=a+b ako je potreban, operator += mora posebno da se preklopi preklopljeni operatori treba da imaju o ekivano zna enje (zbog itljivosti)
Preporuke:
na primer, ako su definisani i operator+= i operator+, dobro je da a+=b ima isti efekat kao i a=a+b operatori dodele treba da menjaju stanje levog operanda na primer, ako su definisani operator= i operator+, treba definisati i operator+= za definisan operator== treba definisati i operator!= Preklapanje operatora 30.10.2005.
kada se defini u operatori za klasu, treba te iti da njihov skup bude kompletan
<tip> operator@(X)
a.operator@(b)
<tip> operator@(X,X)
operator@(a,b)
Nije dozvoljeno da se u programu nalaze obe ove funkcije Kod operatorske metode levi operand je skriveni argument
ako levi operand treba da bude standardnog tipa mora se deklarisati globalna prijateljska funkcija u klasi drugog argumenta primer: Complex operator-(double d, Complex c) mora biti prijateljska
Preklapanje operatora
30.10.2005.
Preklapanje operatora
30.10.2005.
kao metoda bez argumenata: tip operator@ () kao globalna funkcija sa jednim argumentom: tip operator@ (X x) kao metoda sa jednim argumentom: tip operator@ (X xdesni) kao globalna funkcija sa dva argumenta: tip operator@ (X xlevi, X xdesni)
Preklapanje operatora
30.10.2005.
10
Preklapanje operatora
30.10.2005.
na primer, kada su objekti klase mali, mo e se precizno vr iti njihova alokacija, tako da se smanji re ija alokacije
Za ovakve potrebe mogu se preklopiti operatori new i delete za neku klasu Operatorske funkcije new i delete su stati ke (static) metode
ak i ako nisu tako deklarisane, one su stati ke razlog: one se pozivaju pre nego to je objekat stvarno kreiran, odnosno po to je uni ten ne treba eksplicitno pozivati konstruktor, odnosno destruktor konstruktor se implicitno poziva posle operatorske funkcije new destruktor se implicitno poziva pre operatorske funkcije delete obezbede prostor za sme tanje dinami kog objekta (new) oslobode prostor koji je bio alociran za dinami ki objekat (delete)
11
Preklapanje operatora
30.10.2005.
void* operator new (size_t velicina) void operator delete (void* pokazivac) slu i za izra avanje veli ina objekata u bajtovima
Argument velicina daje veli inu prostora koji treba alocirati za objekat Stvarni argument za velicina je sizeof(T), gde je T klasa za koju je preklopljen operator new Stvarni argument se formira na osnovu tipa T u operaciji new T Argument pokazivac je pokaziva na prostor koji treba osloboditi Ako su u klasi T preklopljeni operatori new i delete, ugra eni operatori new i delete mogu da se pozivaju:
eksplicitno, preko operatora :: (::operator new T i ::operator delete pt), ili implicitno, kada se dinami ki kreiraju objekti koji nisu tipa T
U slu aju dinami kih nizova objekata uvek se pozivaju globalni new i delete Metode new i delete ne mogu biti virtuelne, ali se nasle uju
12
Preklapanje operatora
30.10.2005.
13
Preklapanje operatora
30.10.2005.
inicijalizacija podrazumeva da objekat jo ne postoji dodela podrazumeva da objekat sa leve strane operatora ve postoji stati ki, automatski, klasni lan, privremeni i dinami ki konstruktor se poziva ak iako je notacija za inicijalizaciju simbol = ako je izraz sa desne strane = istog tipa kao i objekat koji se kreira, poziva se konstruktor kopije
operator dodele se mo e preklopiti pisanjem operatorske funkcije operator= pri kopiranju lanova tipa klase
pozivaju se operatori = klasa kojima lanovi pripadaju kopira e se samo taj pokaziva , a ne i pokazivana vrednost kada treba kopirati i pokazani objekat treba da se preklopi operator=
14
Preklapanje operatora
30.10.2005.
Operatorska funkcija operator= mora biti nestati ka metoda Operatorska funkcija = se naj e e realizuje tako da:
prvo uni tava prethodno formirane delove objekta, zatim formira nove, uz kopiranje delova objekta sa desne strane = re enje je slede e: X& X::operator=(const X &x){ if (&x != this) { /* uni tava se sadr aj delova starog *this, formira novi i kopira iz x */} return *this; } sva je prilika da treba da sadr i sva tri
Preklapanje operatora 30.10.2005.
15
16
Preklapanje operatora
30.10.2005.
Preklapanje operatora ++ i -
Problem: postoje prefiksne i postfiksne varijante operatora ++ i -Za preklapanje prefiksnih oblika operatora ++ i --:
u obliku metode klase T bez argumenata: T operator@@() u obliku funkcije prijatelja klase T sa jednim argumentom: T operator@@(T)
u obliku metode klase T sa jednim argumentom: u obliku funkcije prijatelja klase T sa dva argumenta:
Ako se postfiksna operatorska funkcija poziva kori enjem operatora @@ argument tipa int ima vrednost 0 Ako se za postfiksnu funkciju koristi notacija t.operator@@(k) ili operator@@(t,k) mo e biti k!=0
17
Preklapanje operatora
30.10.2005.
Preklapanje operatora ()
Operator () je binarni operator kojem odgovara funkcija operator()() Operatorska funkcija operator()() mora da bude nestati ka metoda
funkcija operator()() ne mo e da bude globalna prijateljska funkcija proizvoljan broj proizvoljnog tipa f(a1,...,aN) je ekvivalent izrazu f.operator()(a1,...,aN)
Argumenti: Pozivanje: Preklapanje operatora() u nekoj klasi omogu ava izraze sa o(a1,...,aN), gde je o objekat date klase Primer: P p; float x;
ako je P klasa polinoma, mo e se pisati p(x) za vrednost polinoma u x, ako se preklopi funkcija operator()(float)
18
Preklapanje operatora
30.10.2005.
Operator [] je binarni operator kojem odgovara funkcija operator[]() Operatorska funkcija operator[]() mora da bude nestati ka metoda
funkcija operator[]() ne mo e da bude globalna prijateljska funkcija kod standardnog indeksiranja indeksni izraz mora biti celobrojnog tipa kod preklopljenog operatora [] indeksni izraz mo e biti proizvoljnog tipa niz[ind] je ekvivalent izrazu niz.operator[](ind) za objekat niz
Argument: Pozivanje:
Preklapanje operatora [] u nekoj klasi omogu ava izraze sa o[i], gde je o objekat date klase Mogu e primene:
klasa iji su objekti nizovi sa zadatim granicama indeksa: funkcija indeksiranja mo e da proverava granice asocijativni pristup komponentama niza
19
Preklapanje operatora
30.10.2005.
operatorska funkcija operator[]() dejstvuje na objekat svoje klase, a ne na niz objekata, kao standardni operator []
Prirodno je da struktura objekta bude kolekcija elemenata, a da se operatorom [] odabira neka komponenta
20
Preklapanje operatora
30.10.2005.
Operator -> je unarni operator kojem odgovara funkcija operator->() Operatorska funkcija operator->() mora da bude nestati ka metoda
funkcija operator->() ne mo e da bude globalna prijateljska funkcija funkcija operator->() mora biti bez argumenata o->clan je ekvivalent izrazu (o.operator->())->clan treba da bude tipa pokaziva a na klasu koja sadr i clan bude objekat (ili referenca) klase za koju je tako e definisan operator-> pristup lanovima objekata preko "pametnih pokaziva a"
Primena:
21
Preklapanje operatora
30.10.2005.
Odbrojavaju se indirektni pristupi objektu: struct X{int m}; class Xptr { X *p; int bp; public: Xptr(X *px):p(px),bp(0){} // konstruktor X& operator*() {bp++; return *p;} X* operator->(){bp++; return p;} }; void main(){ X x; Xptr p=&x; // poziva se konstruktor (*p).m=1; // poziva se (p.operator*()).m; int i=p->m; // poziva se (p.operator->())->m; }
22
Preklapanje operatora
30.10.2005.
prvi na in konverzije korisni kih tipova je pomo u konstruktora funkcija treba da izvr i konverziju objekta klase iji je lan u tip T T mo e da bude standardni, izvedeni (npr. pokaziva ) ili klasni tip funkcija operator T() ne mo e da bude globalna prijateljska funkcija funkcija nema argumente (unarni operator, lan klase) (U)t ili U(t) je ekvivalent izrazu t.operator U() drugi oblik je notacijski isti kao da je u pitanju konstruktor U mogu oblik je i stati ki kast: static_cast<U>(t) tip rezultata funkcije ne sme da bude naveden u deklaraciji/definiciji podrazumeva se na osnovu imena funkcije
Operator (T) je unarni operator kojem odgovara funkcija operator T() Operatorska funkcija operator T() mora da bude nestati ka metoda
Argumenti:
Pozivanje:
Rezultat:
23
Preklapanje operatora
30.10.2005.
mo e da se koristi za U koje je standardni tip argument T t mora biti objekat klase, odnosno T ne mo e biti primitivan tip
Primer: int(x) - konvertuje x tipa X u tip int Oblik notacije U(t) ne mo e da se koristi za tipove sa ve im brojem re i Primer: (unsigned long) x nije isto to i unsigned long(x) Konverzija se primenjuje automatski, ako je jednozna an izbor konverzije
ako je definisan konstruktor kopije U(T) i operatorska funkcija T::operator U(), u=t je dvozna no ako su definisane obe konverzije U(t) i T(u), prevodilac ne mo e automatski da odredi konverziju za u+t rezultat konverzije stvarnog argumenta je privremeni objekat, pa se u funkciju prenosi njegova adresa izmene u funkciji se odnose na taj privremeni objekat
24
Preklapanje operatora
30.10.2005.
Za C++ postoje standardne U/I biblioteke realizovane u duhu OOP-a Na raspolaganju su i stare C biblioteke sa funkcijama scanf i printf
njihovo kori
Deklaracije C++ biblioteke za U/I nalaze u zaglavlju <iostream.h> Biblioteka iostream sadr i dve osnovne klase za U/I:
istream (apstrakcija ulaznog toka) ostream (apstrakcija izlaznog toka) objektu klase ifstream/ofstream mo e da se pridru i jedna datoteka za U/I odnosno funkcija lanica ili prijatelja ovih klasa
25
Preklapanje operatora
30.10.2005.
koji je pridru en standardnom ulaznom ure aju (obi no tastatura) koji je pridru en standardnom izlaznom ure aju (obi no ekran)
Klasa istream je preklopila operator>> za sve ugra ene tipove, koji slu i za ulaz podataka:
istream& operator>>(istream &is, T &t); gde je T neki ugra eni tip objekta koji se ita
Klasa ostream je preklopila operator<< za sve ugra ene tipove, koji slu i za izlaz podataka:
ostream& operator<<(ostream &os, const T& x); gde je T neki ugra eni tip objekta koji se ispisuje
26
Preklapanje operatora
30.10.2005.
Kori
posledica: mo e se vr iti vi estruki U/I u istoj naredbi posledica: podaci se ispisuju/u itavaju u prirodnom redosledu
27
Preklapanje operatora
30.10.2005.
to se posti e definisanjem odgovaraju ih globalnih funkcija prijatelja date klase prvi operand je tipa istream& odnosno ostream&
Razlog zbog kojeg preklopljen operator ne mo e biti metoda: Primer za klasu Complex: #include <iostream.h> class Complex { double real,imag; friend ostream& operator<< (ostream&,const Complex&); public: //... kao i ranije }; ostream& operator<< (ostream &os, const Complex &c) { return os<<"("<<c.real<<","<<c.imag<<")"; } void main () { Complex c(0.5,0.1); cout<<"c="<<c<<endl; // ispisuje se: c=(0.5,0.1) }
Preklapanje operatora 30.10.2005.
28