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