You are on page 1of 18

Objektno-orijentisano

programiranje
1. Operatorske funkcije
Preklapanje operatora
n Ukoliko nad obektima klase treba izvoditi neke operacije
nalik onima koje su definisane u programskom jeziku za
standardne tipove definiu se operatorske funkcije.
n Operatorske funkcije nose ime operator@
q simbol @predstavlja neki operator ugra#en u jezik
n Operatorske funkcije se mogu definisati
q Unutar klase,
q Kao samostalne (globalne funkcije).
Operatorske funkcije $lanice klase
n Ukoliko je operatorska funkcija definisana u klasi, njen
prvi operand je skriven to je objekat za koji se
funkcija poziva.
n Definisanje binarnog operatora u klasi:
<tip> operator@( <tip> desni );
n Definisanje unarnog operatora u klasi:
<tip> operator@( );
Operatorske funkcije $lanice klase - primer
//Time.h
class Time
{
public:
Time( int, int, int );
Time operator+( const Time& t );
Time operator-( const Time& t );
Time opeator~();
...
private:
int hour;
int minute;
int second;
};
Operatorske funkcije $lanice klase - primer
//Time.cpp
#include Time.h;
Time Time::operator+( const Time& t )
{
Time rez;
rez.second = this->second + t.second;
rez.minute = this->minute + t.minute + rez.second/60;
rez.hour = this->hour + t.hour + rez.minute/60;
rez.second %= 60;
rez.minute %= 60;
rez.hour %= 24;
}
Time Time::operator~( )
{
return Time( 60 - this->second, 60 - this->minute,
24 - this->hour );
}
Poziv operatrskih funkcija
n Na nain kako se primenjuju i operatori definisani
u programskom jeziku:
Time t1(2,50,30), t2(5,30,45), t3, t4;
t3 = t1+t2;
t4 = ~t3;
n Na nain kako se poziva bilo koja funkcija lanica
klase:
t3 = t1.operator+(t2);
t4 = t3.operator~();
Operatorske funkcije kao samostalne
(globalne) funkcije
n Svaka operatorska funkcija koja mo&e da bude
implementirana kao $lanica klase, mo&e da bude
imlementirana i kao samostalna funkcija.
n Operatorska funkcija kod koje prvi operand nije objekat
klase koju mi razvijamo se jedino mo&e implementirati
kao samostalna funkcija.
n Definisanje samostalnih operatorskih funkcija:
q Za binarne operatore:
<tip1> operator@( <tip2> levi, <tip3> desni );
q Za unarne operatore
<tip1> operator@( <tip2> operand );
Operatorske funkcije kao samostalne
(globalne) funkcije - primer
//Time.h
class Time
{
public:
Time( int, int, int );
friend Time operator*( int k, const Time& t );
friend istream& operator>>(istream& in, Time& t);
...
private:
int hour;
int minute;
int second;
};
Operatorske funkcije kao samostalne
(globalne) funkcije - primer
Time operator*( int k, const Time& t )
{
Time rezult;
rezult.second = k * t.second;
rezult.minute = k * t.minute + rezult.second/60;
rezult.hour = k * t.hour + result.minute/60;
rezult.second %= 60;
rezult.minute %= 60;
rezult.hour %= 24;
return rezult;
}
istream& operator>>(istream& in, Time& t)
{
in >> t.hour >> t.minute >> t.second;
return in;
}
Preklapanje operatora =
n Podrazumevani operator =
q Prosto prepisivanje svih atributa jednog objekta u odgovaraju(e
atribute drugog
q Neprivatljiv kada postoje atributi u dinami$koj zoni memorije.
n Ukoliko objekat sadr&i nizove u dinami$koj zoni
memorije:
q Obrisati stari niz,
q Kreirati novi odgovaraju(e dimenzije,
q Prepisati elemente.
q Napomena: Obavezno proveriti da li se objekti koji u$estvuju u
izrazu razlikuju.
Primer: Operator =u klasi Vektor
class Vector
{
public:

Vector& operator=(Vector& v);

private:
int n;
int* a;
};
Primer: Operator =u klasi Vektor
//implementacija u .cpp fajlu:
Vector& Vector::operator=(Vector& v)
{
if ( this != &v )
{
this->n = v.n;
delete [] a;
a = new int[n];
for( int i=0; i<n; i++ )
a[i]=v.a[i];
}
return *this;
}
Preklapanje operatora ++ i --
n Ovi operatori mogu biti:
q Prefiksni,
q Postfiksni.
n Razlikovanje prefiksnih i postfiksnih operatora:
q Postfiksnim operatorima se dodaje fiktivni argument tipa int.
n Ne koristi se u implementaciji funkcije,
n Ozna$ava samo na$in pozivanja funkcije.
Primer: Operatori ++i u klasi Time
class Time
{
public:

Time(const Time& t);


Time& operator++();
Time operator++(int);
Time& operator--();
Time operator--(int);
...
private:
int hour;
int minute;
int second;
void decrement();
void increment();
};
Implementacijaoperatora++
Time& Time::operator++( )
{
increment();
return *this;
}
Time Time::operator++(int n)
{
Time rez(*this);
increment();
return rez;
}
Time Time::increment()
{
second++;
if ( second==60 )
{
second = 0;
minute++;
if ( minute == 60 )
{
minute = 0;
hour++;
if ( hour == 24 )
hour = 0;
}
}
}
Implementacijaoperatora--
Time& Time::operator--( )
{
decrement();
return *this;
}
Time Time::operator--(int n)
{
Time rez(&this);
decrement();
return rez;
}
Time Time::decrement()
{
second--;
if ( second==-1 )
{
second = 59;
minute--;
if ( minute == 59 )
{
minute = 59;
hour--;
if ( hour == -1 )
hour = 23;
}
}
}
Orani$enja za preklapanje operatora
n ne mogu da se preklope operatori:
., .*, ::, ?:, sizeof i throw dok svi ostali mogu
n ne mogu da se redefiniu zna$enja operatora za
primitivne (standardne) tipove podataka
n ne mogu da se uvode novi simboli za operatore
n ne mogu da se menjaju osobine operatora: n-arnost,
prioritet i asocijativnost
*ta operatorske funkcije treba da vrate?
n Operatori koji menjajulevi operand (npr. =) trebadavrate
referencunalevi operand.
n Operatori koji birajuili isporuujuoperande(npr. [], ->, ())
obino trebadavratereferencunaizabranuvrednost.
n Operatori koji izraunavajunovuvrednost, a nemenjaju
svojeoperande(operatori nadbitovima, +, -, *, /, %, &, \, ^,
&&, | | , unarni (-, +), !~) obino trebadavratekopiju
lokalnokreiranogobjekta.
n Preinkrement i predekrement - trebadavratereferencuna
operand.
n Postinkrement i postdekrement - trebadasauvajukopiju
svogoperanda, izmeneoperand i zatimvratekopiju.

You might also like