Professional Documents
Culture Documents
04 - Preklapanje Operatora
04 - Preklapanje Operatora
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
10
11
12
13
14
15
16
17
18
19
Analogno vai i za
20
21
22
1.5 Preklapanje ()
Odgovara mu funkcija operator()()
Poziva se f(a1,...,aN)
To je ekvivalent f.operator()(a1,...,aN)
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 []
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
Poziva se o->clan
To je ekvivalent (o.operator->()(ind))->clan
Najea upotreba
Pristup lanovima preko pametnih pokazivaa
Broji pristupe
28
29
30
31
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)
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
38
39
40
41
42
43
Praktino pravilo
Ako klasa ima konstruktor kopije, operator dodjelje ili
destruktor, onda najvjerovatnije treba da ima sva tri
44
45
46
47
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
50
51