Documente Academic
Documente Profesional
Documente Cultură
Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu
Programare orientat pe
obiecte
LECTOR DR. ADRIAN RUNCEANU
Curs 5
Suprancrcarea operatorilor
(partea II)
01.11.2011
Curs 5
3
01.11.2011
1. Suprancrcarea operatorului de
atribuire(=)
4
01.11.2011
1. Suprancrcarea operatorului de
atribuire(=)
5
01.11.2011
1. Suprancrcarea operatorului de
atribuire(=)
6
01.11.2011
1. Suprancrcarea operatorului de
atribuire(=)
7
01.11.2011
1. Suprancrcarea operatorului de
atribuire(=)
8
Exemplu
01.11.2011
1. Suprancrcarea operatorului de
atribuire(=)
9
Clasa va avea:
un
01.11.2011
1. Suprancrcarea operatorului de
atribuire(=)
10
01.11.2011
1. Suprancrcarea operatorului de
atribuire(=)
11
#include<iostream.h>
#include<string.h>
class sir{
char *adr;
public:
sir(char s[]);
~sir();
void afis();
void operator=(sir& sirul);
};
Curs - Programare orientat pe obiecte C++/Java
01.11.2011
1. Suprancrcarea operatorului de
atribuire(=)
12
sir::sir(char s[ ])
{
cout<<"Constructor"<<endl;
adr = new char[strlen(s) + 1];
strcpy(adr,s);
}
sir::~sir()
{
cout<<"Destructor"<<endl;
delete[ ] adr;
adr = 0;
}
Curs - Programare orientat pe obiecte C++/Java
01.11.2011
1. Suprancrcarea operatorului de
atribuire(=)
13
void sir::afis()
{
cout<<adr<<endl;
}
void sir::operator=(sir& sirul)
{
cout<<"Operator = "<<endl;
delete[ ] adr;
adr = new char[strlen(sirul.adr) + 1];
strcpy(adr, sirul.adr);
}
Curs - Programare orientat pe obiecte C++/Java
01.11.2011
1. Suprancrcarea operatorului de
atribuire(=)
14
int main(void)
{
sir s("un sir"), t("alt sir");
s.afis();
t.afis();
s = t;
t.~sir();
s.afis();
cout<<"Sf. program"<<endl;
}
Curs - Programare orientat pe obiecte C++/Java
01.11.2011
1. Suprancrcarea operatorului de
atribuire(=)
15
01.11.2011
Curs 5
16
1. Suprancrcarea operatorului de
atribuire(=)
2. Suprancrcarea operatorului de indexare
([ ])
3. Suprancrcarea operatorului apel de
funcie(())
4. Suprancrcarea operatorilor new i delete
01.11.2011
2. Suprancrcarea operatorului de
indexare ([ ])
17
01.11.2011
2. Suprancrcarea operatorului de
indexare ([ ])
18
Exemplu 2:
01.11.2011
2. Suprancrcarea operatorului de
indexare ([ ])
19
01.11.2011
2. Suprancrcarea operatorului de
indexare ([ ])
20
01.11.2011
2. Suprancrcarea operatorului de
indexare ([ ])
21
#include<iostream.h>
#include<string.h>
class analize;
class pers
{
// datele personale
char nume[35];
double greutate;
int varsta;
friend analize;
public:
// functii de introducere persoane si tiparire
01.11.2011
2. Suprancrcarea operatorului de
indexare ([ ])
22
01.11.2011
2. Suprancrcarea operatorului de
indexare ([ ])
23
class analize
{
pers *sir;
int n;
public:
// definire constructori
01.11.2011
2. Suprancrcarea operatorului de
indexare ([ ])
24
// supraincarcare operatori
void introd();
pers *operator[] (char *);
pers *operator[] (double);
pers *operator[] (int);
};
01.11.2011
2. Suprancrcarea operatorului de
indexare ([ ])
25
void analize::introd()
{
for(int i=0;i<n;i++)
{
cout<<endl;
cout<<"Persoana "<<i+1<<" : ";
cin>>sir[i].nume;
cout<<"Greutatea: ";
cin>>sir[i].greutate;
cout<<"Varsta: ";
cin>>sir[i].varsta;
}
}
Curs - Programare orientat pe obiecte C++/Java
01.11.2011
2. Suprancrcarea operatorului de
indexare ([ ])
26
01.11.2011
2. Suprancrcarea operatorului de
indexare ([ ])
27
01.11.2011
2. Suprancrcarea operatorului de
indexare ([ ])
28
01.11.2011
2. Suprancrcarea operatorului de
indexare ([ ])
29
int main(void)
{
char c; int nr;
cout<<"Cate analize efectuati ? "; cin>>nr;
analize t(nr); t.introd();
while(1)
{
cout<<endl<<"Optiunea [g]reutate,
[n]ume, [i]ndex, [e]xit ? ";
cin>>c;
Curs - Programare orientat pe obiecte C++/Java
01.11.2011
2. Suprancrcarea operatorului de
indexare ([ ])
30
switch(c)
{
case 'g' : double g;
cout<<"Greutatea: ";cin>>g;
t[g]->tipar();
break;
case 'n' : char n[100];
cout<<"Numele: ";cin>>n;
t[n]->tipar();
break;
case 'i' : int i;
cout<<"Nr. de index: ";cin>>i;
t[i]->tipar();
break;
case 'e': return;
}
}
}
Curs - Programare orientat pe obiecte C++/Java
01.11.2011
Curs 5
31
1. Suprancrcarea operatorului de
atribuire(=)
2. Suprancrcarea operatorului de indexare
([ ])
3. Suprancrcarea operatorului apel de
funcie(())
4. Suprancrcarea operatorilor new i delete
01.11.2011
01.11.2011
01.11.2011
Exemplu 3:
01.11.2011
#include<iostream.h>
#include<stdlib.h>
struct elem{
int inf;
elem *adr;
// se initializeaza camp inf cu n
01.11.2011
class list{
elem *prim,*p;
public:
// functie de afisare element curent
void afispoz()
{ cout<<"Elementul de pe pozitia curenta
are valoarea "<<p->inf<<endl;}
//primul element va avea adresa absoluta zero
01.11.2011
list(int);
// supraincarcarea operatorului realizeaza pozitionarea la
nodul urmator;
//Daca pozitia curenta este la sfarsitul listei, atunci nodul
urmator va fi primul element al listei
01.11.2011
exit(1); }
01.11.2011
elem *list::operator() ()
{
elem *poz=p;
poz = p->adr ? p->adr+1 : prim;
return p=poz;
}
01.11.2011
01.11.2011
int main()
{
list l(6);
l();
l.afispoz();
l(2);
l.afispoz();
}
01.11.2011
Curs 5
42
1. Suprancrcarea operatorului de
atribuire(=)
2. Suprancrcarea operatorului de indexare
([ ])
3. Suprancrcarea operatorului apel de
funcie(())
4. Suprancrcarea operatorilor new i delete
01.11.2011
01.11.2011
01.11.2011
01.11.2011
Operatorul
delete
suprancrcat
pastreaza proprietatea de a apela intotdeauna
destructorul clasei inainte de a elibera
memoria alocata dinamic obiectului.
Utilizarea versiunilor standard new si
delete se poate face cu ajutorul operatorului
de rezolutie (::).
01.11.2011
Exemplu 4:
Exemplu de suprancrcare a operatorilor new
si delete:
#include<iostream.h>
class exemplu
{
int a, b, c;
static short l;
01.11.2011
public:
exemplu()
{
cout<<Apel constructor exemplu <<endl; }
~exemplu()
{
cout<<Apel destructor exemplu <<endl; }
void *operator new(size_t ln)
{
cout<<Operator new redefinit ! ;
return (void *) new char[ln];
}
Curs - Programare orientat pe obiecte C++/Java
01.11.2011
01.11.2011
01.11.2011
51
ntrebri?
01.11.2011