Wykªad 1. Wprowadzenie, podstawowe poj iaprogramowania
obiektowego w jzyku C++
Programowanie obiektowe wjzyku
◮
C++
◮
Java◮
Ruby◮
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
◮
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 nadmiernieskomplikowany
◮
jzyk bardziej przeno±ny ni»C++, kompilowany do kodu
po±redniego
◮
zystszyjzyk obiektowy ni»C++, zaprojektowany jakoobiektowy (a nie jako rozszerzenie obiektowe innegojzyka),
bardziej spójny, prostszy
◮
obiektowy jzyk skryptowyzdobywaj¡ y aktualnieogromn¡
popularno±¢ na ±wie ie
◮
jzyk wy»szegopoziomu ni» C++iJava, zegoskutkiemjestistotneskró eniepro esuprogramowania
(kilku-kilkunasto-kilkudziesi iokrotne,w zale»no± iod
problemu)
◮
jzyk interpretowany,istotniewolniejszyod C++iJavy
◮
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));
strukturakoduprogramu
Programskªada si(w pewnymuprosz zeniu) ze
◮
zbioru deklara jirodzajów dany h, naktóry h bdziemyprowadzi¢ obli zenia(wprzykªadzie: strukturaStos)
◮
zbioru funk ji (pro edur)zapomo ¡który h operujemynaty hdany h (w przykªadzie: funk je init, push,...)
Elementy te nies¡ ze sob¡powi¡zaneskªadniowo wjzyku (mog¡
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.
#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;
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 metodys¡ 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
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◮
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;
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.
...
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¡) onazwietakiej samejjak nazwa klasy poprzedzonej znakiem~ (tylda)
◮
destruktornie maargumentów inie zwra a warto± i◮
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
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.)
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ªadowatraktowana jestona jako prywatna.
◮
Skªadowe publi zne tote elementy klasy przez którepoj 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¢wjakiHermetyza 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.
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;
el
◮
zabezpie zenieobiektówklasy przed niedozwolonymiopera jami(w przykªadzie: np. uniemo»liwiamybezpo±rednie
manipulowanie warto± i¡ zmiennejn)
◮
ukry iesz zegóªów implementa yjny hprzed u»ytkownikamiklasy,(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)
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;
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