Documente Academic
Documente Profesional
Documente Cultură
Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu
Programare orientat
pe obiecte
LECTOR ADRIAN RUNCEANU
Curs 6
Suprancrcarea operatorilor
(partea III)
24.10.2013
Curs 6
3
24.10.2013
24.10.2013
24.10.2013
24.10.2013
int main(void)
{
rational a(3,5), b(5,7), c(7,9);
a.afisare();
b.afisare();
c.afisare();
a = (b, c); cout<<endl;
a.afisare();
b.afisare();
c.afisare();
}
24.10.2013
24.10.2013
Curs 6
9
24.10.2013
2. Suprancrcarea operatorului
selecie indirect (->)
10
obiect->camp
variabila obiect va apela funcia operator, care
24.10.2013
2. Suprancrcarea operatorului
selecie indirect (->)
11
24.10.2013
2. Suprancrcarea operatorului
selecie indirect (->)
12
Exemplul 2:
class c{
public:
int n;
c* operator->()
{
cout<<Supraincarcare operator -> ;
return this;
}
// . . . .
};
De acum, n utilizarea unui obiect ob din clasa c, ob->i va fi
echivalent cu ob.i.
Curs - Programare orientat pe obiecte C++/Java
24.10.2013
Curs 6
13
24.10.2013
24.10.2013
24.10.2013
Exemplu 3:
#include<iostream.h>
class num{
int x;
public:
num (int x);
num& incrementeaza();
void afis();
};
Curs - Programare orientat pe obiecte C++/Java
24.10.2013
num::num(int x)
{
this->x = x;
}
num& num::incrementeaza()
{
x++;
return *this;
}
24.10.2013
void num::afis()
{
cout<<x<<endl;
}
int main(void)
{
num a(3);
a.afis();
a.incrementeaza();
a.afis();
a.incrementeaza().incrementeaza();
a.afis();
}
Curs - Programare orientat pe obiecte C++/Java
24.10.2013
24.10.2013
24.10.2013
membru
incrementeaza()
care
incrementeaz valoarea reinut de data
membru x i returneaz o referin ctre
obiectul curent, cu ajutorul creia se poate din
nou, incrementa x.
Astfel, dac obiectul a are iniial valoarea 3, x
va reine 3, a.incrementeaza() are ca efect
faptul c x va retine 4, dar n acelai timp i
referina ctre x, creia i se poate aplica din nou
incrementeaza().
24.10.2013
Curs - Programare orientat pe obiecte C++/Java
Exemplu:
Sa se scrie un program care creeaza o clasa
putere, pentru calculul ridicarii unui numar la o
putere (presupunand ca valoarea exponentului este
pozitiva), cu ajutorul pointerului "this".
24.10.2013
#include <iostream.h>
class putere{
double b;
int e;
double valoare;
public:
putere(double baza, int exponent);
double calculeaza() {return this->valoare ;}
};
Curs - Programare orientat pe obiecte C++/Java
24.10.2013
24.10.2013
int main()
{
putere x(4,3);
putere y(2.5,1);
putere z(5.7,0);
cout<<x.calculeaza()<<endl;
cout<<y.calculeaza()<<endl;
cout<<z.calculeaza()<<endl;
}
Curs - Programare orientat pe obiecte C++/Java
24.10.2013
Curs 6
26
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
27
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
28
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
29
Observaie:
Spre deosebire de modalitatea clasic de
utilizare prefixat, n care participarea la expresii
se face cu valoarea incrementat, iar n cazul n
care operatorul este postfixat, participarea la
expresie se face cu variabila neincrementat,
dup care se incrementeaz, n cazul
suprancrcrii acestor operatori, ntotdeauna
se incrementeaz valoarea, dup care
aceasta intr n calcul.
Curs - Programare orientat pe obiecte C++/Java
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
30
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
31
Exemplul 4:
Folosind
clasa
complex
(care
gestioneaz numere complexe), putem
suprancrca operatorul ++ pentru a
incrementa partea real a unui numr
complex.
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
32
#include<iostream.h>
class complex
{
// date membru protejate (private)
double real;
double imag;
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
33
public:
// constructor folosit la initializare
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
34
complex operator++();
//supraincarcarea operatorului ++ postfixata
complex operator++(int);
// afiseaza numarul complex
void afiscomplex();
};
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
35
complex::complex(double x, double y)
{
real = x;
imag = y;
}
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
36
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
37
complex complex::operator++()
{
real++;
return *this;
}
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
38
complex complex::operator++(int)
{
real++;
return *this;
}
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
39
void complex::afiscomplex()
{
cout<<real<<" + i * "<<imag<<endl;
}
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
40
int main(void)
{
complex z(2,1), z1, z2;
cout<<"z initial = ";
z.afiscomplex();
z1 = ++z;
z2 = z++;
cout<<"z1 = ";z1.afiscomplex();
cout<<"z2 = ";z2.afiscomplex();
cout<<"z final = "; z.afiscomplex();
}
24.10.2013
4. Suprancrcarea operatorilor de
incrementare (++) i decrementare (--)
41
24.10.2013
Aplicaie rezolvat
42
#include<iostream.h>
class vector{
private:
int *a; //vectorul va avea un numar variabil de
componente si deci spatiul necesar il vom aloca in heap
int n;
// numarul de elemente
24.10.2013
public:
43
// constructor implicit
vector();
// constructor
vector(int *a, int n1);
//destructor
~vector();
// determina cel mai mic element din vector
int min();
//afisarea elem. unui vector
void afisare();
// testeaza egalitatea a doi vectori
friend int egali(vector &v1, vector &v2);
Curs - Programare orientat pe obiecte C++/Java
24.10.2013
44
24.10.2013
45
24.10.2013
46
vector::~vector()
{
cout<<"se elibereaza "<<
n*sizeof(int) << " octeti"<<endl;
delete[ ] a;
}
24.10.2013
47
int vector::min()
{
int m;
m = a[0];
for(int i=1; i<n; i++)
if(a[i] < m) m = a[i];
return m;
}
Curs - Programare orientat pe obiecte C++/Java
24.10.2013
48
void vector::afisare()
{
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
24.10.2013
49
24.10.2013
24.10.2013
void vector::ord_cresc()
{
51
//ordonarea elem. unui vector
fol. metoda bubblesort
int i, j, aux, k;
do{
k = 1;
for(i=0; i<=n-1; i++)
if(a[i] > a[i+1])
{
aux = a[i];
a[i] = a[i+1];
a[i+1] = aux;
k = 0;
}
}while(k == 0);
}
Curs - Programare orientat pe obiecte C++/Java
24.10.2013
24.10.2013
53
if(i<=v1.n)
for(l=i; l<v1.n; l++)
v3.a[l++] = v1.a[l];
else
for(l=j; l<v2.n; l++)
v3.a[l++] = v2.a[l];
}
Curs - Programare orientat pe obiecte C++/Java
24.10.2013
int main(void)
{
54
int x[ ]={7,6,3,3,1};
int y[ ]={6,55,44,3,2,10};
vector v1(x,5), v2(y,6);
cout<<"Vectorul v1 = ";
v1.afisare();
cout<<"Vectorul v2 = ";
v2.afisare();
cout<<"Minimul din v1 este egal cu
"<<v1.min()<<endl;
cout<<"Minimul din v2 este egal cu
"<<v2.min()<<endl;
24.10.2013
24.10.2013
56
int z[50];
vector v3(z,11);
cout<<"\nVectorul interclasat v3= ";
inter(v1,v2,v3);
v3.afisare();
}
24.10.2013
24.10.2013
58
ntrebri?
24.10.2013