Post on 02-Mar-2018
transcript
7/26/2019 Alocarea Dinamica de Memorie
1/40
Program
area
1V.1.
Notiunile
de
obiect
qi
metodi
Ideea
de obiect arelabazd o noliune mai simpl6, deja cunoscutd,
gi
aceea de inregistrare
(record).
Aga cum
gtim,
o
inregistrare
este o
coleclie &
de
tipuri
diverse,
pe
care
programatorul
le
reunegte sub un singur
nume
unor anumite scopuri.
Spre
deosebire
de inregistriri,
obiectele
pot
contine,
pel
date, funcfii
gi proceduri.
Una dintre cele mai simple definilii
de
obiect este
urmitoarea:
tl4)e complex=object
re,
im:real;
funct,ion
nodul:rea1i
end;
function complex.modul
:
real
;
begin
modul:
=Eqrt
(egr
(re)
+eqr
(in)
)
;
end;
Pe mdsurd ce vom explica noliunile, definilia de mai sus va c6pdta
Deocamdati,
precizim
cd urmlrim sI introducem un
tip de date care
sI
numerelor complexe.
Cea
mai
simpld cale
de
definire
a
numerelor complexe
ar
pulEf
porneasci
de
la
tipul
de date
record.
Astfel,
putem
si
gdndim
un numdr
ca
fiind
bine
determinat
de
doui
numere reale:
partea
real6
gi
partea
imagi
inregistrare de acest tip
va avea
definilia:
t)T)e
complex=record
re, im:
real;
end;
Am definit aqadar
un
tip
nou
de
inregistrare, numitd complex, asdel
o variabil[ de tip
complex va ft caracterizatd, de dou6 variabile de
tip
Evident,
declararea
unei astfel
de
variabile se
face
obignuit:
var
z:
corrplex;
Vom
avea acces la componenta re
a
lui z in forma. z . re iar la
in forma
z. in.
Definilie
Nofiunea de
obiect
reprezinti un concept
superior
celd
inregistrare
prin
faptul cI
poate
confine
rtit date
(variabile)
cAt
9i
170
T
a
,
u
{
{
L
7/26/2019 Alocarea Dinamica de Memorie
2/40
'{
att
obiectului
gi
care sunt
concepute
de
programator
reprezinte
cAt
mai bine
o anumiti no{iune.
Metodele au acces la membrii obiectului in mod implicit.
Parametrii formali ai
metod:lor
_nu
_p9t_
coincide
cu
variabilele
cuprinieTiTdflnifia-
o-biecTulu
i:
*--
='
Metodele sunt func{ii sau
proceduri
care
fac
ruteanzk
c,rV/VPq4'
/
u
t-/4.t*2t
"--e
drrrr-r'*
)
cAfi
a-
(1b4 .A/
{
Sd
revenim
la
nofiunea
de
numdr complex
gi
sd
ne g6ndim cd,
de
fapt,
a$a
cum
gtim,
numerele
complexe au
gi
alte
rndrimi
caracteristice. Una
dintre
ele
modulul.
Va
fi
de
dorit
sd completdm
definilia
cu o metodi care
sd
reprezinte
lul
modulului numdrului
complex.
Asta vom
face,
specificAnd
faptul
c5,
prin
dou[
numere
reale,
degi
corectd,
este insuficientd.
De ce ?
pentru
ic,definiliaunui.glj
yffi
Obiectul nostru
va avea definilia:
tfrlre comlrlex
=
object
fer irn
: real;
function
modul:rea1;
endi
qcluhtk
/)"4r*
bAa?
al^-
f7
:-7oA'
Fare
nu
are
nici
un
argument
gi
care
intoarce o
valoare
reald.
Sd
descriem
cornplet
te:
eal
i
+sqr(im)
);
td de funclie
cu difcrenfa_cd
numele
ruiaii
aparJine.
Nirnic
surprinzdtor, in
e membre
prin
intcrmediul numelui
prelucreazl
datele
comporrente ale lui z,
lui
complex z.
Sd
observdm ca funclia are acces la
variabilele re
gi
im in mod implicit
({ErI
o
calificare
suplimentari). Apelul
funcliei modul
in
forma
z.modul face
ca variabilele
re
gi
l.n
sa fie exact datele membre
ale
lui
z.
parte
din definifia
in aqa
fel incAt
si
Ce
fel
de func1ie este
modul
? Evident,
dupi
cum se vede,
este
o
funcfie
obiectului care apeleazi
metoda.
Funcfiile
membre ale
unui
obiect
prelucreazl
datele membre
ale
Definilie
7/26/2019 Alocarea Dinamica de Memorie
3/40
in
continuare
vom
prezenta
modul
in
care
se
face
inilializarea
membre ale obibctelor,
numite
gi
membrii
de tip
date
ai obiectului.
Li
Pascal
pune la
dispozilie o metodd
special[
gi
anume metoda constructor.
1V.2.
Metoda
constructor
Aceasta este o metodd in sens obignuit,
care
poate
fi inclusl in
shiechrlui.
Lafel
ca
qi
alte metode,
ea
poate
avea sau nu
parametri.
In
cazul
in
dorim sd
aibi
parametri
acegtia trebuie
sd
difere
de
datele
componente'
obiectului
pentru
a
se
elimina
pericolul
de
3mbiguitate
(deoarece
metodelc
oricum acc-es
la
datele membre
ile obiectuluilMmf&finirii unui
este aceeagi
cu
a
unei
funcfli
sau
proceduri,
cu
deosebirea
cI
antetul
este
de cuvAntul const,ructor
(cuvAnt
rezervat
4limbajului)t
-r,
Exemolu
-2F*.-^^-.)-E-.:L:^-t.:-- -t-.:---J.^t^..-,
t\
Putem
introduce
in
definifia obiectului complex, urmltoarea
declara[ie
a
constructor:
consEructor
Lnlt
(a,b:real)
;
in
exteriorul dehni{iei obiectului
complex
urmeazl
sI descriem
modul
de
constructorului.
conatructor complex.
init
(a,b
: real)
;
begln
re:
=ai
Lm:
=bi
I
end;
"
r.r1"
Apelul
constructorului se
iace prin
calificarea obignuitd. Astfel, daci z este
obiect
de
tip courplex,
atunci
instrucfiunea:
z.cggpl6x(10,12);
va
avea
drept efect inilializarea datelor
componente
ale
lui
z
astfel
incdt
z.
re
va
valoarea 10 iar z. Lm va
avea
valoarea 12.
Initia-lizar0)
and
(y>0)
then
cadran:=1i
lf
(x0) then
cadran:=2i
tf
(x
7/26/2019 Alocarea Dinamica de Memorie
27/40
S[ remarcim faptul ci
pe
l6ngd defuri{iile cerute
a aplmt
un
element nou
gi
variabila
pt.
Aceasta a
fost
declaratd ca
variabild
globabld
la inceput,
9i,
pentru prima
observIm
rolul sec{iunii begJ.n end
a
unit-ului, in care am dat efectiv o
valoare variabilei
fi ..,
prinintermediulfuncfeirigonomericearcEan.Deoarece
arctan(1)
=;
obfinempi=lc
'Este
simplu de vlzut cI
un
program
care:utilizeazd
func{iile cadran
gi
a
pentru
o
variabild
de tip conprex,
poate
arita astfel:
progrrrn
tEt,
ugeB
P_ci
vai
z:complex;
begin
z.Lnlt(2,-41i z.afiai
wrLteln
(z.
cadran)
;
wrlteln
(z.
argu.rrent)
;
end.
Construi(i
prin
mo$tenire
gi
polimorfism
un
punct
in spafiu care si redefineasci funclia
"distan{6"
de la
punct
la
originea sistemului
de
coordonate.
Pomim
de
la definilia obiectului
punct
de
la
prima problemi:
tlT)e
puncts e
obJect
:
7/26/2019 Alocarea Dinamica de Memorie
28/40
un element
nou
$i
anurc
inceput,
gi,
pentru
prima
efectiv o valoare
variabilei
pr.
=
I
obfinempi=rc
4
cadran
gi
arguneat'
Realizafi proceduri
care se
efectueze
complex
folosind
unit-ul imaginar.
tpu.
R.4.
Sumd
Ei
produs
Pornim
de
la definiliile cunoscute
ale
sumei
gi
produsului:
(a
+
ib)
+
(u +
iv) -
a
+ u +
i(b
+
v)
(a
+
ib)
(u
+ iv)
=
au
-
bv
i
i(av
* bu)
Cel mai simplu
este
se
folosim
chiar
constructorul
din definifia
tipului complex
pentru
a
ini{ializa partea
reald
gi
partea
imaginari a
sumei, respectiv
produsului
a
doud
obiecte
de
tip complex.
uees imaginar;
procedure
euma(x,y:complex;
var z:complex)
;
begin z.Lnit(x.re+y.re,x.im+y.irn)
;
end;
procedure
produe(x,y:complexi
var
z:complex)
;
begin
z
.
init
(x.
re*y. re-x.
iur*y. Lur, x.
re*y.
im+x. im*y.
re)
;
endi
var
*,Y,
z: complex;
begin
x.lnit
(2,9)
i
y.
init
(4,11
t
Euna(x,y, z)
i
z.af igare;
produs
(x,y,zl
i
z.af isarei
end.
celor
trei
coordonate-
inilializdm
gi
coordonata
nfl
reprezentAnd
diagonab
de coordonate
gi
vdrful
suma
$i
produsul
obiectelor
de tip
1) Modificali
prin
mogtenire
$i
polimorfism
constructorul din definilia tipului
urmetor astfel incdt
variabila
x sd fie inilializata cu
valoarea
2.
tlpe te8t
=
object
:c :
real
i
conetructor
init;
end;
conEEructor tseEE.
init;
begln x:=31
end;
2l Modificali
prin
mogtenire
gi
polimorfism procedura
de
afigare
a
obiectului
definit in
continuare astfel incdt
datele
sI fie
afigate
in
ordine
inversd
tlpe afle
=
obJect
x,y
:
real;
conatrucEor
init;
procedure
t,ipar;
end;
conatrucEor afLe.
lnlt;
begln
x:=
0i
y:=0,
end;
proeedure
afls.tlpar;
begin
writeln
(
rx= I
,x,
'
y='
,y) ;
end;
3)
Modificali
prin
mogtenire
gi
polimorfism
funcfia de incrementare din definilia
obiectului
urmdtor astfel
incit
si.realizeze
decrementarea
valorii membrului
de tip
datd.
197
7/26/2019 Alocarea Dinamica de Memorie
29/40
tl4)e
nu.n
.
object
n : Lnteger;
conaErucEor Lnl,t
(a:
.ntcgcr)
;
fuacELon func:
J,nt,eger;
,
eDdi
coaEtrucEor nun.lnit(a:lnteger)
i
'
begln n -ai end,
functLon
nusr. func: Lnt,egr,
begln func:=n+1i
endi
4) Modificafi
prin
mo$tenire
gi
polimorfism
funcfia
membru
a
obiectului
urmitor
astfel
incdt
valoarea
intoarsi
sd
fie
de
tip real
t1rye Latreg
r
obJect
n :
J.ntegcr;
conetructor
LnLt
(a
: J.nteger)
;
functloa
va1
:
J.ateger;
endt
coaat,ructor
lntreg.inLt(a:lnteger)
i
,
begln
n:-a,
endi
func t,Lon
J,ntreg
.
val : lnt,eger
;
begln
val:-ni end;
1V.5.2.
Concepte rafinate:
inherited,
virtual
si
self
Atributul lnherited
Polimorfismul
prezentat
in secfiunea
anterioar[
are
in limbajul Pascal
doui
t
gr
cea
Sd
dim un
exemplu
credem,
foarte
sugestiv.
*_Exenplu_
r-
Presupunem
cE
avem
doul definilii
de obiecte:
uau
gi
aoi.
Obiectul de
tip
dol.
ya
fi urmag al lui unu
(sau
unu este stramog al
lui
aor). Fiind o construcJie
foarte simpld nu
vom
declara
un
unLt
separat
ci
vom include
in
acelaqi
text sursi
gi
definitiile
gi
programul
ilustrativ.
incepem
cu obiectul
unu care are definifia
urmetoare:
t*'
:":
i"::l:::
coDatructor
lnit
(a:
Lnteger)
;
functl,on
putere
: integer;
end;
Agadar,
acest
obiect confine o variabil5
de
tip intreg
gi
dou[
metode:
un
coaatructor
gi
o
funcfie numiti
putere.
198
.
Du
parametrulu
puterii
a
dou
De
posibilitatea
Fal
modifica
mo
putere
va
f
Sd
Ca
ea
mo$tenit5
furnizarea
v
furniza
valo
mogtenit[
d
adusi de lim
sintactic,
o a
conduce
la
din obiec
---G*ffi
Vo
conceptulu
Inc
comparafie
Acum
vom
permite
de
M
momentu
7/26/2019 Alocarea Dinamica de Memorie
30/40
a
obiectului
urmltor
constructor
unu. init
(a:
lnteger)
;
begJ.n
n:
=ai
end;
DupI cum
se
vede,
constructorul
inilializeazd,
pur
gi
simplu
pe
n
cu
valoarea
parametrului
a. Func[ia
putere
prezentatd
mai
jos
nu
face
decdt sd intoarcl
valoarea
puterii
a doua
a lui n.
functLon unu.
put,ere
: lntegep;
begln
putere:=sqr(n)
;
end;
Desigur
cd,
prin
mogtenire,
datele
gi
metodele
se
transmit
urmagilor
avdnd
posibilitatea
de
modificare
a
metodelor.
SE
urmdrim
definilia
de
mai
jos:
tlpe
doJ.
=
obJect(unu)
function
putere
:
integer;
end;
Fa[i
de datele
gi
metodele
mogtenite am
anuntat un singur lucru,
gi
anume
cd vom
modifica modul
de ac{iune
al
funcfiei
putere,
mo$tenite
din unu. Noua defini]ie a
funcfiei
putere
va
fi:
functlon
doi.putere : integer;
begln
putere:-lnherit,ed
putere
+ 1; end;
Sd explicdm modul
de lucru,
foarte
simplu,
care
se
rezume h atribuirea:
puter:=inherLted
putere
+
1;
Califrcativul
lnherited
din
dreapta
va
cere
execufia
funcliei
putere
a$a
cum este
ea
mogtenitd de
la
stramogul
unu.
Agadar,
apelul functiei
putere
din
dreapta
se
va
solda cu
furnizarea valorii
n2 . La
aceasta se
adaugl
r
gi
in final func{ia
puter
a
obiectului
doi va
furniza valoarea
,r2 + f. intr-adevir,
noua
funcfie
putere
are un alt efect
decdt cea
mogteniti
dar toflrgi
o
folosegte
pe
aceasta
Acest rafinament
este
o
contribufie
importantd
adus[
de limbajul
Pascal
conceptului
de
polimorfism.
Facem
observafia cd, degi
corect[
sintactic, o atribuire
de
forma
putsere:=putere
+ 1i
conduce
la
o
eroare
de execute
fiind
in realitate un
apel
recursiv
infinit al
funcfiei
putere
in
limbajul
Pascal
doud
pe
obiecte
in
dar modificati
de cdtre
exemplu
simplu,
dar
obiectul
de
trp aol
va
foarte
simpl5
nu
gi
definifiile
gi
programul
___0
then begln
cLfre(n dtv 10);
wriEe(n
mod
10);
end;
endi
procedure
doi.clfre;
begln Lf
n>0
then
begin
cLfre(n dlv 2);
wrlte(n
rrod
2);
endi
end;
var
A zeceiB:dol;
begin
A.lnlE;
A.cifre(2305)
;
wrlteln;
B.Lnil; B.cifre(2305)
i
radlni
end.
baza
2,
realizdm
imp5(irea
2);
dar
atrage aten(ia
asupra
le
credm
nu
se
referd la
spus,
prin
obiecte modeldm
secliunea de aprofundare
obiecte
a
altor tehnici.
am mai fdcut
Definili un obiect
de tip matrice
gi
realizali
alocarea
dinamici
gi
eliberarea
dinamici
a
memoriei.
Ln baza 2')
;
Cea mai simpld exemplificare
a
cerinfei din
enunt
este
prezentatd
in continuare.
Obiectul de tip
talrou confine drept date
o
matrice
gi
un intreg
care va
reprezenta
dimensiunea
efectivi
a
matricei.
Funcfia dtag calculeazd suma elementelor de
pe
diagonala
principal5
a
matricei. Constructorul
gi
destructorul
afigeazI textele
cores-
punzltoare
acfiunii
efectuate, constructie
respectiv distrugere.
Progran
_natrLce;
tlpe matrico
=
arrayt1..10,1..101
of real;
tlpe
tablou
-
object
m:uatricei
n
:
J,nteger;
conEtructor
gen
(J,
:
Luteger)
;
destructor dLa;
functlon dlag:real;
endi
construcEbr
tsablou.
gen
(
i: l.nteger)
;
var
J:lnEeger;
begJ.n
n:
=1.
i
for
J:-1
Eo n do mlJ,JI:=J;
wrlteln(tan creaE
un oblectt);
endi
deetructor
Eablou.
die;
begln
wrl,teln
(
'am
dLetrue un
obl,ect'
) ;
end;
functLon
t,ablou. dl.ag :
real
;
var
J:Lntgri
e:real
begln
e:-0i
207
in
baza
10')
;
7/26/2019 Alocarea Dinamica de Memorie
39/40
for
J:-1
to n do s:.E+m[J,Jl,
dJ.ag:
=a;
ndi
var
M:^tabI0u;
begJ.n
new(M,gen(5)
);
wrlEeln
(U^.dlag)
;
readln;
diepoee
(M,
dia)
;
end.
Programul
creazd un obiect alocat
dinamic. Constructorul asigurd
cd
elementele
de
pe
diagonala
principald
au
valori
egale
cu
linia
(coloana).
Urmeazd
afigarea
sumei
elementelor
de
pe
diagonala
principald
gi
distrugerea
obiectului.
1) Asociagi
destructori
care sA afiteze
un
text corespunzltor
actiunii
de
distrugere
$i
tealizati alocdri
9i
eliberlri
dinamice de memorie
pentru
obiecte
de
tip
fractie,
rat, .ona1,
punct
gi
conplex
definite in
acest
capitol.
2)
Precizali
care dintre afirmafiile
urm5toare sunt
adev[rate:
a) Alocarea dinamicl
se
realizeazd
prin
apelul constructorului
obiectului.
b)
Alocarea dinamic6
se
realizeazd,
de cltre
procedura
new
care are drept
parametri
un
pointer
cltre
obiect
gi
constructorul
acestuia.
c)
Diskugerea
este insolitl de
gtergerea
efectivl a
conlinutului
memoriei.
d)
Distrugerea
elibereazi memoria
care
insd igi
va
schimba
con{inutul numai in
urma
'
unei alte alocdri.
3)
Precizali
care
dintre
afirmafiile
urmdtoare sunt
false:
a) Destructorul
obiectului
este
parametru
al
procedurii
dlepoae.
b)
,
Procedura
dlapose are
drept
paramentri
un
pointer
cltre
obiectul care va
fi
distrus
gi
destructorul
clasei.
c)
Distrugerea
efectivd a unui obiect
se
realizeazd
de
destructorul
clasei.
d)
Destructorul permite
descrierea unei
acfiuni
care
insofegte distrugerea.
1V.7.
Descrierea formali
a obiectelor
Din
tot ceea
ce am spus
despre
obiecte
putem
inlelege c6,
in
definitiv,
notiunea
de
obiect
poate
fi
inleieasi
printr-o
descriere
formail,
dupd
cum
urmeazd:
I
a"t"
obiect r
i
fapt
care
reflecta
ceea
ce .r,
,r[::i"unr-"
c6 un
obiect
se
compune din date
gi
metode;
datele
9i
metodele
pot
se
apar[ explicit
(declarate)
sau
implicit
(rnogtenite).
I
a"t. ale lisDajului
d.ate
-)
]"fte
Eipuri
definite
I
I
date de
tip
obiect
208
Date
standard ale
l
Desc
.
C
i
o
D
i
o
F
AtAt
Meto
virtuale
sunt
in
sf[rgit,
din
.
.
Vom
tehnici de ma
obiect
care s
probleme
rez
damelor, amb
Vom
care va
inilial
7/26/2019 Alocarea Dinamica de Memorie
40/40
asigurd cd
elementele
de
Urmeazd, afigarea
sumei
acfiunii
de
distrugere
obiecte
de tip fractie,
obiectului.
care are drept
parametri
un
memoriei.
con[inutul numai
in
urma
Datele
(sau
membrii
de
tip
date cum
mai
sunt numili)
pot
fi
atAt tipuri
standard
ale
limbajului,
alte
tipuri
definite
sau
chiar
date de
tip
obiect.
ctsori
tori
ii
uri
Descrierea
formald
reflectd
faptul
cd
prin
metode inlelegem:
o
Constructorii
(cei
care
perrnit inilializarea datelor
gi
stabilirea
legiturii
intre
obiectul declarat
qi
metodele
sale virtuale).
o
Destructorii
(cei
care dau
posibilitatea
de asociere
unei acliuni
care
insolegte
distrugerea).
o
Func(iile
gi
procedurile
incluse
in definilia obiectului.
Atdt
funcliile cdt
gi
procedurile pot
fi statice
sau
virtuale.
i
etaEice
i
virtsuale
eduri
etsatice
eduri
virtsuale
Metodele
statice
sunt alocate obiectelor
inc6
in
faza de compilare,
cele
virtuale sunt apelate la
execufie.
in sflrgit,
din
punctul
de vedere al modului de alocare
obiectele sunt:
o
Statice,
alocate
pe
intreg
parcursul
execufiei
programului
gi
care nu
pot
fi
distruse.
o
Dinamice,
alocate de
procedura
new
in
heap
gi
distruse cu
procedura
dispose.
Obiectele
dinamice
sunt accesate
prin pointeri.
false:
obiectul care va
fi
distrus
gi
clasei.
distrugerea.
inlelege
cd, in
definitiv,
dupd
cum
urmeaz6:
se
compune
din
date
gi
sau
implicit
(rnogtenite).
Vom
constata
ci
programarea
pe
obiecte
permite
chiar modelarea
unor
tehnici
de mare corrplexitate
gi
vom exemplifica
prin
constructia
unei definilii
de
obiect care
sd
reflecte
tehnica
Backtraking.
Obiectele de acest tip
vor fi
chiar
probleme
rezolvate
prin
aceast[ tehnici,
a$a
cum este
problema
permut[rilor
sau
a
damelor,
ambele
studiate
inc[
din
clasa
a X-a.
Vom
porni
de
la
o sistematizare
a
procedurilor,
gi
anume:
procedure
init;
care
va iniltaltza
elementele
specifice ale
unei
probleme
date:
209
Tehnica
Backtracking
gi
urmagi
care
rezolve
problema
permutarilor
gi problema
damelor
1V.8.
Aprofundare: