az Objektum
orietált programozás c. tárgyból II.
éves műszaki informatikai szakos
II.
éves műszaki menedzser szakos
III.
éves főiskolai végzettségű műszaki informatika szakos II. éves programozó
matematikus
hallgatók
részére
2002/2003. tanév I. félév
1. Az objektum orientált programozás alapelvei.
Osztály,
amelynek részei:
•
adatok
•
módszerek
Egységbezárás,
információ rejtés
• az
adatok lokálisak
• a
módszerek hozzáférhetnek az adatokhoz
• a módszerek implementációja rejtett
Üzenet
• Az
objektummal való kommunikáció módja. A módszerek kezelik.
Öröklödés
•
Hierachikus kapcsolat(rendszer).
• A
leszármazott osztály örökli az ős osztály adatait és módszereit
Polimorfizmus
(többalakúság)
•
Bizonyos elemek viselkedése attól a környezettől függ, amelyben alkalmazzuk.
2. Az objektum orientált programozás alapelveinek implementációi
a C++ nyelvben.
Osztály
fogalma:
•
class definíció
Egységbezárás:
•
osztály hatáskör
Információrejtés:
•
láthatóság szabályozása (public, protected, private)
• öröklődési módok (public, private)
Üzenet
•
tagfüggvény hívása
Polimorfizmus
•
függvény overloading
•
operátor overloading
•
virtuális tagfüggvény
Öröklődés
•
leszármaztatási mechanizmus
3. A C++ alapvető (nem objektum-orientált) kiterjesztései az
ANSI C-hez képest.
· A C++ nyelvben a logikai kifejezések végeredménye bool típusú. Integrális típus. Ha szükséges, egy bool típusú érték a C konvenció értelmében a 0 vagy 1 értékre, egy egész érték pedig 0 esetén a hamis, nem 0 esetén az igaz értékre konvertálódik
· A wchar_t az egy byte-nál hosszabb kódú karaktereket alkalmazó karakterkészletek egy elemét tárolni képes típus. Szintén integrális típus.
·
Hivatkozás (cím) szerinti paraméter átadás
·
Alapértelmezés szerinti paraméter érték:
Ha egy formális paraméterhez = jellel egy kifejezést
kapcsolunk, az a paraméter híváskor elmaradhat, de a kifejezésnek megfelelő kezdőértéket
veszi fel. Az alapértelmezés szerinti paraméterérték megadása formálisan is egy
inicializálásnak felel meg.
4. Függvény-argumentumokra vonatkozó kiterjesztések. (Alapértelmezés,
hivatkozás szerinti paraméter átadás.)
Hivatkozás (cím) szerinti paraméter
átadás:
Az adott formális paramétert hivatkozási típusúnak kell deklarálni. Az aktuális paraméter kompatibilis típusú balérték. A hivatkozás szerinti paraméternek a címe adódik át. A függvényben nem kell indirekciót alkalmazni a változó értékének elérésére. Ha a függvény értékadást tartalmaz a formális paraméterre, akkor azzal az aktuális paraméterének az értékét is megváltoztatja.
Alapértelmezés szerinti paraméter
érték:
Ha egy formális paraméterhez = jellel egy kifejezést kapcsolunk, az a paraméter híváskor elmaradhat, de a kifejezésnek megfelelő kezdőértéket veszi fel. Az alapértelmezés szerinti paraméterérték megadása formálisan is egy inicializálásnak felel meg.
Szabályok:
Ha
egy paraméternek van alapértelmezés szerinti (default) értéke, akkor az utána
következő
valamennyi paraméternek kell legyen. A kifejezés értékének típusa a
paraméter típusával kompatibilis kell legyen. Egy adott paraméter default
értékét vagy a prototípusban, vagy a definícióban kell megadni, mindkét helyen
tilos! Szokásos eljárás, hogy valamennyi default értéket a prototípusban adunk
meg, hiszen az mindig publikus, a függvény definíció pedig nem mindig az. A
kifejezés kiértékelése a hívás során futási időben történik. Default értékkel
nem rendelkező formális paraméter helyére kötelező aktuális
paramétert írni.
5. A függvény overloading fogalma.
Azonos hatáskörben azonos névvel különböző paraméterszignatúrával különböző függvényeket definiálhatunk.
Paraméterszignatúra: a formális paraméterek száma és
típus-sorrendje.
A polimorfizmus egyik implementációs formája "környezet":
paraméter szignatúra.
A függvény hívásakor a fordítóprogram
az aktuális
paraméterek szignatúráját sorban egyezteti az összes azonos nevű definíció formális
paramétereinek szignatúráival. Ennek az egyeztetésnek az alábbi
eredményei lehetnek: Pontosan egy illeszkedőt talál: ilyenkor az ennek megfelelő függvény hívását fordítja be. Egyetlen
illeszkedőt sem talál:
hibajelzést ad. Több egyformán illeszkedőt talál: hibajelzést ad.
Korai kötés (early
binding)
6. Osztály, objektum, adattag, tagfüggvény, hivatkozás a
tagokra.
class: adatok (adattagok) és módszerek (method) (tagfüggvények)
együttese, amely absztrakt adattípusként működik.
objektum: egy osztály egy előfordulása
adattag: az osztály egy eleme. Adatot tárol.
tagfüggvény: az osztály egy eleme. Olyan függvény, amely az osztályba tartozó adatokon manipulál.
Hivatkozás
a tagokra:
Analóg a struktúrák kezelésével. Tehát: objektumnév.mező vagy
objektum_pointer->mező
A mező lehet:
7. Konstruktor és destruktor fogalma, vonatkozó szintaktikai
szabályok.
Konstruktor:
Speciális
tagfüggvény:
•
neve egyezik az osztálynévvel
• nem
lehet visszatérési értéke (még void sem!)
• nem
hívható meg közvetlenül
• nem
öröklődik
Aktuális
paraméterlista:
•
deklarációban az objektumnév után
• new operátornál a típusnév (osztálynév) után
Destruktor:
Speciális
tagfüggvény:
•
neve ~osztálynév
• nem
lehet visszatérési értéke (még void sem!)
•
nincs paraméterlistája
• nem
hívható meg közvetlenül
• nem
öröklődik
Automatikusan
meghívódik egy objektum megszűnésekor.
8. A this mutató és szerepe.
Minden
objektumra létezik az előredefiniált this mutató, amely az
objektum címével inicializálódik.
Ezen
keresztül indirekt hivatkozással éri el az adattagot a tagfüggvény.
A this mutató
explicite is elérhető.
9. Láthatósági attributumok és jelentésük. A friend mechanizmus.
Láthatóságot szabályozó kulcsszavak:
• public:
a mezÿőismert
bárhol az osztály hatáskörén belül
• protected:
a mező
az adott osztály és annak valamennyi leszármazott osztálya számára
ismert
• private:
a mező
csak az adott osztály számára ismert
Ha egy
F külső
függvény egy X osztályban "friend"-ként van deklarálva, a tagfüggvényekkel
azonos elérési jogokkal rendelkezik. Az F fgv-en belül az X osztály valamenyi "private"
és "protected" eleme is elérhető.
Deklaráció: az X osztályban a friend kulcsszó után a függvény prototípusa.
Ha az
X osztályban az Y osztály "friend"-ként van deklarálva, az Y osztály
összes tagfüggvénye eléri az X osztály "private" és "protected"
tagjait is.
Deklaráció:
az X osztályban a friend class Y; sorral.
Az Y
osztály egy tagfüggvénye is lehet friend az X osztályban.
Deklaráció:
az X osztályban a friend kulcsszó után a tagfüggvény prototípusa. A tagfüggvény
neve előtt
az Y:: előtag szükséges!
Megjegyzések:
• a
friend viszony nem tranzitív
• a
friend viszony öröklÿdik
10. Az operátor overloading fogalma és alapszabályai. (A
"szokásos" operátorok, az =, new, delete és a konverziós operátorok
kivételével.)
A C++ nyelv lehetőséget nyújt arra, hogy a programozó által definiált
típusokra az operátorok átértelmezhetők legyenek. A polimorfizmus
implementációja! Egy operátorjel
operandusainak típusa határozza meg az operátorjel jelentését. A jelentést függvénydefinícióval
(tagfüggvénnyel vagy külső függvénnyel) írhatjuk le.
Operátor
overloading: alapszabályok
•
Minden operátor újraértelmezhető, kivéve a . .* :: ?:
(feltételes) operátorokat.
• Az
= [] () -> new delete operátorokra speciális szabályok vonatkoznak
• Az
operandusok száma nem változtatható meg
• Az előredefiniált típusokra vonatkozó operátorok nem definiálhatók újra. (Egy újradefiniált operátor legalább egy operandusa objektum kell legyen!)
• A
precedencia- és asszociativitási szabályok nem változnak meg, azaz a kiértékelés
sorrendje ugyanaz marad.
• Az
= operátor kivételével az újradefiniálás öröklődik.
•
Nincs kommutativitás (felcserélhetőség) – a standard típusokra sem
volt!
11. Az öröklődési (származtatási) mechanizmus. Ehhez kapcsolódó láthatósági
kérdések.
Egy
osztály deklarálható valamely más osztály(ok) leszármazottjaként. Az deklaráció
formája: class
név: [kulcsszo] osztalynev1 [, [kulcsszo] osztalynev2 ... ] {
//
itt jön a tagok deklarációja }
A kulcsszo (amely az öröklés módját írja elő) lehet public
vagy private
• Ha a kulcsszo hiányzik, az alapértelmezés private
(információ
rejtés alapelve!)
• Az osztálynev1 nevű osztály a szülő, vagy ősosztály. (base class)
• A név osztály rendelkezik
– a
szülő
osztály tagjaival
– a
saját tagjaival
• Az ős
osztály elemeinek az elérése a leszármazott osztályból nem feltétlenül
garantált.
•
Öröklődnek
bizonyos tulajdonságok. Pl.
–
operátor overloading
– friend függvények és osztályok
• Az
öröklődési
hierarchia tetszÿleges lehet.
• Az ős
osztály továbbra is használható önmagában is.
Megjegyzések:
• Az
öröklés módja csak korlátozhatja a hatáskört.
• Egy
leszármazott osztály elérési joga kisebb, mint a friend osztályé.
12. A virtuális függvény fogalma, használatának célja.
A virtuális függvény késői kötést tesz lehetővé.
Csak
tagfüggvény definiálható virtuálisnak, az osztálydeklaráció törzsében
elhelyezett virtual
alapszóval.
• Az
öröklődési
hierarchiában lejjebb álló osztályok tartalmazhatnak ugyanilyen nevű, paraméter
szignatúrájú és visszatérési értékű tagfügvényeket.
• Ezek a függvények a virtual alapszó nélkül is virtuálisnak minősülnek
• A virtuális függvényt a bázisosztályban kötelező definiálni, a
leszármazottak mindegyikében nem.
• A bázisosztályban a virtuális függvény lehet valódi virtuális függvény - ekkor 0-val kell
inicializálni. Például: virtual void
hanykerek () = 0;
• Az ilyen osztály nem példányosítható (absztrakt osztály).
• Ha mutatón keresztül hívjuk meg a virtuális függvényt, nem a mutató alaptípusa határozza
meg, hogy melyik változatot kell használni, hanem a megcímzett objektum típusa.
• A megcímzett objektum típusa általában csak futási időben derül ki
• A fordítóprogram általában nem tudja megkeresni a
meghívandó függvényt, csak előkészíteni a futásidejű kiválasztását.
Használata:
•
ugyanolyan funkciók a leszármazott osztályokban
• a
funkció implementációja osztályfüggő
13. A virtuális bázisosztály fogalma és használatának célja.
Konstruktorok és destruktorok végrehajtásának sorrendje.
Ha
szemantikailag nem indokolt a báziososztály ismétlődése: virtuális
bázisosztály
Előírása: a virtual kulcssszó az öröklődés módját előíró kulcssszó előtt.
A virtuális bázisosztályból egy (megosztva használt)
objektum keletkezik valamennyi leszármazott osztály számára. Az osztott
objektum nem érhető el közvetlenül.
A virtuális bázisosztály tagjaira bármely leszármazott
osztály objektuma hivatkozhat.
Az egyes leszármazott osztályok az osztott objektumot pointeren keresztül érik
el.
Sorrend:
Egy leszármaztatott objektum létrehozásakor először a szülő osztály(ok)
konstruktora(i)
hajtódnak végre (a deklaráció sorrendjében), majd a leszármaztatott osztályé. A destruktorok végrehajtási sorrendje pont fordított.
14. A iostrem osztálykönyvtár feladata és
használata.
15. Objektumok inicializálásának alapvető (egyszerűbb) esetei.
public adattagok inicializálása felsorolással:
Analóg
a struktúrák inicializálásával
Pl.: szemely
valaki = {"todor", 1937};
konstruktorral:
Több
konstruktor is megadható ez függvény overloading, tehát a fordító a megadott
paraméter szignatúra alapján választ
private konstruktor:
csak a tagfüggvények és a friend osztályok érhetik el.
protected konstruktor:
csak a leszármazott osztályok érhetik el
objektum tömbök:
Alapeset: a tömb
minden elemére meghívódik a default konstruktor (amely átdefiniálható!)
Inicializációs lista: a
lista minden eleme egy konstruktor hívás kijelölése
Egy paraméteres konstruktor esetén a paraméter megadása
elegendő
Ha a lista kevesebb elemet tartalmaz, mint a tömb, a maradék
elemekre a default konstruktor hívódik meg
Dinamikusan deklarált tömb esetén (new) a default kontruktor hívódik meg minden elemre.
osztály típusú tagok:
Konstruktorok
végrehajtási sorrendje
Először
a tagosztály(ok)
Utána
a tartalmazó osztály
A
szabály rekurzív módon ismétlendő, ha szükséges
Paraméter
átadás a tagosztály konstruktorának
Taginicializációs
lista: a tartalmazó osztály definíciójának
argumentumlistája
után vesszővel
elválasztott lista
Az
alaptípusú adattagok is megjelenhetnek a listán
16. Objektumok tagonkénti inicalizálása. Inicializálási kérdések
a származtatás során.
tagonkénti inicializálás:
Egy objektum inicializálása azonos típusú másik objektummal
Ekkor nincs
konstruktorhívás!
Nem azonos az objektumok közötti értékadással.
Két fázisa: Létrejön az új objektum. Automatikus kezdőértékadás történik
Előfordulásai:
közvetlen
inicializálás
érték
szerint átadott osztály típusú paraméter
osztály
típusú viszatérési érték
Egyéb,
közvetett módon létrejövő ideiglenes objektumok (konverzió, kifejezés
kiértékelésének részeredménye stb.)
inicializálás a származtatás során:
A származtatott osztálynak nincs copy konstruktora:
Alapmódszer a tagonkénti inicializálás
Az a bázisosztály, amelynek van copy konstruktora, azzal inicializálódik
A származtatott osztálynak van copy konstruktora:
A származtatott osztály copy konstruktorának kell meghívnia
a bázisosztály copy konstruktorát, ha van. Egyébként tagonkénti inicializálás,
akkor is, ha a bázisosztálynak van copy konstruktora
17. A copy konstruktor fogalma és szerepe. A copy kontsruktor és
az átértelmezett értékadás operátor viszonya.
A fordítóprogram az X osztály objektumainak tagonkénti inicializálására
a X::X(const X&) speciális
konstruktort hívja meg. Ennek alapértelmezése: tagonkénti inicializáció. Ez nem
mindig megfelelő, ezért saját
verzió definiálható
Saját copy konstruktor esetén speciális szabályok.
copy
konstruktor: "copy"
értékadás:
"destroy" + "copy"
destruktor:
"destroy"
18. Konverziós szabályok osztálytípusokra. Konverziós
operátorok.
Osztálytípusok
között az alábbi automatikus konverziók lehetségesek:
származtatott osztály => public bázisosztály
származtatott osztály& => public bázisosztály&
származtatott osztály* => public bázisosztály*
bármilyen osztály* => void*
Tetszőleges típusról osztálytípusra
Az egy argumentumú konstruktor az argumentuma típusáról
történő konverziót
definiál és engedélyez!
Osztálytípusról tetszőleges típusra
Speciális tagfüggvény (konverziós operátor) operator
<típus> () ahol típus
tetszőleges típusnév. Sem visszatérési érték, sem argumentum nem
adható meg. A konverziós operátorok öröklődnek.
A fordítóprogram mindig jogosult az automatikus konverziók
alkalmazására
A fordítóprogram jogosult a programozó által definiált
konverziók alkalmazására
Ez nem tiltható meg!
Az egyparaméteres konstruktor mindig konverziót is lehetővé tesz! (Akkor is, ha csak
inicializáció miatt írtuk.)
A fordítóprogram többlépcsős konverziót is alkalmaz, ha azzal típusegyezést tud
elérni.
19. Statikus adattagok és tagfüggvények. A konstans tagfüggvény.
Bármely adattag lehet static tárolási osztályú
A statikus adattag az osztály valamennyi objektuma számára egy példányban
létezik, azok osztottan használják.
Globális változó az osztályra nézve.
Nem a this mutatón keresztül történik az elérése.
Különbségek a valódi globális változóval szemben:
Lehet private (információrejtés)
Nem szerepel a globális névtérben, az osztály hatáskörében
érvényes (nem lehet névütközés)
Az objektumok előtt kell létrejönnie
Az osztályban az adattagnak csak deklarációja lehet
A statikus adattag definíciója minden tagfüggvények kívül
helyezkedhet el. Célszerű helye az osztály implementációs file-ja.
Inicializálása nem történhet a konstruktorban, csak a definíciójában.
private
adattag
Csak osztályon belül használható.
Definíciója (és inicializálása) megengedett az osztályon kívül.
public
adattag
Használata sérti az információrejtést
Bárhol használható, ahol az osztálya ismert
Használható az osztály bármelyik objektumával, vagy osztálynévvel
és SCOPE operátorral
Nem használható önmagában (osztályhatáskörben van!)
Tagfüggvány
tárolási osztálya is lehet static
Az
ilyen függvény a this mutatóra sem közvetlenül, sem közvetve nem
hivatkozhat
Következmény:
csak statikus adattagokat és tagfüggvényeket használhat.
Meghívható
az osztály bármelyik objektumával, vagy az osztálynévvel és hatáskör
(SCOPE) operátorral.
20. Az általánosítás/pontosítás (is-a) és a
tartalmazás (has-a)
kapcsolat implementálási lehetőségei C++ nyelvi eszközökkel.
Az általánosítás/pontosítás:
Leszármaztatási mechanizmus (öröklődés)segítségével
public öröklési mód szükséges A
leszármazott osztály objektuma egyben ős objektum is.
Kétféle
tartalmazás kapcsolat:
aggregáció: a
rész az egészhez tartozik, de önállóan is létező entitás
Lehetséges megoldások:
-tag
objektum pointere vagy referenciája a tartalmazó osztályban
hátrány:
szoros kapcsolat a tartalmazó és a tartalmazott objektum között (konzisztencia!!!)
-a
tartalmazott private leszármaztatása a
tartalmazó osztályból
hátrány:
ilyenkor csak osztály szinten fejezi ki a tartalmazott önálló voltát.
kompozíció: a
rész önmagában nem létezhet, csak valaminek a részeként
Lehetséges megoldások:
-tag
objektum
-A
tartalmazó osztályban lokális osztálydefiníció
a tartalmazott számára
21. Az osztály interface fogalma és a jól tervezett osztály
interface jellemzői.
A public
tagfüggvények
összessége:
ezt kell
ismernie az osztály használójának a leszármazott osztály se tételezzen fel
implementációs részleteket a bázisosztályáról.
A friend
függvények
és osztályok:
csak
feltétlenül szükséges esetben használjuk, mert ellentmond az információ rejtés
alapelvének
protected
függvények
és adattagok:
implementációs
függést hoz létre az ős és a leszármazott osztály között
A jó osztály interface
Teljes
Minden
funkciót tartalmaz, ami az osztálytól elvárható, nem az adott alkalmazás szempontjai
határozzák meg, újrafelhasználható egység
Minimális
nem
tartalmaz a felhasználó számára érdektelen (esetleg veszélyes) elemeket, belső
felhasználású funkciók private vagy
protected minősítésűek, a
belső áttervezés nincs rá hatással
Kezelhető méretű
Általában
legfeljebb néhány tíz metódus
A
sok funkció között nagyobb valószínűséggel lesznek hasonlóak (félreértés
veszélye!)
A
terjedelmes interface általában tervezési hibára utal: Az interface része belső
funkció is. Az osztály határait nem jól állapítottuk meg, és túl sok feladatot
akarunk rábízni. A helyes architektúra kialakítása érdekében az eredetileg
tervezett osztályt több osztályra kell bontani, és ezek között
leszármaztatással vagy más mechanizmussal megteremteni a kapcsolatot.
22. Ismertesen legalább négy szempontot a kezelő függvények
tervezéséhez.
Hogyan kell az objektumoknak létrejönniük és megszűnniük?
konstruktorok
száma és paraméterlistájuk, a desktruktor működése, a new és delete operátorok
esetleges átdefiniálásának szükségességét.
Miben különbözik egy objektum inicializálása és értékadása?
A
konstruktorok és az értékadó operátor működése.
Milyen kezdőállapoto(ka)t vehet fel egy objektum a keletkezése
után?
valamennyi
tagfüggvény implementációját befolyásolja, hogy milyen állapotot tételezhet
fel, illetve köteles ellenőrizni.
Milyen legális állapotokat vehet fel az osztály egy objektuma?
A
tagfüggvények hibaellenőrzését befolyásolja.
Van bázisosztálya az új osztálynak?
Mely
funkciók örökölhetők változatlanul? Vannak-e a bázisosztályban olyan
függvények, amelyeket felül kell definiálni a leszármazott osztályban?
Lesz-e várhatóan az osztálynak leszármazott osztálya?
Mely
tagfüggvények, esetleg adattagok legyenek protected
minősítésűek?
Milyen operátorok definiálása lehet hasznos az osztály
használatában?
Az
operátor overloading tervezéséhez. A felhasználó számára nem ajánlott, de az
osztály implementációja számára hasznos operátorok definiálhatók private (esetleg protected) minősítéssel.
Miknek lehet szüksége a nem public tagok elérésére?
Mely
adattagokat és tagfüggvényeket célszerű protected
minősítéssel ellátni? Mely osztályok illetve függvények kaphatják
meg a friend minősítést? Információ
rejtésnek ellentmondó konstrukciók => gondosan elemzendő a szükségességük. Különösen
érdemes átgondolni, hogy a public
adattag használata
valóban elkerülhetetlen-e?
23. Konstruktor és destruktor tervezési szempontjai.
Konstruktor:
A felhasználás
kényelme
Az
alapértelemzés szerinti paraméter értékek használata csökkentheti a szükséges
konstruktorok számát.
A
konstruktornak konverziós szerepe is van!
Alapértelmezés
szerinti konstruktor átdefiniálása szükséges-e?
copy konstruktor!
Destruktor:
Minden
"mellékhatás" eltüntetése.
Bármilyen
(legális) állapotban levő objektumra működnie kell!
24. Operátorok tervezésének szempontjai.
Alapszabály: minden olyan operátort
definiálni kell, ami az adott osztály használata során természetesnek tűnik.
Tervezési hiba, ha egy átértelmezett operátor
jelentése a programozó számára nem egyértelmű. Különösen problémás egy, az
operátor eredeti jelentésének ellentmondó jelentés
definiálása.
Különleges
szerepe van az értékadó operátoroknak.
Ha egy
relációs operátort értelmezünk, az összeset definiáljuk.
Sokszor
hasznos lehet (és bármilyen típusú objektumra alkalmazható) az ==
és
a != operátorok implementálása.
Nagyon sokszor
hívott funkcióra kényelmes megoldás lehet a () (függvényhívás-operátor)
átdefiniálása.
25. Konstans tagfüggvények használata.
Minősítése
az argumentumlista után tett const alapszóval.
Az
alapszót mind a függvény prototípusában, mind a definícióban ki kell írni.
Jelentése:
a konstans tagfüggvény nem változtathatja meg egyetlen adattag értékét sem.
Minden
olyan tagfüggvényt, amely nem változtatja meg az objektum állapotát,
deklaráljunk
konstans tagfüggvényként.
Konstans
objektumra csak konstans tagfüggvény hívható meg.
Ha egy
tagfüggvényből létezik const minősítésű
és minősítetlen változat is, const objektumra
const tagfüggvény hívódik meg.
Az, hogy egy
tagfüggvény definíciója nem tartalmaz olyan utasítást, amely valamely adattag értékét
közvetlenül megváltoztatja, még nem jelenti azt, hogy valamilyen közvetettebb
módon nem változhat az objektum állapota.
Egy
tagfüggvény számára a const minősítés megadásához
gyakran a működésének a funkcionális elemzése szükséges.
26. Melyek az előnyei a hivatkozás szerint átadott függvény
paramétereknek?
A
függvényben nem kell indirekciót alkalmazni a változó értékének elérésére.
Ha a
függvény értékadást tartalmaz a formális paraméterrre, akkor azzal az aktuális
paraméterének az értékét is megváltoztatja.
27. Parametrizált (generikus) osztályok definíciója és
használata.
Kiindulási
probléma: tetszőleges típusokon kellene ugyanolyan műveleteket
definiálni.
Például: lista adatszerkezet - a lista elemei bármilyen objektumok lehetnek, de a lista mint adatszerkezet kezelése az elemei típusától független!
Típus
mint paraméter.
Hasonló
feldolgozási mechanizmus, mint a makrók esetén - de a fordítóprogram dolga!
Egyszerű
parametrizált (generikus) osztály:
template
<class T>
class
Vektor
{
definíció,
ahol a T bárhol
szerepelhet
típusnévként
};
Használata:
A
parametrizált osztály neve, T helyett egy ismert típust írva, a programban
bárhol típusnévként szerepelhet.
28. Függvény template és használata
Nem
csak tagfüggvény visszatérési értéke vagy paramétere lehet template, hanem külső
függvényé is.
Például:
template
<class T>
void
csere(T& egyik, T& masik)
{T tmp =
egyik;
egyik =
masik; masik = tmp; }
29. A kivételkezelés elve a C++ nyelvben.
• Nem
azonos az operációs rendszer exeptionfogalmával.
•
Kivétel az, amit programozó annak tekint.
• A
C++ szemléletében a kivétel egy objektum, ami a kivétel bekövetkezésekor jön
létre.
•
Kivétel kiváltása: throw
try blokk:
a "védett" programrészt fogja közre.
try {
utasítások }
catch blokk(ok):
a keletkezett kivételek lekezelése
catch (típus
paraméter) {utasítások}
vagy
catch (
típus )
vagy
catch ( ...
)
30. Mi az STL? A container, algoritmus és iterátor fogalma és
megvalósítása az STL-ben.
STL: Standard Template Library
Az ANSI C++ szabvány része
Feladata: a leggyakoribb absztrakt adatszerkezetek kezelése
Részei:
· container-ek
· algoritmusok
· iterátorok
A container olyan osztály, amely objektumokat tartalmazó szerkezetet
definiál.
Az STL-ben a container-ek célja absztrakt adatszerkezetek
modellezése.
Az algoritmusok olyan műveletek, amelyek adatszerkezettől függetlenül
megfogalmazhatók.
Az iterátor olyan osztály, amelynek célja egy adatszerkezet elemeinek
elérése.
Az iterátor teszi lehetõvé a container-ek és az algoritmusok
függetlenítését.
31. A Java nyelv története, alapvető jellemzői.
1990-es évek eleje: a SUN belső project-je (set top
box) platform-független technológia szükségessége. Egyik akkori nyelv sem volt megfelelő,
ezért terveztek egy újat.
1990-es évek közepe: az Internet rohamos
terjedése újra felvetette a platform-független
technológia szükségességét újraéledt a
project, de általánosabb célkitűzéssel
1995: Java
1 platform
1999: Java
2 platform
A Java
egyszerre programozási nyelv és platform
A Java nyelv Platform-független magas
szintű programozási nyelv
•objektum-orientált
•egyszerű
•elosztott
(distributed)
•interpretált
(de speciális módon)
•robosztus
•biztonságos
•hordozható
•architektúra
független
•többszálú
(multithreaded)
32. A Java alkalmazás és Java applet fogalma.
Java program: Java-fordítóval készült önálló alkalmazás.
•az
adott architektúrán futó JVM hajtja végre
•mindazon
jogokkal rendelkezik, mint bármely más alkalmazás
Applet: HTML oldalba ágyazott Java-kód
•a
HTML oldal értelmezője (a böngésző) hajtja végre (a böngésző valósítja meg a JVM-et)
•korlátozott
jogokkal rendelkezik
33. Alapvető eltérések a C++ és a Java osztálykezelésében és
objektum kezelésében.
• Az
osztály egy gyökerű: minden definiált osztály implicite az Object
osztály
leszármazottja.
• Csak egy
ősosztály lehet!
Osztály
definíció: kulcsszó class nev extends bazis {.. }
•kulcsszó:
abstract vagy static
•Metódusok:
csak belső definíció
•Láthatósági
kulcsszó: csak az adott mezőre érvényes. Alapértelmezés: protected
•Egy osztály típusú változó mindig referencia típusú.
•Objektum
létrehozása mindig a
new operátorral
•Egy
osztály típusú változó definiálása csak referenciát hoz létre, objektumot nem.
•Értékadás:
két referencia közötti értékadás után a két változó ugyanarra az objektumra
hivatkozik
•Az
objektumok közötti értékadást a clone metódussal
tudjuk elérni
–minden
osztály az Object ősosztályból örökli
–a programozó
szükség esetén átdefiniálhatja.
34. Az interface fogalma a Java nyelvben.
•Az
interface tagjainak csak deklarációja van, nincs definíciója.
•C++ -ban
az absztrakt osztály a megfelelője
•Bármely
osztály implementálhat egy vagy több interface-t. Az osztály feladata az interface
elemeinek definíciója.
• Ezzel
megvalósítható a többszörös öröklésnek megfelelő kapcsolatrendszer
Példa:
interface
A{
int
a;
void
fgv( void );
}
class
B implements A{ .. }
class
C implements A{ .. }
•
Ezután A típusú
referenciával mind B, mind C típusú objektumot elérhetünk.
35. Alapvető Java csomagok.
Java.lang:
Automatikusan
importálódik. Tartalmazza az osztályhierarchia gyökerét jelentő Object osztályt,
•az
alaptípusokat implementáló osztályokat
•a futtatáshoz,
kivételkezeléshez és a futás közbeni biztonsági ellenőrzésekhez szükséges magas
szintű osztályokat.
Java.io:
alapvető
input/output műveleteket, file kezelési műveleteket végző osztályokat
tartalmaz.
Java.util:
Hasznos bár egymáshoz lazán kötödő rutinok gyűjteménye.
Java.awt:
Platform független
felhasználói interface komponensek
Java.net:
A hálózatkezelést
lehetővé tevő osztályok gyűjteménye.
Java.applet:
A beágyazott
Java programok (appletek) készítéséhez