Sunteți pe pagina 1din 41

LECTOR DR.

ADRIAN RUNCEANU
Programare orientat pe
obiecte
Universitatea Constantin Brncui din Trgu-Jiu
Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu
18.10.2012
Programare orientat pe obiecte C++/Java
2
Curs 4
Suprancrcarea operatorilor
(partea I)
Curs 4
18.10.2012
Programare orientat pe obiecte C++/Java
3
1. Suprancrcarea operatorilor
2. Modaliti de suprancrcare a
operatorilor
2.1. Suprancrcarea operatorilor
folosind funcii membre
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
1. Suprancrcarea operatorilor
18.10.2012
Programare orientat pe obiecte C++/Java
4
Operatorii sunt notaii concise, infixate, pentru
operaii matematice uzuale.

Limbajul C++, ca orice limbaj de programare
asigur un set de operatori pentru tipurile
primitive.

n plus, fa de limbajul C, C++ ofer
posibilitatea asocierii operatorilor existeni cu
tipurile definite de utilizator.
1. Suprancrcarea operatorilor
18.10.2012
Programare orientat pe obiecte C++/Java
5
Astfel, prezint interes extinderea
operatorilor:
n aritmetic complex
n algebra matricial
n lucrul cu iruri de caractere, etc
Un operator poate fi privit ca o funcie, n care
termenii sunt argumentele funciei:
n lipsa operatorului +
expresia a+b
s-ar calcula apelnd funcia aduna(a,b)
1. Suprancrcarea operatorilor
18.10.2012
Programare orientat pe obiecte C++/Java
6
Limbajul C++ introduce urmtorii
operatori noi:
1. new i
2. delete - pentru gestiunea memoriei
dinamice
3. operatorul de rezoluie (::) i
4. operatorii de acces la membri: .* i ->*.
1. Suprancrcarea operatorilor
18.10.2012
Programare orientat pe obiecte C++/Java
7
Limbajul C++ permite programatorului s
defineasc diverse operaii cu obiecte ale
claselor, folosind simbolurile operatorilor
standard.
Un tip clas se poate defini mpreun cu un set
de operatori asociai, obtinui prin
suprancrcarea (overloading) operatorilor
existeni.
n acest fel, se efectueaz operaii specifice cu
noul tip la fel de simplu ca n cazul tipurilor
standard.
1. Suprancrcarea operatorilor
18.10.2012
Programare orientat pe obiecte C++/Java
8
Procedeul const n definirea unei
funcii cu numele:
operator simbol
unde:
operator este cuvntul cheie dedicat
simbol este simbolul oricrui operator
C++, mai puin urmtoriii: ., *, ::,
?:, sizeof.
1. Suprancrcarea operatorilor
18.10.2012
Programare orientat pe obiecte C++/Java
9
Vom evita folosirea termenului
redefinire, cruia i vom da o
semnificaie diferit, n contextul
motenirii.
Anumii operatori pot fi utilizai cu
orice tip de termeni (sunt deja
suprancrcai global de ctre
compilator).
1. Suprancrcarea operatorilor
18.10.2012
Programare orientat pe obiecte C++/Java
10
Acetia sunt:
new
delete
sizeof
::
=
&
->*
.*
.
->
1. Suprancrcarea operatorilor
18.10.2012
Programare orientat pe obiecte C++/Java
11
Pot fi
suprancrcai
urmtorii
operatori:
+ *= ->
- %= <<
* ^= >>
/ |= []
% >>= ()
^ <<= new
& == new{}
| != delete
~ <= delete[]
! >=
= &&
< ++
> --
+= ->*
-= ,
1. Suprancrcarea operatorilor
18.10.2012
Programare orientat pe obiecte C++/Java
12
Nu pot fi suprancrcai operatorii:
::
.
.*
?:
sizeof
1. Suprancrcarea operatorilor
18.10.2012
Programare orientat pe obiecte C++/Java
13
Reguli pentru suprancrcare:
Setul de operatori ai limbajul C++ nu poate fi
extins prin asocierea de semnificaii noi unor
caractere, care nu sunt operatori (de exemplu nu
putem defini operatorul **).
Prin suprancrcarea unui operator nu i se poate
modifica aritatea (astfel operatorul ! este
unar i poate fi supraincarcat numai ca operator
unar). De asemeni asociativitatea i
precedena operatorului se menin.
1. Suprancrcarea operatorilor
18.10.2012
Programare orientat pe obiecte C++/Java
14
La suprancrcarea unui operator nu se
pot specifica argumente cu valori
implicite.
Operatorii suprancrcai ntr-o clas
sunt motenii n clasele derivate
(excepie face operatorul de atribuire
=).
Curs 4
18.10.2012
Programare orientat pe obiecte C++/Java
15
1. Suprancrcarea operatorilor
2. Modaliti de suprancrcare a
operatorilor
2.1. Suprancrcarea operatorilor
folosind funcii membre
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
2. Modaliti de suprancrcare a
operatorilor
18.10.2012
Programare orientat pe obiecte C++/Java
16
Exemple:
Pentru exemplificare, folosim tot
tipul abstract complex definit n cursul
anterior i suprancrcm:
operatorul + pentru a putea aduna
dou numere complexe
operatorul - pentru a putea scdea
dou numere complexe
2. Modaliti de suprancrcare a
operatorilor
18.10.2012
Programare orientat pe obiecte C++/Java
17
Funciile operator+() si operator-()
trebuie s primeasc cte doi parametri de
tip complex i s returneze un rezultat de tip
complex i trebuie s aib acces la datele
clasei complex.
Acest lucru se poate realiza n dou
moduri:
1. ca funcii membre ale clasei complex
2. ca funcii prietene ale clasei complex
Curs 4
18.10.2012
Programare orientat pe obiecte C++/Java
18
1. Suprancrcarea operatorilor
2. Modaliti de suprancrcare a
operatorilor
2.1. Suprancrcarea operatorilor
folosind funcii membre
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
2.1 Suprancrcarea operatorilor
folosind funcii membre
18.10.2012
Programare orientat pe obiecte C++/Java
19
O funcie membr primete n mod
implicit adresa obiectului pentru care este
apelat.
Funcia operator+() va avea prototipul:
complex operator+(complex);
Expresia x + y, unde x i y sunt de tipul
complex, va fi interpretat de compilator ca
un apel:
x.complex+(y)
2.1 Suprancrcarea operatorilor
folosind funcii membre
18.10.2012
Programare orientat pe obiecte C++/Java
20
Funcia operator-() va avea prototipul:

complex operator-(complex);

Expresia x - y, unde x i y sunt de tipul
complex, va fi interpretat de compilator ca
un apel:
x.complex-(y)
2.1 Suprancrcarea operatorilor
folosind funcii membre
18.10.2012
Programare orientat pe obiecte C++/Java
21
Programul urmtor prezint o variant mai
simpl a clasei complex, cu operatorii + i -
suprancrcai:
#include<iostream.h>

class complex
{
// date membru protejate(private)
double real;
double imag;
2.1 Suprancrcarea operatorilor
folosind funcii membre
18.10.2012
Programare orientat pe obiecte C++/Java
22
// funcii membru neprotejate
public:
// constructor folosit la iniializare
complex(double x=0, double y=0);
void afiscomplex();
complex operator+(complex);
complex operator-(complex);
};
2.1 Suprancrcarea operatorilor
folosind funcii membre
18.10.2012
Programare orientat pe obiecte C++/Java
23
complex::complex(double x, double y)
{
real=x;
imag=y;
}
void complex::afiscomplex()
{
cout<<real<<" + i * "<<imag;
}
2.1 Suprancrcarea operatorilor
folosind funcii membre
18.10.2012
Programare orientat pe obiecte C++/Java
24
complex complex::operator+(complex x)
{
complex z;
z.real = real + x.real;
z.imag = imag + x.imag;
return z;
}
2.1 Suprancrcarea operatorilor
folosind funcii membre
18.10.2012
Programare orientat pe obiecte C++/Java
25
complex complex::operator-(complex x)
{
complex z;
z.real = real - x.real;
z.imag = imag - x.imag;
return z;
}
2.1 Suprancrcarea operatorilor
folosind funcii membre
18.10.2012
Programare orientat pe obiecte C++/Java
26
int main(void)
{
double x, y;
cout<<"Dati primul numar complex\n";
cout<<"Partea reala = "; cin>>x;
cout<<"Partea imaginara = "; cin>>y;
complex z1(x,y);
z1.afiscomplex();
2.1 Suprancrcarea operatorilor
folosind funcii membre
18.10.2012
Programare orientat pe obiecte C++/Java
27
cout<<"Dati al doilea numar
complex\n";
cout<<"Partea reala = "; cin>>x;
cout<<"Partea imaginara = "; cin>>y;
complex z2(x,y);
z2.afiscomplex();
2.1 Suprancrcarea operatorilor
folosind funcii membre
18.10.2012
Programare orientat pe obiecte C++/Java
28
complex t1, t2;
t1 = z1 + z2;
cout<<"\nSuma celor doua nr. complexe";
t1.afiscomplex();
t2 = z1 - z2;
cout<<"\nDiferenta celor doua nr.
complexe";
t2.afiscomplex();
}
Curs 4
18.10.2012
Programare orientat pe obiecte C++/Java
29
1. Suprancrcarea operatorilor
2. Modaliti de suprancrcare a
operatorilor
2.1. Suprancrcarea operatorilor
folosind funcii membre
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
18.10.2012
Programare orientat pe obiecte C++/Java
30
Funcii prietene (friend)
Exist posibilitatea ca anumite funcii,
care nu aparin unei clase s poat accesa
datele private ale acesteia, caz n care
funciile respective se numesc funcii
prietene.
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
18.10.2012
Programare orientat pe obiecte C++/Java
31
Pentru a ataa unei clase o funcie prieten
introducem n interiorul definiiei sale
prototipul funciei prieten, precedat de
cuvntul cheie friend.
O funcie prieten nu poate accesa datele
direct, aa cum poate o metod a clasei
respective, ci prin intermediul parametrului
de tip obiect transmis.
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
18.10.2012
Programare orientat pe obiecte C++/Java
32
n C++ operatorii pot fi suprancrcai prin
funcii prieten.
Revenind la exemplul cu clasa complex, putem
adauga funcia prieten operator*() care are
urmtorul prototip:
complex operator*(complex, complex)
Expresia x * y va fi interpretat de ctre
compilator ca un apel al funciei
operator*(x, y)
care este perfect echivalent.
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
18.10.2012
Programare orientat pe obiecte C++/Java
33
Exemplul urmtor prezint acest tip de
suprancrcare a operatorilor * i /:
#include<iostream.h>

class complex
{
// date membru protejate(private)
double real;
double imag;
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
18.10.2012
Programare orientat pe obiecte C++/Java
34
// funcii membru neprotejate
public:
// constructor folosit la iniializare
complex(double x=0,double y=0);
void afiscomplex();
// prototipul funciilor prietene
friend complex operator*(complex, complex);
friend complex operator/(complex, complex);
};
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
18.10.2012
Programare orientat pe obiecte C++/Java
35
complex::complex(double x, double y)
{
real=x;
imag=y;
}
void complex::afiscomplex()
{
cout<<real<<" + i * "<<imag;
}
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
18.10.2012
Programare orientat pe obiecte C++/Java
36
complex operator*(complex x, complex
y)
{
complex z;
z.real = x.real * y.real x.imag * y.imag;
z.imag = x.real * y.imag + x.imag *
y.real;
return z;
}
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
18.10.2012
Programare orientat pe obiecte C++/Java
37
complex operator/(complex x, complex y)
{
complex z;
z.real = (y.real * x.real + y.imag * x.imag)
/ (x.real * x.real + x.imag * x.imag);
z.imag=(y.imag * x.real y.real * x.imag)
/ (x.real * x.real + x.imag * x.imag);
return z;
}
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
18.10.2012
Programare orientat pe obiecte C++/Java
38
int main(void)
{
double x, y;
cout<<"Dati primul numar
complex\n";
cout<<"Partea reala = "; cin>>x;
cout<<"Partea imaginara = "; cin>>y;
complex z1(x,y);
z1.afiscomplex();
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
18.10.2012
Programare orientat pe obiecte C++/Java
39
cout<<"Dati al doilea numar
complex\n";
cout<<"Partea reala = "; cin>>x;
cout<<"Partea imaginara = "; cin>>y;
complex z2(x,y);
z2.afiscomplex();
2.2. Suprancrcarea operatorilor
folosind funcii prietene (friends)
18.10.2012
Programare orientat pe obiecte C++/Java
40
complex t1, t2;
t1 = z1 * z2;
cout<<endl<<"Cele doua nr. complexe
inmultite: ";
t1.afiscomplex();
t2 = z1 / z2;
cout<<endl<<"Cele doua nr. complexe
impartite: ";
t2.afiscomplex();
}
18.10.2012
Programare orientat pe obiecte C++/Java
41
ntrebri?

S-ar putea să vă placă și