Programo
w
anie
obiekto
w
e
W
ykª
ad
1.
W
p
ro
w
adzenie,
p
o
dsta
w
o
w
e
p
oj ia
p
rogramo
w
ania
obiekto
w
ego
w
jzyku
C++
Program
wykª
adu
Programo
w
anie
obiekto
w
e
w
jzyku
◮
C++
◮
Java
◮
Rub
y
Literatura
◮
C++
Jerzy
Grb
osz
Symfonia
C++,
T
om
I,
I
I,
I
I
I,
O yna
Kallima h,
Krak
ó
w
Jerzy
Grb
osz
P
asja
C++,
T
om
I,
I
I,
O yna
Kallima h,
Krak
ó
w
◮
Java
Bru e
E k
el
Thinking
in
Java,
Helion,
2001,
ró
wnie»
wydania
p
ó¹niejsze
(versja
angielsk
a
Thinking
in
Java
dostpna
b
ezpª
atnie
w
Internie ie)
◮
Rub
y
Dave
Thomas
Chad
F
o
wler,
Andy
Hunt,
Programo
w
anie
w
jzyku
Rub
y,
(w
ersja
angielsk
a
Programming
Rub
y:
The
Pragmati
Programmers.
dostpna
b
ezpª
atnie
w
Internie ie)
C++
◮
najp
o
wsze hniejszy
jzyk
obiekto
wy
k
ompilo
w
any
◮
jzyk
hyb
rydo
wy
(wielopa
radygmat
y zny):
umo»liwia
p
rogramo
w
anie
za
ró
wno
w
pa
radygma ie
p
ro
eduralnym
jak
i
obiekto
wym
◮
ª
at
wy
do
ª
¡ zenia
z
C
-
p
rogram
w
C
jest
p
rogramem
w
C++
◮
jzyk
sk
omplik
o
w
any
,
zdaniem
niektó
ry h
nadmiernie
sk
omplik
o
w
any
Java
◮
jzyk
ba
rdziej
p
rzeno±ny
ni»
C++,
k
ompilo
w
any
do
k
o
du
p
o±redniego
◮
zystszy
jzyk
obiekto
wy
ni»
C++,
zap
rojekto
w
any
jak
o
obiekto
wy
(a
nie
jak
o
rozszerzenie
obiekto
w
e
innego
jzyk
a),
ba
rdziej
sp
ójny
,
p
rostszy
Rub
y
◮
obiekto
wy
jzyk
skrypto
wy
zdob
yw
aj¡ y
aktualnie
ogromn¡
p
opula
rno±¢
na
±wie ie
◮
jzyk
wy»szego
p
oziomu
ni»
C++
i
Java,
zego
skutkiem
jest
istotne
skró
enie
p
ro
esu
p
rogramo
w
ania
(kilku-kilkunasto-kilkudziesi iokrotne,
w
zale»no± i
o
d
p
roblemu)
◮
jzyk
interp
reto
w
any
,
istotnie
w
olniejszy
o
d
C++
i
Javy
◮
idealny
do
p
rotot
yp
o
w
ania
P
a
radygmat
p
ro
eduralny
Przykª
ad:
implementa ja
stosu
w
C
#in lude
<stdio.h>
stru t
Stos
{
int
dane[100℄;
int
n;
};
void
init(stru t
Stos*
s)
{
s->n=0;
}
void
push(stru t
Stos*
s,
int
e)
{
s->dane[s->n++℄
=
e;
}
int
pop(stru t
Stos*
s)
{
return
s->dane[s->n℄;
}
int
empty(stru t
Stos*
s)
{
return
s->n==0;
}
main()
{
stru t
Stos
stos;
init(&stos);
push(&stos,2);
push(&stos,5);
push(&stos,3);
while(!empty(&stos))
printf("%d\n",
pop(&stos));
}
P
a
radygmat
p
ro
eduralny
Przykª
ad:
implementa ja
stosu
w
C++
#in lude
<iostream>
stru t
Stos
{
int
dane[100℄;
int
n;
};
void
init(Stos&
s)
{
s.n=0;
}
void
push(Stos&
s,
int
e)
{
s.dane[s.n++℄
=
e;
}
int
pop(Stos&
s)
{
return
s.dane[s.n℄;
}
int
empty(Stos&
s)
{
return
s.n==0;
}
main()
{
Stos
stos;
init(stos);
push(stos,2);
push(stos,5);
push(stos,3);
while(!empty(stos))
std:: out
<<
pop(stos)
<<
std::endl;
}
P
a
radygmat
p
ro
eduralny
struktura
k
o
du
p
rogramu
Program
skª
ada
si
(w
p
ewnym
up
rosz zeniu)
ze
◮
zbio
ru
dekla
ra ji
ro
dzajó
w
dany h,
na
któ
ry h
b
dziemy
p
ro
w
adzi¢
obli zenia
(w
p
rzykª
adzie:
struktura
Stos)
◮
zbio
ru
funk
ji
(p
ro
edur)
za
p
omo
¡
któ
ry h
op
erujemy
na
t
y h
dany h
(w
p
rzykª
adzie:
funk
je
init,
push,
.
.
.
)
Element
y
te
nie
s¡
ze
sob¡
p
o
wi¡zane
skª
adnio
w
o
w
jzyku
(mog¡
np.
znajdo
w
a¢
si
w
ró»ny h
plik
a h,
mo
duª
a h
p
rogramo
wy h)
P
a
radygmat
obiekto
wy
W
pa
radygma ie
obiekto
wym
ª
¡ zy
si
opis
struktury
dany h
z
opisem
op
era ji
na
nej
wyk
onyw
any h
w
jedn¡
jednostk
k
o
du
p
rogramu:
klas.
P
osz zególne
egzempla
rze
tej
struktury
dany h
(p
o
wi¡zanej
z
o
dp
o
wiednimi
dla
niej
op
era jami)
nazyw
a
si
obiektami
lub
instan jami
klasy
.
P
oj ie
klasy
jest
bliskie
p
oj iu
t
ypu
z
jzyk
ó
w
p
ro
eduralny h.
Jest
jednak
szersze.
Implementa ja
stosu
w
pa
radygma ie
obiekto
wym
(C++)
#in lude
<iostream>
lass
Stos
{
publi :
int
dane[100℄;
int
n;
void
init()
{
n=0;
}
void
push(int
e)
{
dane[n++℄
=
e;
}
int
pop()
{
return
dane[n℄;
}
int
empty()
{
return
n==0;
}
};
main()
{
Stos
stos;
stos.init();
stos.push(2);
stos.push(5);
stos.push(3);
while(!stos.empty())
std:: out
<<
stos.pop()
<<
std::endl;
}
Skª
ado
w
e
klasy
Dekla
ra ja
klasy
opisuje
skª
ado
w
e
klasy:
◮
dane
skª
ado
w
e
atrybut
y
s¡
to
w
a
rto± i
p
rze ho
wyw
ane
w
obiekta h
klasy
,
mog¡
b
y¢
do
w
olnego
t
ypu
(mog¡
b
y¢
ró
wnie»
obiektami)
◮
funk
je
skª
ado
w
e
meto
dy
s¡
to
op
era je,
jakie
mo»na
wyk
onyw
a¢
na
obiekta h
klasy
,
dekla
ra ja
i
deni ja
funk
ji
skª
ado
w
ej
klasy
nie
ró»ni
si
o
d
deni ji
'zwykª
ej'
funk
ji
w
jzyku
C++;
w
inny
sp
osób
si
j¡
wyw
oªuje,
miano
wi ie
wyw
oªuje
si
j¡
dla
okre±lonego
obiektu
K
onstrukto
r
K
onstrukto
r
to
sp
e jalna
meto
da
wyw
oªyw
ana
automat
y znie
w
momen ie
t
w
o
rzenia
obiektu.
F
unk
j¡
k
onstrukto
ra
jest
ini jaliza ja
obiektu;
w
sz zególno± i
w
k
onstrukto
rze
nadaje
si
w
a
rto± i
p
o
z¡tk
o
w
e
skª
ado
wym
klasy
(nie
ma
innego
sp
osobu
nadania
w
a
rto± i
p
o
z¡tk
o
wy h,
jak
t
ylk
o
w
k
onstrukto
rze).
◮
k
onstrukto
r
deniuje
si
jak
o
meto
d
(publi zn¡)
o
nazwie
takiej
samej
jak
nazw
a
klasy
◮
mo»e
mie¢
a
rgument
y
◮
k
onstrukto
r
nie
zwra a
w
a
rto± i
◮
dekla
ra ji
ani
deni ji
nie
p
op
rzedza
si
jednak
sª
o
w
em
void
K
onstrukto
r
p
rzykª
ad
#in lude
<iostream>
lass
Stos
{
publi :
int
dane[100℄;
int
n;
Stos()
{
n=0;
}
//
konstruktor
void
push(int
e)
{
dane[n++℄
=
e;
}
int
pop()
{
return
dane[n℄;
}
int
empty()
{
return
n==0;
}
};
main()
{
Stos
stos;
//
niejawne
wywoªanie
konstruktora
stos.push(2);
stos.push(5);
stos.push(3);
while(!stos.empty())
std:: out
<<
stos.pop()
<<
std::endl;
}
K
onstrukto
r
z
a
rgumentami
K
onstrukto
r,
jak
k
a»da
funk
ja,
mo»e
mie¢
a
rgument
y
.
lass
Zespolona
{
publi :
Zespolona(float
r,
float
i)
{
re=r;
im=i;
}
...
private:
float
re,im;
...
}
main()
{
Zespolona
x(1.5,2.0);
//
Argumenty
dla
konstruktora
podajemy
tak
...
Zespolona
y
=
Zespolona(0,1,34);
//
...
lub
tak.
...
}
Destrukto
r
Destrukto
r
to
sp
e jalna
meto
da
wyw
oªyw
ana
automat
y znie
w
momen ie
likwida ji
obiektu.
F
unk
j¡
destrukto
ra
jest
m.in.
'p
osp
rz¡tanie'
p
o
obiek
ie,
np.
je±li
obiekt
k
o
rzystaª
z
dynami znie
p
rzydzielonej
mu
pami i,
w
destrukto
rze
p
o
winno
si
t
pami¢
zw
olni¢.
◮
destrukto
r
deniuje
si
jak
o
meto
d
(publi zn¡)
o
nazwie
takiej
samej
jak
nazw
a
klasy
p
op
rzedzonej
znakiem
~
(t
ylda)
◮
destrukto
r
nie
ma
a
rgumentó
w
i
nie
zwra a
w
a
rto± i
◮
dekla
ra ji
ani
deni ji
nie
p
op
rzedza
si
jednak
sª
o
w
em
void
Deni je
funk
ji
skª
ado
wy h
Deni je
funk
ji
skª
ado
wy h
mo»na
umie± i¢:
◮
w
ewn¡trz
deni ji
klasy
wtedy
k
ompilo
w
ane
s¡
jak
o
inline
◮
p
oza
dekla
ra j¡
klasy
wtedy
k
ompilo
w
ane
s¡
jak
o
zwykª
e
funk
je,
hyba
»e
zostan¡
p
op
rzedzone
sª
o
w
em
'inline',
w
ewn¡trz
deni ji
klasy
umiesz za
si
dekla
ra j
takiej
fuk
ji.
F
unk
ja
t
ypu
inline
jest
trakto
w
ana
p
rzez
k
ompilato
r
w
sp
osób
sp
e jalny:
k
o
d
b
d¡ y
wynikiem
k
ompila ji
takiej
funk
ji
jest
wp
rost
wsta
wiany
(zamiast
no
rmalnego
wyw
oª
ania)
w
e
wszystkie
miejs a
wyw
oª
ania
funk
ji.
Deni je
funk
ji
skª
ado
wy h
p
rzykª
ad
#in lude
<iostream>
lass
Stos
{
publi :
int
dane[100℄;
int
n;
Stos()
{
n=0;
}
//
inline
void
push(int
e);
int
pop();
int
empty()
{
return
n==0;
}
//
inline
};
void
Stos::push(int
e)
{
dane[n++℄
=
e;
}
//
zwykªa
inline
int
Stos::pop()
{
return
dane[--n℄;
}
//
inline
main()
{
...
(j.w.)
}
Wido
zno±¢
skª
ado
wy h
klasy
Ze
wzgldu
na
p
ra
w
a
dostpu
do
skª
ado
wy h
(wido
zno±¢)
dziel¡
si
one
na
trzy
ro
dzaje:
p
ryw
atne
(private)
skª
ado
w
e
p
ryw
atne
dostpne
s¡
t
ylk
o
w
ob
rbie
klasy
,
widziane
s¡
t
ylk
o
p
rzez
inne
skª
ado
w
e
tej
samej
klasy
np.
meto
d
p
ryw
atn¡
klasy
mo»na
wyw
oª
a¢
jedynie
w
inny h
meto
da h
tej»e
klasy
publi zne
(publi )
skª
ado
w
e
publi zne
s¡
dostpne
ró
wnie»
sp
oza
klasy
,
dla
obiektó
w
i
meto
d
inny h
klas,
dla
inny h
funk
ji.
hronione
(prote ted)
skª
ado
w
e
hronione
p
oza
ob
rb
em
klasy
wido
zne
s¡
t
ylk
o
w
klasa h
p
o
ho
dny h,
p
oza
nimi
za ho
wuj¡
si
jak
p
ryw
atne
wyja±nienie
nast¡pi
p
ó¹niej,
p
rzy
omó
wianiu
dziedzi zenia
◮
Domy±lnie,
je±li
nie
okre±limy
p
oziomu
dostpu,
skª
ado
w
a
trakto
w
ana
jest
ona
jak
o
p
ryw
atna.
◮
Skª
ado
w
e
publi zne
to
te
element
y
klasy
p
rzez
któ
re
k
omunikuje
si
ona
z
reszt¡
p
rogramu.
Hermet
yza ja
p
oj ie
hermet
yza ji
Hermet
yza ja
to
te hnik
a
p
rogramist
y zna
p
olegaj¡ a
na
t
ym,
»e
jednostki
p
rogramu
(w
zale»no± i
o
d
jzyk
a:
mo
duªy
,
klasy
,
pakiet
y
,
...)
o
rganizuje
si
w
taki
sp
osób,
»e
na
zewn¡trz
takij
jednostki
wido
zne
s¡
t
ylk
o
te
element
y
,
któ
re
s¡
p
otrzebne
do
wyk
o
rzystania
jej
funk
jonalno± i.
Zasada
hermet
yza ji
gª
osi,
»e
p
rogramista
ma
t
yle
wiedzie¢
o
danej
jednost e
p
rogramist
y znej
ile
mu
p
otrzeba,
ab
y
jej
efekt
ywnie
u»yw
a¢.
W
szystk
o,
o
mo»e
b
y¢
p
rzed
nim
ukryte,
ma
b
y¢
ukryte
◮
ab
y
efekt
ywnie
k
o
rzysta¢
z
funk
ji
sin(x)
p
rogramista
nie
musi
zna¢
zastoso
w
anego
algo
rytmu
wyli zania
sinusa.
◮
ab
y
efekt
ywnie
k
o
rzysta¢
z
klasy
Stos
p
rogramista
nie
musi
wiedzie¢
w
jaki
dokª
adnie
sp
osób
element
y
stosu
p
rze ho
wyw
ane
s¡
w
pami i.
Hermet
yza ja
Hermet
yza ja
w
jzyk
a h
obiekto
wy h
W
jzyk
a h
obiekto
wy h
p
o
dsta
w
o
w
¡
jednostk
¡
p
rogramist
y zn¡
jest
klasa,
a
hermet
yza j
uzyskuje
si
p
rzez
wydzielenie
z± i
publi znej
i
p
ryw
atnej
skª
ado
wy h
klasy
.
Hermet
yza ja
p
rzykª
ad
#in lude
<iostream>
lass
Stos
{
publi :
Stos()
{
n=0;
}
void
push(int
e)
{
dane[n++℄
=
e;
}
int
pop()
{
return
dane[n℄;
}
int
empty()
{
return
n==0;
}
private:
int
dane[100℄;
int
n;
};
main()
{
Stos
stos;
stos.push(2);
stos.push(5);
stos.push(3);
while(!stos.empty())
std:: out
stos.pop()
std::endl;
}
Hermet
yza ja
el
◮
zab
ezpie zenie
obiektó
w
klasy
p
rzed
niedozw
olonymi
op
era jami
(w
p
rzykª
adzie:
np.
uniemo»liwiamy
b
ezp
o±rednie
manipulo
w
anie
w
a
rto± i¡
zmiennej
n)
◮
ukry ie
sz zegóª
ó
w
implementa yjny h
p
rzed
u»ytk
o
wnik
ami
klasy
,
(w
z± i
p
ryw
atnej
k
o
du
klasy
mo»na
dok
onyw
a¢
do
w
olny h
mo
dyk
a ji,
któ
re,
o
ile
interfejs
klasy
p
ozostaje
b
ez
zmian,
nie
zmieniaj¡
wª
asno± i
skª
ado
wy h
publi zny h)
Mo»emy
np.
w
implementa ji
stosu
zast¡pi¢
tabli
list¡.
Hermet
yza ja
Przykª
ad:
aªk
o
wita
zmiana
implementa ji
stosu
b
ez
zmiany
jej
interfejsu:
w
funk
ji
main()
nie
ma
»adny h
zmian
lass
Stos
{
publi :
Stos()
{
top=NULL;
}
~Stos()
{
while(top!=NULL)
{
Elem*
e=top;
top=top->poprz;
delete
e;
}
}
void
push(int
i)
{
Elem*
e=new
Elem;
e->dane=i;
e->poprz=top;
top=e;
}
int
pop()
{
int
ret=top->dane;
Elem*
e=top;
top=top->poprz;
delete
e;
return
ret;
}
int
empty()
{
return
top==NULL;
}
private:
stru t
Elem
{
int
dane;
Elem*
poprz;
};
Elem*
top;
};
main()
{
Stos
stos;
stos.push(2);
stos.push(5);
stos.push(3);
while(!stos.empty())
std:: out
<<
stos.pop()
<<
std::endl;
}
W
p
op
rzednim
p
rzykª
adzie
k
onie zne
b
yª
o
zdenio
w
anie
destrukto
ra,
p
oniew
a»
w
trak
ie
»y ia
obiektu
klasy
Stos
dynami znie
t
w
o
rzone
s¡
element
y
list
y
.
Kiedy
obiekt
taki
ma
p
rzestaje
istnie¢,
musi
sam
zadba¢
o
to
b
y
zw
olni¢
pami¢
zajmo
w
an¡
p
rzez
ew
entualne
p
ozostaª
e
jesz ze
element
y
list
y
.
Uw
aga:
Systemy
wyk
ona
w
ze
niektó
ry h
jzyk
ó
w
za
wieraj¡
me hanizmy
automat
y znego
wykryw
ania
i
zw
alniania
pami i
zajmo
w
anej
p
rzez
nie
u»yw
ane
ju»
dane
(tzw.
zbieranie
±mie i,
ang.
ga
rbage
olle tion),
w
jzyk
a h
C
i
C++
nie
ma
taki h
me hanizmó
w.