You are on page 1of 51

1

Lekcija 4 Preklapanje operatora


Pregled
1.1
Pojam preklapanje operatora
1.2
Operatorske funkcije
1.3
Boni efekti i veze
1.4
Preklapanje ++ i -1.5
Preklapanje ()
1.6
Preklapanje []
1.7
Preklapanje ->
1.8
Preklapanje new i delete
1.9
Preklapanje =
1.10
U/I tokovi
1.11
Preklapanje >> i <<
1.12
Inicijalizacija i dodjela
1.13
Konverzije tipova

Ciljevi lekcije
U ovoj lekciji:
Upoznavanje sa osnovim pojmovima vezanim za preklapanje
operatora
Definisanje operatorskih funkcija
Predefinisanje operatora ++, , (), [], >, new i delete
Predefinisanje operatora dodjele i razlike u odnosu na
inicijalizaciju
Osnovne ulazno/izlaznih tokova i operatori >> i <<
Konverzije tipova

1.1 Pojam preklapanja operatora


Znaenje operatora ugraenih u jezik mogue je
definisati za korisnike tipove (klase)
Preklapanje operatora (engl. operator overloading)
Slian princip kao kod preklapanja funkcija

Ako je za operator definisano novo znaenje onda


se kae da je on preklopljen
Poveavanje itljivosti koda
Primjer: Klasa koja predstavlja kompleksne brojeve i
operacija sabiranja
Bilo bi pogodno da moemo koristiti operator + nad objektima
ove klase

1.1 Pojam preklapanja operatora


classComplex
{
private:
floatre;
floatim;
public:
Complex(floatr=0.0,floati=0.0):re(r),im(i){};
Complexadd(Complexc1)
{
Complexrez;
rez.re=this>re+c1.re;
rez.im=this>im+c1.im;
returnrez;
}
};
intmain()
{
Complexc1(1.0,2.0),c2(4.5,5.6),c3;
c3=c1.add(c2);
return0;
}

1.2 Operatorske funkcije


Znaenje operatora za korisniki tip definie se putem
operatorskih funkcija
Imaju posebna imena operator@
Simbol @ oznaava neki operator ugraen u jezik
Npr. operator+

Ove funkcije preklapaju standardne operatore (+,-, , /, *


itd.)
Osim eksplicitnog poziva preko imena mogu se pozivati
koristei notaciju koja se koristi za operatore nad
ugraenim tipovima
Izraz t1@t2 se tumai kao:
operator@(t1,t2) // za operatorsku prijateljsku
funkciju klase
t1.operator@(t2) // za operatorsku metodu klase

1.2 Operatorske funkcije


classComplex
{
private:
floatre;
floatim;
public:
Complex(floatr=0.0,floati=0.0):re(r),im(i){};
friendComplexoperator+(Complexc1,Complexc2);
voidPrint(){cout<<"Re="<<re<<",Im="<<im<<endl;}
};
Complexoperator+(Complexc1,Complexc2)
{
Complexrez;
rez.re=c1.re+c2.re;
rez.im=c1.im+c2.im;
returnrez;
}
intmain()
{
Complexc1(1.0,2.0),c2(4.5,5.6),c3;
c3=c1+c2;//ekv.sac3=operator+(c1,c2);
c3.Print();
return0;
}

1.2 Operatorske funkcije


classComplex
{
private:
floatre;
floatim;
public:
Complex(floatr=0.0,floati=0.0):re(r),im(i){};
Complexoperator(Complexc1);
Complexoperator+(floatf){returnComplex(this>re+f,this>im);}
voidPrint(){cout<<"Re="<<re<<",Im="<<im<<endl;}
};
ComplexComplex::operator(Complexc1)
{
returnComplex(this>rec1.re,this>imc1.im);
}
intmain()
{
Complexc1(1.0,2.0),c2(4.5,5.6),c3;
c3=c2c1;//ekv.sac3=c2.operator(c1);
c3.Print();
c3=c3+1.0;
c3.Print();
return0;
}

1.2 Operatorske funkcije


Nije mogue
Promijeniti prioritet, asocijativnost i broj operanda operatora
u odnosu na svojstva koja su ugraena u jezik
Npr. nije mogue definisati da prekolopljeni operator + ima
vei prioritet u odnosu na preklopljeni operator *

Predefinisati operatore za ugraene tipove


Npr. nije dozvoljeno Complexoperator+(float,
float)

Uvoditi nove operatore u jezik


Preklopiti operatore ., .*, ::, ?:, sizeof i throw dok
svi ostali mogu

Neki operatori imaju posebna ogranienja za


preklapanje: new, delete, i++, i--, =, (),
[], ->, (tip)

1.2 Operatorske funkcije


Operatorska funkcija moe biti
Funkcija lanica klase
Neka je @ binarni opererator, tada operatorska funkcije koja je
funkcija lanica treba da se realizuje kao Toperator@(Y)
Prvi operand mora biti objekat klase kojoj operatorska funkcija
pripada
Drugi operator mora biti tipa argumenta
Npr. ako u klasi Complex postoji definisana operatorska
funkcija Complexoperator+(floatf), onda prvi
argument mora biti objekat klase Complex. Drugi argument
mora biti tipa float.

Globalna funkcija (najee prijateljska)


Neka je @ binarni opererator, tada operatorska funkcije koja je
globalna treba da se realizuje kao Toperator@(X,Y)

10

1.2 Operatorske funkcije


Unarni operator ima samo jedan operand, pa se
moe realizovati:
kao metoda bez argumenata:
tip operator@ ()
kao globalna funkcija sa jednim argumentom:
tip operator@ (X x)

Binarni operator ima dva argumenta, pa se moe


realizovati
kao metoda sa jednim argumentom:
tip operator@ (X xdesni)
kao globalna funkcija sa dva argumenta:
tip operator@ (X xlevi, X xdesni)

11

1.2 Operatorske funkcije


classComplex
{
private:
floatre;
floatim;
public:
Complex(floatr=0.0,floati=0.0):re(r),im(i){};
voidPrint(){cout<<"Re="<<re<<",Im="<<im<<endl;}
Complexoperator();//unarniminus
};
ComplexComplex::operator()
{
returnComplex(re,im);
}
intmain()
{
Complexc1(1.0,2.0);
c1=c1;
c1.Print();
return0;
}

12

1.3 Sporedni efekti i veze


Boni efekti koji postoje kod operatora za
primitivne tipove ne podrazumijevaju se za
preklopljene operatore
Boni efekti postoje kod:
Operatora ++ i - (prefiksnih i postfiksnih)
Svih operatora dodjele (=, +=, -=, *=, ...)

Veze koje postoje izmeu operatora za primitivne


tipove ne podrazumijevaju se za preklopljene
operatore
Npr., ako je definisan operator+, a+=b ne znai
automatski a=a+b
Ako je potreban, operator += mora posebno da se preklopi

13

1.3 Sporedni efekti i veze


Preporuke:
Preklopljeni operatori treba da imaju oekivano znaenje
(zbog itljivosti)
Npr., ako su definisani i operator+= i operator+,
dobro je da a+=b ima isti efekat kao i a=a+b
Operatori dodjele treba da mijenjaju stanje lijevog operanda

Kada se definiu operatori za klasu, treba teiti da njihov


skup bude kompletan
Npr., ako su definisani operator= i operator+, treba
definisati i operator+=
Za definisan operator== treba definisati i operator!=

14

1.3 Sporedni efekti i veze


U nekim sluajevima bitno je da li je operatorska
funkcija definisana kao globalna funkcija, ili kao
funkcija lanica.
Ako je operatorska funkcija definisana kao
funkcija lanica, bie onemogueno vrenje
implicitne konverzije
Za globalne funkcije to je dozvoljeno

Ako operatorske funkcije mijenjaju stanje (+=)


objekta poeljno je da budu funkcije lanice
Mogu i globalne iji je odgovarajui operator referenca

15

1.3 Sporedni efekti i veze


classComplex
{
private:
floatre;
floatim;
public:
Complex(floatr=0.0,floati=0.0):re(r),im(i){}
friendComplexoperator+(Complexc1,Complexc2);
};
Complexoperator+(Complexc1,Complexc2)
{
returnComplex(c1.re+c2.re,c1.im+c2.im);
}
intmain()
{
Complexc1(1,2);
Complexc2(1,2);
Complexc3;
c3=1.0+c2;
//dozvoljeno,postojiodgovaraju?ikonstruktorkojisemozepozvati
}

16

1.3 Sporedni efekti i veze


classComplex
{
private:
floatre;
floatim;
public:
Complex(floatr=0.0,floati=0.0):re(r),im(i){}
Complexoperator+(Complexc1);
};
ComplexComplex::operator+(Complexc1)
{
returnComplex(this>re+c1.re,this>im+c1.im);
}
intmain()
{
Complexc1(1,2);
Complexc2(1,2);
Complexc3;
c3=1.0+c2;
//Greska
}

17

1.3 Sporedni efekti i veze


Rezultat je lvrijednost ako i samo ako funkcija
vraa referencu
Ovo vai za sve operatorske funkcije
Termin lvrijednost oznaava izraz koji se odnosi na neki
objekat ili funkciju
Najee, u pitanju je izraz koji se moe nai sa lijeve strane
znaka jedankosti

U C++ neki operatori (=, +=) vraaju lvrijednost,


tj. mogu se nai sa lijeve strane znaka dodjele
Npr. izraz (a+=4)=5; je dozvoljen u C++
Bez obrzira na prethodno stanje varijabla a dobija vrijednost 5

Ako neki operator vraa lvrijednost, onda je


preporuljivo da preklopljeni operator takoe
vraa lvrijednost

18

1.3 Sporedni efekti i veze


classComplex
{
private:
floatre;
floatim;
public:
Complex(floatr=0.0,floati=0.0):re(r),im(i){}
friendComplex&operator+=(Complex&c1,Complexc2);
};
Complex&operator+=(Complex&c1,Complexc2)
{
c1.im=c1.im+c2.im;
c1.re=c1.re+c2.re;
returnc1;
}
intmain()
{
Complexc1(1,2);
Complexc2(5,6);
Complexc3(3,4);
(c2+=c1)=c3;
//c2dobijavrijednostc3
return0;
}

19

1.4 Preklapanje ++ i - Komplikovaniji je postoji i prefiksna i postfiksna varijanta


Preklapanje prefiksnog operatora ++ vri se putem
uobiajenih operatorskih funkcija
Kao funkcija lanica - T operator++()
Kao globalna funkcija - T operator++(T)
Analogno vai i za

Preklapanje postfiksnog operatora ++ vri se


Kao funkcija lanica - T operator++(int)
Kao globalna funkcija - T operator++(T, int)
Ako se drugi stvarni argument ne navede bie 0
Ne moe se navesti kada se funkcija poziva kao operator
Moe se navesti kada se funkcija poziva direktno t.operator++
(k)

Analogno vai i za

20

1.4 Preklapanje ++ i -classComplex


{
private:
floatre;
floatim;
public:
Complex(floatr=0.0,floati=0.0):re(r),im(i){};
voidPrint(){cout<<"Re="<<re<<",Im="<<im<<endl;}
Complexoperator++();//prefiksna
Complexoperator++(int);//postfiksna
};
ComplexComplex::operator++()
{
//prvoseuvecajureiim,
//pasekreiralokalniobjekat
returnComplex(++re,++im);
}
ComplexComplex::operator++(intk)
{
//prvosekreiralokalniobjekat,
//pauvecajureiim
returnComplex(re++,im++);
}

21

1.4 Preklapanje ++ i -intmain()


{
Complexc1(1.0,2.0),c2;
cout<<"c1=";c1.Print();
c2=c1++;
cout<<"c2=";c2.Print();
cout<<"c1=";c1.Print();
c2=++c1;
cout<<"c2=";c2.Print();
cout<<"c1=";c1.Print();
return0;
}

22

1.5 Preklapanje ()
Odgovara mu funkcija operator()()

Mora da bude nestatika funkcija


Ne moe da bude globalna funkcija
Ima proizvoljan broj argumenata
Svaki argument moe da bude proizvoljnog tipa

Poziva se f(a1,...,aN)
To je ekvivalent f.operator()(a1,...,aN)

Rezultat je lvrijednost ako i samo ako funkcija


vraa referencu
Ovo vai za sve operatorske funkcije
Termin lvrijednost oznaava izraz koji se odnosi na neki
objekat ili funkciju
Najee, u pitanju je izraz koji se moe nai sa lijeve strane
znaka jedankosti

23

1.5 Preklapanje ()
classMatrix
{
private:
int**mat;
intr;
intc;
public:
Matrix(intr,intc);
~Matrix();
int&operator()(inti,intj);
};
Matrix::Matrix(intr,intc):r(r),c(c)
{
mat=newint*[r];
for(inti=0;i<r;i++){mat[i]=newint[c];}
}
Matrix::~Matrix()
{
for(inti=0;i<r;i++){deletenewint[c];}
deletemat;
}
int&Matrix::operator()(inti,intj)
{
returnmat[i][j];
}

24

1.5 Preklapanje ()
intmain()
{
Matrixm(3,3);
m(0,0)=1;
//lvrijednost,mozesenacisa
//lijevestraneznakajednakosti
cout<<m(0,0);
return0;
}

25

1.6 Preklapanje []

Odgovara mu funkcija operator[]()


Mora da bude nestatika funkcija
Ne moe da bude globalna funkcija
Ima tano jedan argument
Moe da bude proizvoljnog tipa

Poziva se niz[ind]
To je ekvivalent niz.operator[](ind)

Najea upotreba
Kod objekata koji predstavljaju neke kolekcije

26

1.6 Preklapanje []
classArray
{
private:
int*a;
intnum;
public:
Array(intnum);
~Array();
int&operator[](inti);
};
Array::Array(intnum):num(num)
{a=newint[num];}
Array::~Array()
{deletea;}
int&Array::operator[](inti)
{returna[i];}
intmain()
{
Arraya(3);
a[0]=1;
cout<<a[0];
return0;
}

27

1.7 Preklapanje ->


Unarni operator kojem odgovara funkcija
operator->()

Mora da bude nestatika funkcija


Ne moe da bude globalna funkcija
Mora da bude bez argumenata
Moe da bude proizvoljnog tipa

Poziva se o->clan
To je ekvivalent (o.operator->()(ind))->clan

Najea upotreba
Pristup lanovima preko pametnih pokazivaa
Broji pristupe

28

1.7 Preklapanje ->


classX
{public:intdata;};
classY
{
private:
X*xPtr;
intnum;
public:
Y(X*xPtr):xPtr(xPtr),num(0){};
X*operator>(){num++;returnxPtr;};
intgetNum(){returnnum;}
};
intmain()
{
Xx;
Yy(&x);
y>data=5;//(pozivasey>operator>)>data
cout<<"data="<<x.data<<",num="<<y.getNum();
return0;
}

29

1.8 Preklapanje new i delete


Predefinisanjem operatora new vri se kontrola
nad alokacijom memorije
Za male objekte moe se vriti precizno alokacija i
optimizovati taj postupak

Operatorske funkcije new i delete su uvijek


statike
Kada su pozvane objekat jo uvijek ne postoji

Unutar tijela nije potrebno pozivati konstruktor, tj.


destruktor
Oni su implicitno pozvani

Operator new treba da vrati pokaziva na alocirani


prostor

30

1.8 Preklapanje new i delete


Operatorska funkcija new
void* operator new (size_t sz)
Argument sz je cjelobrojni i prestavlja broj bajta koje treba
alocirati
Vraa generiki pokaziva void*, tj. pokaziva na zauzetu
memoriju

Operatorska funkcija new definie se


void operator delete (void* ptr)
Ima jedan argument ptr koji je pokaziva na memoriju
koju treba osloboditi

31

1.8 Preklapanje new i delete


classX
{
private:
staticintnum;
public:
void*operatornew(size_tsz);
voidoperatordelete(void*ptr);
};
intX::num=0;
void*X::operatornew(size_tsz)
{
if(num==10){cout<<"max10"<<endl;return0;}
num++;
return::operatornew(sz);
}
voidX::operatordelete(void*ptr)
{
if(ptr!=0){num;::operatordelete(ptr);}
}
intmain()
{
X*x[50];
for(inti=0;i<11;i++)
{x[i]=newX;}
return0;
}

32

1.9 Preklapanje =
Binarni operator kojem odgovara funkcija
operator=
Mora da bude nestatika funkcija
Ne moe da bude globalna funkcija
Mora da ima jedan argument
Moe da bude proizvoljnog tipa

Poziva se o=izraz
To je ekvivalent o.operator=(izraz)

Uvijek je treba definisati kada prosto dodjeljivanje


lan po lan nije logino
Slian problem kod konstruktora kopije

33

1.9 Preklapanje =
classArray
{
private:
int*a;
intnum;
public:
Array(intnum):num(num){a=newint[num];};
~Array(){deletea;};
int&operator[](inti){returna[i];};
};

intmain()
{
Arraya1(3),a2(2);
a1[0]=1;
a2=a1;
a2[0]=5;
cout<<"a1[0]="<<a1[0];
cout<<",a2[0]="<<a2[0];
}

34

1.9 Preklapanje =

35

1.9 Preklapanje =
classArray
{
//istokaraniije
Array&operator=(Array&arr);
};
Array&Array::operator=(Array&arr)
{
//izbjegavanjea=aproblema
if(this==&arr){return*this;}
deletea;
num=arr.num;
a=newint[num];
for(inti=0;i<num;i++)
a[i]=arr.a[i];
return*this;
}
intmain()
{
Arraya1(3),a2(2);
a1[0]=1;
a2=a1;
a2[0]=5;
cout<<"a1[0]="<<a1[0];
cout<<",a2[0]="<<a2[0];
}

36

1.9 Preklapanje =

37

1.10 U/I tokovi


U C++ ne postoje naredbe ugraene u jezik koje
su namijenjene ulazno/izlaznim operacijama
U tu svrhu se koriste standardne biblioteke
Isto vai i za programski jezik C

Stadardne biblioteke za U/I realizovane su u duhu


OOP-a
Deklaracije biblioteka nalaze u zaglavlju <iostream.h>
Definisani su pojmovi ulaznog i izlaznog toka
Logiki pojmovi koji se odnose na ulazi i izlaz niza znaka na
ureaj ili datoteku

Biblioteka iostream sadri


Klasu istream koja realizuje ulazni tok
Klasu ostream koja realizuje izlazni tok

38

1.10 U/I tokovi


Iz navedenih klasa izvedene su klase ifstream i
ofstream
Jednom objektu klase ifstream/ofstream moe da se pridrui
jedna datoteka ili ureaj za U/I

U biblioteci iostream definisana su i dva globalna


statika objekta:
Objekat cin klase istream koji je pridruen standardnom
ulaznom ureaju (obino tastatura)
Objekat cout klase ostream koji je pridruen standardnom
izlaznom ureaju (obino ekran)

Klasa istream sadri po jednu operatorsku funkciju


operator>> za svaki ugraeni tip podatka
istream& operator>>(istream &is, Tip &t);
Gdje Tip oznaava neki ugraeni tip

39

1.10 U/I tokovi


Klasa ostream sadri po jednu operatorsku
funkciju operator<< za svaki ugraeni tip
podatka
ostream& operator<<(ostream &os, T& x);
Gdje Tip oznaava neki ugraeni tip

Lijevi operand je tok, dok je desni se drugi pie ili


ita u ili iz toka
Funkcije vraaju reference na isti tok nad kojim je izvrena
U/I operacija
Mogu se vriti viestruke U/I operacije

Operatore >> i << treba koristiti za jednostavne


U/I operacije

40

1.11 Preklapanje >> i <<


Mogue je da korisnik predefinie operatore << i
>> za svoje klase
Definiu se globalne operatorske funkcije koje su prijatelji
klase
Ne mogu biti metode klase jer prvi operand mora biti
ostream ili istream

Prvi operand je tipa ostream ili istream


Drugi operand je objekat tipa klase za koju predefiniemo
operator
Poeljno je funkcije vraa referencu na ostream, tj. na
istream kako bi omoguili pozivanje u nizu

41

1.11 Preklapanje >> i <<


classComplex
{
private:
floatre;
floatim;
public:
Complex(floatr=0.0,floati=0.0):re(r),im(i)
{};
friendostream&operator<<(ostream&os,Complex&c);
};
ostream&operator<<(ostream&os,Complex&c)
{
os<<"(Im="<<c.re<<",Re="<<c.im<<")";
returnos;
}
intmain()
{
Complexc(2.3,1.0);
cout<<c;
}

42

1.12 Inicijalizacija i dodjela


Postoji razlika izmeu pojmova inicijalizacije i
dodjele
Inicijalizacija se vri nad objektom u fazi kreriranja
Vri se samo jednom
Definie poetno stanje objekta

Dodjela se vri nad postojeim objektom


Moe se vriti proizvoljan broj puta
Mijenja postojee stanje objekta

Kada se objekat inicijalizuje objektom iste klase


poziva se konstruktor, a ne operator dodjele
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

43

1.12 Inicijalizacija i dodjela


Operacija dodjele vri se u okviru naredbe dodjele
(operator =)
Operator dodjele se moe preklopiti pisanjem operatorske
funkcije operator=

Podrazumijevano ponaanje je kopiranje objekta


lan po lan
Pri kopiranju lanova klase pozivaju se operatori = za
lanove klase
Problem:
Ako je lan klase pokazi izvrie se tzv. plitko dodjeljivanje,
tj. kopiranje pokazivaa, ali ne i sadraja

Praktino pravilo
Ako klasa ima konstruktor kopije, operator dodjelje ili
destruktor, onda najvjerovatnije treba da ima sva tri

44

1.12 Inicijalizacija i dodjela


classArray
{
private:
int*a;
intnum;
public:
Array(intnum);
Array(Array&arr);
~Array(){deletea;};
int&operator[](inti){returna[i];};
Array&operator=(Array&arr);
friendbooloperator==(Array&arr1,Array&arr2);
friendostream&operator<<(ostream&os,Array&arr);
};
Array::Array(intnum):num(num)
{
cout<<"Konstr."<<endl;
a=newint[num];
};

45

1.12 Inicijalizacija i dodjela


Array::Array(Array&arr):num(arr.num)
{
cout<<"Konstr.kop."<<endl;
a=newint[num];
for(inti=0;i<num;i++)
a[i]=arr.a[i];
};
Array&Array::operator=(Array&arr)
{
cout<<"Op.="<<endl;
if(this==&arr){return*this;}
deletea;
num=arr.num;
a=newint[num];
for(inti=0;i<num;i++)
a[i]=arr.a[i];
return*this;
}

46

1.12 Inicijalizacija i dodjela


booloperator==(Array&arr1,Array&arr2)
{
cout<<"Op.=="<<endl;
if(arr1.num!=arr2.num)return0;
for(inti=0;i<arr1.num;i++)
if(arr1[i]!=arr2[i])
return0;
return1;
}
ostream&operator<<(ostream&os,Array&arr)
{
for(inti=0;i<arr.num;i++)cout<<arr[
i]<<"";
cout<<endl;
returnos;
}

47

1.12 Inicijalizacija i dodjela


intmain()
{
Arraya1(2);
a1[0]=1;a1[1]=2;
cout<<"a1="<<a1;
Arraya2=a1;
a2[0]=5;
cout<<"a2="<<a2;
if(a1==a2)
cout<<"a1==a2"<<endl;
else
cout<<"a1!=a2"<<endl;
a2=a1;
cout<<"a2="<<a2;
if(a1==a2)
cout<<"a1==a2"<<endl;
else
cout<<"a1!=a2"<<endl;
return0;
}

1.12 Inicijalizacija i dodjela

classPoint
{
private:
floatx;
floaty;
public:
Point(floatx=0.0,floaty=0.0):x(x),y(y){cout<<"Konstr.:Point"
<<endl;};
Point(Point&p):x(p.x),y(p.y){cout<<"Konstr.kop:Point"<<endl;};
Point&operator=(Point&p){cout<<"PointOp="<<endl;x=p.x;y=p.y;
return*this;}
};
classCircle
{
private:
Pointp;
floatr;
public:
Circle(floatx=0.0,floaty=0.0,floatr=0.0):p(x,y),r(r)
{cout<<"Konstr:Circle"<<endl;}
Circle(Circle&c):p(c.p),r(c.r)
{cout<<"Konstrkop.:Circle"<<endl;}
};
intmain()
{
Circlec1(1.0,2.0,3.0);
Circlec2=c1;
c2=c1;
}

48

49

1.13 Konverzije tipova


Konverzija tipova moe se vriti putem konstr.
classComplex
{
private:
floatre;
floatim;
public:
Complex(floatr=0.0,floati=0.0):re(r),im(i)
{cout<<"Konstr"<<endl;};
~Complex(){cout<<"Dest"<<endl;}
friendostream&operator<<(ostream&os,Complex&c1);
};
ostream&operator<<(ostream&os,Complex&c)
{
os<<"(Im="<<c.re<<",Re="<<c.im<<")"<<endl;
returnos;
}
intmain()
{
Complexc1(1.2,2.3);
cout<<c1;
c1=5.0;
cout<<c1;
return0;
}

50

1.13 Konverzije tipova


Drugi nain jeste definisanje operatorske funkcije
za konverziju
Operatorska funkcija lanica klase X koja ima
oblik operator T() definie konverziju iz tipa X
u tip T
Operatorska funkcija operator T() ne moe da
bude statika metoda, niti moe da bude globalna
prijateljska funkcija
Nema argumente
U pitanju je unarni operator

Tip povratnog rezultata se ne navodi u deklaraciji


Podrazumijeva se na osnovu imena funkcije

51

1.13 Konverzije tipova


classComplex
{
private:
floatre;
floatim;
public:
Complex(floatr=0.0,floati=0.0):re(r),
im(i){};
operatorfloat(){returnre;}
};
intmain()
{
Complexc1(1.2,2.3);
floatf;
f=c1;
cout<<f<<endl;
return0;
}

You might also like