background image

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++

background image

Program

wykª

adu

Programo

w

anie

obiekto

w

e

w

jzyku

C++

Java

Rub

y

background image

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,

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)

background image

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

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

background image

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

background image

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

background image

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));

}

background image

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;

}

background image

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

ze

sob¡

p

o

wi¡zane

skª

adnio

w

o

w

jzyku

(mog¡

np.

znajdo

w

si

w

ró»ny h

plik

a h,

mo

duª

a h

p

rogramo

wy h)

background image

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.

background image

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;

}

background image

Skª

ado

w

e

klasy

Dekla

ra ja

klasy

opisuje

skª

ado

w

e

klasy:

dane

skª

ado

w

e



atrybut

y

to

w

a

rto± i

p

rze ho

wyw

ane

w

obiekta h

klasy

,

mog¡

b

do

w

olnego

t

ypu

(mog¡

b

wnie»

obiektami)

funk

je

skª

ado

w

e



meto

dy

to

op

era je,

jakie

mo»na

wyk

onyw

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

wyw

oªuje,

miano

wi ie

wyw

oªuje

si

dla

okre±lonego

obiektu

background image

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

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

o

w

em

void

background image

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;

}

background image

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.

...

}

background image

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

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

o

w

em

void

background image

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

jak

o

inline

p

oza

dekla

ra j¡

klasy



wtedy

k

ompilo

w

ane

jak

o

zwykª

e

funk

je,

hyba

»e

zostan¡

p

op

rzedzone

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

ania)

w

e

wszystkie

miejs a

wyw

ania

funk

ji.

background image

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.)

}

background image

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

t

ylk

o

w

ob

rbie

klasy

,

widziane

t

ylk

o

p

rzez

inne

skª

ado

w

e

tej

samej

klasy

np.

meto

d

p

ryw

atn¡

klasy

mo»na

wyw

jedynie

w

inny h

meto

da h

tej»e

klasy

publi zne

(publi )

skª

ado

w

e

publi zne

dostpne

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

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.

background image

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

t

ylk

o

te

element

y

,

któ

re

p

otrzebne

do

wyk

o

rzystania

jej

funk

jonalno± i.

Zasada

hermet

yza ji

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

p

rzed

nim

ukryte,

ma

b

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

w

pami i.

background image

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

.

background image

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;

}

background image

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

do

w

olny h

mo

dyk

a ji,

któ

re,

o

ile

interfejs

klasy

p

ozostaje

b

ez

zmian,

nie

zmieniaj¡

asno± i

skª

ado

wy h

publi zny h)

background image

Mo»emy

np.

w

implementa ji

stosu

zast¡pi¢

tabli 

list¡.

background image

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;

}

background image

W

p

op

rzednim

p

rzykª

adzie

k

onie zne

b

o

zdenio

w

anie

destrukto

ra,

p

oniew

w

trak

ie

»y ia

obiektu

klasy

Stos

dynami znie

t

w

o

rzone

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.