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
3
int main()
{
Complex c1(1.0,2.0), c2(4.5,5.6), c3;
c3 = c1.add(c2);
return 0;
}
5
int main()
{
Complex c1(1.0,2.0), c2(4.5,5.6), c3;
c3 = c1 + c2; //ekv. sa c3 = operator+(c1,c2);
c3.Print();
return 0;
}
7
int main()
{
Complex c1(1.0,2.0), c2(4.5,5.6), c3;
c3 = c2 - c1; //ekv. sa c3 = c2.operator-(c1);
c3.Print();
c3 = c3 + 1.0;
c3.Print();
return 0;
}
8
int main()
{
Complex c1(1.0,2.0);
c1 = -c1;
c1.Print();
return 0;
}
12
1.4 Preklapanje ++ i --
• Komplikovaniji je postoji i prefiksna i postfiksna varijanta
• Preklapanje prefiksnog operatora ++ vrši se putem
uobičajenih operatorskih funkcija
– Kao funkcija članica - T operator++()
– Kao globalna funkcija - T operator++(T)
– Analogno važi i za --
• Preklapanje postfiksnog operatora ++ vrši se
– Kao funkcija članica - T operator++(int)
– Kao globalna funkcija - T operator++(T, int)
– Ako se drugi stvarni argument ne navede biće 0
• Ne može se navesti kada se funkcija poziva kao operator
• Može se navesti kada se funkcija poziva direktno t.operator++
(k)
– Analogno važi i za --
15
1.4 Preklapanje ++ i --
class Complex
{
private:
float re;
float im;
public:
Complex(float r = 0.0, float i = 0.0) : re(r), im(i){};
void Print(){cout << "Re=" << re <<",Im=" << im << endl;}
Complex operator++(); //prefiksna
Complex operator++(int); //postfiksna
};
1.4 Preklapanje ++ i --
int main()
{
Complex c1(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();
return 0;
}
17
1.5 Preklapanje ()
• Odgovara mu funkcija operator()()
– Mora da bude nestatička funkcija
– Ne može da bude globalna funkcija
– Ima proizvoljan broj argumenata
– Svaki argument može da bude proizvoljnog tipa
• Poziva se f(a1,...,aN)
– To je ekvivalent f.operator()(a1,...,aN)
• Rezultat je lvrijednost ako i samo ako funkcija
vraća referencu
– Ovo važi za sve operatorske funkcije
– Termin lvrijednost označava izraz koji se odnosi na neki
objekat ili funkciju
• Najčeće, u pitanju je izraz koji se može naći sa lijeve strane
znaka jedankosti
18
1.5 Preklapanje ()
class Matrix
{
private:
int** mat;
int r;
int c;
public:
Matrix(int r, int c);
~Matrix();
int& operator()(int i, int j);
};
Matrix::~Matrix()
{
for(int i = 0; i < r; i++) {delete new int[c];}
delete mat;
}
1.5 Preklapanje ()
int main()
{
Matrix m(3,3);
m(0,0) = 1;
//lvrijednost, moze se naci sa
//lijeve strane znaka jednakosti
cout << m(0,0);
return 0;
}
20
1.6 Preklapanje []
• Odgovara mu funkcija operator[]()
• Mora da bude nestatička funkcija
• Ne može da bude globalna funkcija
• Ima tačno jedan argument
– Može da bude proizvoljnog tipa
• Poziva se niz[ind]
– To je ekvivalent niz.operator[](ind)
• Najčešća upotreba
– Kod objekata koji predstavljaju neke kolekcije
21
1.6 Preklapanje []
class Array
{
private:
int* a;
int num;
public:
Array(int num);
~Array();
int& operator[](int i);
};
Array::~Array()
{delete a;}
int& Array::operator[](int i)
{ return a[i];}
int main()
{
Array a(3);
a[0] = 1;
cout << a[0];
return 0;
}
22
class Y
{
private:
X* xPtr;
int num;
public:
Y(X* xPtr) : xPtr(xPtr), num(0){};
X* operator->(){num++; return xPtr;};
int getNum(){return num;}
};
int main()
{
X x;
Y y(&x);
y->data = 5; //(poziva se y->operator->)->data
cout << "data="<< x.data << ",num=" << y.getNum();
return 0;
}
24
int main()
{
X* x[50];
for(int i = 0; i < 11; i++)
{ x[i] = new X;}
return 0;
}
27
1.9 Preklapanje =
• Binarni operator kojem odgovara funkcija
operator=
• Mora da bude nestatička funkcija
• Ne može da bude globalna funkcija
• Mora da ima jedan argument
– Može 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 logično
– Sličan problem kod konstruktora kopije
28
1.9 Preklapanje =
class Array
{
private:
int* a;
int num;
public:
Array(int num): num(num){a = new int[num];};
~Array(){delete a;};
int& operator[](int i) {return a[i];};
};
int main()
{
Array a1(3), a2(2);
a1[0] = 1;
a2 = a1;
a2[0] = 5;
cout << "a1[0]=" << a1[0];
cout << ",a2[0]=" << a2[0];
}
29
1.9 Preklapanje =
30
1.9 Preklapanje =
class Array
{
//isto ka raniije
Array& operator=(Array& arr);
};
delete a;
num = arr.num;
a = new int[num];
for(int i = 0; i < num; i++)
a[i] = arr.a[i];
return *this;
}
int main()
{
Array a1(3), a2(2);
a1[0] = 1;
a2 = a1;
a2[0] = 5;
cout << "a1[0]=" << a1[0];
cout << ",a2[0]=" << a2[0];
}
31
1.9 Preklapanje =
32
delete a;
num = arr.num;
a = new int[num];
for(int i = 0; i < num; i++)
a[i] = arr.a[i];
return *this;
}
41
if (a1 == a2)
cout << "a1==a2" << endl;
else
cout << "a1!=a2" << endl;
a2 = a1;
if (a1 == a2)
cout << "a1==a2" << endl;
else
cout << "a1!=a2" << endl;
return 0;
}
43
class Point
1.12 Inicijalizacija i dodjela
{
private:
float x;
float y;
public:
Point(float x = 0.0, float y = 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 << "Point Op =" << endl; x = p.x; y = p.y;
return *this;}
};
class Circle
{
private:
Point p;
float r;
public:
Circle(float x = 0.0, float y = 0.0, float r = 0.0) : p(x,y), r(r)
{cout << "Konstr : Circle" << endl;}
Circle(Circle& c) : p(c.p), r(c.r)
{cout << "Konstr kop. : Circle" << endl;}
};
int main()
{
Circle c1(1.0,2.0,3.0);
Circle c2 = c1;
c2 = c1;
}
44
int main()
{
Complex c1(1.2, 2.3);
cout << c1;
c1 = 5.0;
cout << c1;
return 0;
}
45
int main()
{
Complex c1(1.2, 2.3);
float f;
f = c1;
cout << f << endl;
return 0;
}