• Nie Znaleziono Wyników

gawaiebiekweWykªad1.Wwadzeiedawwej iagawaiabiekwegwjzyk C

N/A
N/A
Protected

Academic year: 2021

Share "gawaiebiekweWykªad1.Wwadzeiedawwej iagawaiabiekwegwjzyk C"

Copied!
25
0
0

Pełen tekst

(1)

Wykªad 1. Wprowadzenie, podstawowe poj iaprogramowania

obiektowego w jzyku C++

(2)

Programowanie obiektowe wjzyku

C++

Java

Ruby

(3)

C++

Jerzy Grbosz Symfonia C++,Tom I,II,III,O yna

Kallima h, Kraków

Jerzy Grbosz PasjaC++, TomI,II,O yna Kallima h,

Kraków

Java

Bru e E kel Thinkingin Java,Helion, 2001,równie» wydania

pó¹niejsze

(versjaangielska Thinkingin Java dostpnabezpªatnie w

Internie ie)

Ruby

Dave ThomasChadFowler, Andy Hunt, Programowanie w

jzyku Ruby,

(wersja angielskaProgrammingRuby: ThePragmati

(4)

najpowsze hniejszy jzyk obiektowykompilowany

jzyk hybrydowy (wieloparadygmaty zny): umo»liwia

programowanie zarówno wparadygma iepro eduralnym jaki

obiektowym

ªatwy do ª¡ zenia zC - program w Cjestprogramem wC++

jzyk skomplikowany,zdaniem niektóry h  nadmiernie

skomplikowany

(5)

jzyk bardziej przeno±ny ni»C++, kompilowany do kodu

po±redniego

zystszyjzyk obiektowy ni»C++, zaprojektowany jako

obiektowy (a nie jako rozszerzenie obiektowe innegojzyka),

bardziej spójny, prostszy

(6)

obiektowy jzyk skryptowyzdobywaj¡ y aktualnieogromn¡

popularno±¢ na ±wie ie

jzyk wy»szegopoziomu ni» C++iJava, zegoskutkiemjest

istotneskró eniepro esuprogramowania

(kilku-kilkunasto-kilkudziesi iokrotne,w zale»no± iod

problemu)

jzyk interpretowany,istotniewolniejszyod C++iJavy

(7)

Przykªad:implementa jastosuwC

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

(8)

strukturakoduprogramu

Programskªada si(w pewnymuprosz zeniu) ze

zbioru deklara jirodzajów dany h, naktóry h bdziemy

prowadzi¢ obli zenia(wprzykªadzie: strukturaStos)

zbioru funk ji (pro edur)zapomo ¡który h operujemyna

ty hdany h (w przykªadzie: funk je init, push,...)

Elementy te nies¡ ze sob¡powi¡zaneskªadniowo wjzyku (mog¡

(9)

W paradygma ie obiektowymª¡ zy si opisstrukturydany h z

opisem opera jinanej wykonywany h wjedn¡ jednostk kodu

programu: klas. Posz zególne egzemplarzetej struktury dany h

(powi¡zanej z odpowiednimidlaniejopera jami) nazywasi

obiektami lubinstan jamiklasy.

Poj ie klasyjestbliskiepoj iutypuz jzykówpro eduralny h.

Jest jednakszersze.

(10)

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

(11)

Deklara ja klasyopisuje skªadowe klasy:

daneskªadowe  atrybuty

s¡ towarto± iprze howywane w obiekta hklasy,mog¡by¢

dowolnegotypu(mog¡ by¢ równie» obiektami)

funk je skªadowe metody

s¡ toopera je,jakie mo»nawykonywa¢ na obiekta hklasy,

deklara jaideni jafunk ji skªadowej klasynie ró»nisi od

deni ji'zwykªej' funk ji wjzyku C++;w innysposób sij¡

wywoªuje, mianowi ie wywoªuje si j¡ dla okre±lonego

(12)

Konstruktorto spe jalna metoda wywoªywana automaty zniew

momen ie tworzenia obiektu.

Funk j¡ konstruktorajestini jaliza ja obiektu; wsz zególno± iw

konstruktorzenadajesi warto± ipo z¡tkowe skªadowym klasy(nie

ma innegosposobu nadaniawarto± i po z¡tkowy h, jak tylkow

konstruktorze).

konstruktordeniujesi jakometod (publi zn¡)o nazwie

takiej samejjak nazwa klasy

mo»e mie¢argumenty

konstruktorniezwra a warto± i

(13)

przykª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;

(14)

Konstruktor, jakka»da funk ja,mo»e mie¢ argumenty.

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.

...

(15)

Destruktortospe jalna metodawywoªywana automaty znie w

momen ie likwida jiobiektu.

Funk j¡ destruktora jestm.in. 'posprz¡tanie'po obiek ie,np. je±li

obiekt korzystaª zdynami znie przydzielonej mupami i, w

destruktorze powinnosi t pami¢zwolni¢.

destruktordeniuje si jako metod(publi zn¡) onazwie

takiej samejjak nazwa klasy poprzedzonej znakiem~ (tylda)

destruktornie maargumentów inie zwra a warto± i

(16)

Deni je funk jiskªadowy h mo»naumie± i¢:

wewn¡trzdeni jiklasy  wtedykompilowane s¡jakoinline

poza deklara j¡klasy  wtedykompilowanes¡ jako zwykªe

funk je, hyba »ezostan¡ poprzedzonesªowem 'inline',

wewn¡trzdeni jiklasy umiesz zasi deklara j takiejfuk ji.

Funk jatypuinlinejesttraktowanaprzezkompilatorwsposób

spe jalny: kodbd¡ ywynikiemkompila jitakiejfunk jijestwprost

wstawiany(zamiastnormalnegowywoªania)wewszystkiemiejs a

(17)

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

(18)

Ze wzgldu naprawa dostpu do skªadowy h (wido zno±¢) dziel¡

si onena trzyrodzaje:

prywatne (private)

skªadoweprywatnedostpnes¡tylkowobrbieklasy,widzianes¡

tylkoprzezinneskªadowetejsamejklasynp. metodprywatn¡

klasymo»nawywoªa¢jedyniew inny hmetoda htej»eklasy

publi zne (publi )

skªadowepubli znes¡dostpnerównie»spozaklasy,dlaobiektówi

metodinny hklas,dlainny h funk ji.

hronione (prote ted)

skªadowe hronionepozaobrbemklasywido znes¡tylkowklasa h

po hodny h,poza nimiza howuj¡sijakprywatne

wyja±nienienast¡pi pó¹niej, przy omówianiudziedzi zenia

Domy±lnie, je±linie okre±limypoziomu dostpu,skªadowa

traktowana jestona jako prywatna.

Skªadowe publi zne tote elementy klasy przez które

(19)

poj iehermetyza ji

Hermetyza ja to te hnikaprogramisty znapolegaj¡ ana tym, »e

jednostki programu (w zale»no± iod jzyka: moduªy, klasy,pakiety,

...) organizuje si w takisposób, »e nazewn¡trz takiejjednostki

wido zne s¡tylko teelementy,któres¡ potrzebnedo wykorzystania

jej funk jonalno± i.

Zasada hermetyza ji gªosi, »eprogramistamatylewiedzie¢o danej

jednost e programisty znej ile mupotrzeba, aby jejefektywnie

u»ywa¢. Wszystko, o mo»eby¢ przed nim ukryte,maby¢ukryte

abyefektywniekorzysta¢zfunk jisin(x)programistaniemusizna¢

zastosowanegoalgorytmuwyli zaniasinusa.

abyefektywniekorzysta¢zklasyStosprogramistaniemusiwiedzie¢wjaki

(20)

Hermetyza jawjzyka hobiektowy h

W jzyka h obiektowy h podstawow¡jednostk¡programisty zn¡

jest klasa,ahermetyza juzyskuje siprzez wydzielenie z± i

publi znej iprywatnej skªadowy h klasy.

(21)

przykª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;

(22)

el

zabezpie zenieobiektówklasy przed niedozwolonymi

opera jami(w przykªadzie: np. uniemo»liwiamybezpo±rednie

manipulowanie warto± i¡ zmiennejn)

ukry iesz zegóªów implementa yjny hprzed u»ytkownikami

klasy,(w z± iprywatnej koduklasymo»na dokonywa¢

dowolny h modyka ji,które,o ileinterfejsklasy pozostaje

bez zmian, niezmieniaj¡ wªasno± iskªadowy hpubli zny h)

(23)
(24)

Przykªad: aªkowitazmianaimplementa jistosubezzmianyjejinterfejsu: wfunk ji

main()niema»adny hzmian

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;

(25)

destruktora, poniewa»w trak ie »y ia obiektuklasyStos

dynami znie tworzone s¡elementy listy. Kiedy obiekt takima

przestaje istnie¢, musisam zadba¢ oto by zwolni¢pami¢

zajmowan¡przezewentualne pozostaªe jesz ze elementy listy.

Uwaga:

Systemywykonaw zeniektóry hjzykówzawieraj¡me hanizmy

automaty znegowykrywaniaizwalnianiapami izajmowanejprzeznie

u»ywaneju»dane(tzw. zbieranie±mie i,ang. garbage olle tion),w

jzyka hCiC++nie ma taki h

Cytaty

Powiązane dokumenty

Etap ten jest dosyć skomplikowany, ponieważ wymaga bardzo szczegółowej analizy konkretnego procesu spedycyjnego pod względem ryzyka związanego z innymi zdarzeniami;.. - pom

Krążą pogłoski, że Spandawa, gd zie się znajduje większość uzbrojonych robotników, jest osaczona przez Reichswehr.. W Króiewcu postanowił w ydział socyalistyczny

N astępnie identyczne w yniki otrzym ano z chromosom ami sam icy Ptyas mucosus, mimo że chromosom W nie różni się u niej wielkością od chrom osom u Z, a tylko

żyła więc usilnie do tego, aby Wszechświat ukazyw ał się regularnie co miesiąc, a w lipcu i sierpniu jako zeszyt podwójny, oraz aby treść zeszytu była

Badania nad rolą w biocenozie chrząszczy z rodziny biegaczowa- tych w yjaśniły ich znaczenie jako regulatora w rozradzaniu się szkodliwych

serw acji w odniesieniu do K siężyca daje jego terminator (linia, gdzie przylegają do siebie oświetlona przez Słońce i nie ośw ietlona część tarczy). Istnienie

Kronika

Lehra-Spławińskiego polski język urzędowy miał już pewne tradycje, sięgające czasów stanisławowskich, ale rozwinął się prawdziwie w dobie Księstwa