47
Programoz Programoz á á s 2 s 2 Objektum Objektum O O rient rient á á lt Programoz lt Programoz á á s s C++ nyelven C++ nyelven utols utols ó ó v v á á ltoztat ltoztat á á s 2008.04.12. s 2008.04.12.

Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

ProgramozProgramozáás 2s 2

ObjektumObjektum

OOrientrientáált Programozlt ProgramozáássC++ nyelvenC++ nyelven

utolsutolsóó

vvááltoztatltoztatáás 2008.04.12.s 2008.04.12.

Page 2: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

C++C++

TTöörtrtéénetileg a C nyelv tovnetileg a C nyelv továábbfejlesztbbfejlesztééseseEnnek elEnnek előőnyei: nyei:

C programozC programozóó azonnal programozhat Cazonnal programozhat C--kkéént C++nt C++--ban ban hasznhasznáálva a plusz klva a plusz kéényelmi lehetnyelmi lehetőősséégeketgeketKulcsszavai azonosak/hasonlKulcsszavai azonosak/hasonlóóak a Cak a C--velvelLehet vele hatLehet vele hatéékony OOP programokat kkony OOP programokat kéészszííteniteni

HHáátrtráánya: nincs knya: nincs kéésztetsztetéés az OOP s az OOP gondolkodgondolkodáásmsmóódjdjáának elsajnak elsajááttííttáássáárara

Page 3: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

C++C++

A C++ mintaprogramok letA C++ mintaprogramok letöölthetlthetőőek a tanszek a tanszééki ki web oldalrweb oldalróól:l:

www.fat.bme.hu/student/www.fat.bme.hu/student/

Amit itt esetleg nem talAmit itt esetleg nem taláálnak meg, az pedig alnak meg, az pedig awww.fat.bme.hu/pubwww.fat.bme.hu/pub/Programozas2//Programozas2/

ccíímen biztos megtalmen biztos megtaláálhatlhatóó..

Page 4: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

Az elsAz elsőő C++ programC++ program// A vil// A viláág g keletkezkeletkezéése se éés pusztuls pusztuláása. sa. A // A // --lallal

kezdkezdőőddőő

szszööveg megjegyzveg megjegyzéés. s. #include <iostream> // innen j#include <iostream> // innen jöön az std::cout (nincs benne '.h' !)n az std::cout (nincs benne '.h' !)class Univerzum // a vilclass Univerzum // a viláágnak mint objektumnak a gnak mint objektumnak a deklardeklaráácicióójaja{{

// le// leíírja az objektumot, de nem hoz lrja az objektumot, de nem hoz léétre egyet sem.tre egyet sem.public:public:

// en// enéélklküül kl kíívvüülrlrőől nem ll nem láátntnáánk az ezutnk az ezutáán felsorolt fn felsorolt füüggvggvéényeketnyeketUniverzumUniverzum()()

// 'constructor' ez hozza majd// 'constructor' ez hozza majd

lléétre az objektumottre az objektumot{{

std::coutstd::cout

<< "Big bang<< "Big bang\\nn"";;

// sz// szööveg kiiratveg kiiratáás a ks a kéépernypernyőőre (console output), vre (console output), vééggéén soremeln soremelééss}}~~UniverzumUniverzum()()

// 'destructor' megsemmis// 'destructor' megsemmisííti az objektumotti az objektumot{{

std::coutstd::cout

<< "<< "ViszlViszláátt\\nn""; ; // sz// szööveg kiiratveg kiiratáás a ks a kéépernypernyőőre (console output)re (console output)}}

};};

UniverzumUniverzum

azUniverzumazUniverzum;;

// Glob// Globáális terlis terüület (minden a let (minden a {}{}--eken keken kíívvüül ) Itt jl ) Itt jöön ln léétre a viltre a viláág. g. // Lef// Lefut a constructora ut a constructora éés kis kiíírja a szrja a szöövegetveget

intint

main() { }main() { }

// ez kell, ez az els// ez kell, ez az elsőő

ffüüggvggvéény ami meghny ami meghíívvóódik a globdik a globáális vlis vááltozltozóókk// l// léétrejtrejöötte uttte utáán. Most nem csinn. Most nem csináál semmitl semmit

// miut// miutáán a "main()' lefutott a globn a "main()' lefutott a globáális vlis vááltozltozóók megsemmisk megsemmisüülnek. Lefut az "azUniverzum" destructoralnek. Lefut az "azUniverzum" destructora

Page 5: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

C++ programok futC++ programok futáásasaÁÁltalltaláánossnossáágban a programok futgban a programok futáása sorsa soráánn

1.1.

ElElőőszszöör ar a

globglobáális objektumok jlis objektumok jöönnek lnnek léétre. Eltre. Előőszszöör r lefoglallefoglalóódik a memdik a memóória az objektumoknak, utria az objektumoknak, utáána lefut a na lefut a constructoruk. Alaptconstructoruk. Alaptíípusoknak nincs constructoruk. pusoknak nincs constructoruk. Jelen Jelen esetben a constructoresetben a constructor--t mi definit mi definiááltuk, ltuk, éés lefuts lefutáásakor sakor szszööveget veget íír ki.r ki.

2.2.

A main() fut le. Jelen esetben nem csinA main() fut le. Jelen esetben nem csináál semmit (l semmit (csak csak boldoggboldoggáá

teszi a C programozteszi a C programozóókat kat ☺☺). Minden glob). Minden globáális flis füüggvggvéényt nyt (most nem volt egy sem) vagy a main, az (most nem volt egy sem) vagy a main, az ááltala hltala híívott vott ffüüggvggvéénylnylááncolat, vagy az objektumok hncolat, vagy az objektumok híívnak.vnak.

3.3.

A main befejezA main befejezéése utse utáán a globn a globáális objektumok eltlis objektumok eltüünnek. nnek. EkEköözben lefutnak a destructorzben lefutnak a destructor--jaik. jaik. Jelen esetben a Jelen esetben a destructordestructor--t mi definit mi definiááltuk, ltuk, éés lefuts lefutáásakor szsakor szööveget veget íír kir ki..

Page 6: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

MegjegyzMegjegyzééseksekA Microsoft Visual Studio A Microsoft Visual Studio ((20052005)) ––beli C++ fordbeli C++ fordííttóónak meg kell adni egy stdafx.h nevnak meg kell adni egy stdafx.h nevűű (ak(akáár r üüres) header res) header ffáájl is az <iostream> eljl is az <iostream> előőtt! Tovtt! Továábbbbáá minden minden úúj proj projjekt (solution) eseten az alekt (solution) eseten az aláábbi rbbi réészt magszt magááttóól bel beíírja:.rja:.

#include "#include "stdafx.hstdafx.h""……..intint

t_main(intt_main(int

argcargc, , _TCHAR* argv[]_TCHAR* argv[])){{return 0;return 0;

}}AA __tmaintmain()() valvalóójjáában egy MAKRban egy MAKRÓÓ, ami a mi eset, ami a mi esetüünkben main()nkben main()--nelnel ekvivalens. ekvivalens. ÍÍgy gy definidefiniááltltáákk::

#define _tmain main#define _tmain mainAA _TCHAR_TCHAR pedig egy tpedig egy tíípus, ami most pus, ami most charchar --ral ekvivalens.ral ekvivalens. ÍÍgy gy definidefiniááljljáákk::

typedef char _TCHAR;typedef char _TCHAR;A main() fA main() füüggvggvéénynek vagy nincs argumentuma, vagy 2 vagy 3 van neki:nynek vagy nincs argumentuma, vagy 2 vagy 3 van neki:

int main(int argc, char *argvint main(int argc, char *argv[], [], [[char *char *envenv[][]]] ))AzAz argcargc azaz argvargv karakter mutatkarakter mutatóókat tartalmazkat tartalmazóó ttöömbmb elemeinekelemeinek szszáámama, amely mutat, amely mutatóói a paranzssorbeli i a paranzssorbeli paramparamééterekre mutatnak. a 0. elem a vterekre mutatnak. a 0. elem a véégrahajtott program neve. Ha az grahajtott program neve. Ha az env env ttöömb is jelen van a futtatmb is jelen van a futtatáási si kköörnyezet (SET) elemeire mutatrnyezet (SET) elemeire mutatóó mutatmutatóókat tartalmazza.kat tartalmazza.Pl.. ha a Pl.. ha a programotprogramot íígy indgy indíítottuk C:tottuk C:\\sajat ksajat köönyvtnyvtáárbrbóól parancssorbl parancssorbóól : l :

program program ––d valamid valamiakkor argc == 3 akkor argc == 3 éés az argv s az argv éértrtéékei: argvkei: argv[0]=[0]="C:"C:\\sajatsajat\\program", argvprogram", argv[1]=[1]= ""--d", argvd", argv[2]=[2]= "valami""valami"Nem minden rendszeren kerNem minden rendszeren kerüül be a 0. paraml be a 0. paramééterbe a teljes elterbe a teljes eléérréési si úútt

Page 7: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

FeladatFeladat

MMóódosdosíítsuk a programot tsuk a programot úúgy, hogy tgy, hogy tööbb bb univerzumot hozzon luniverzumot hozzon léétre. Vajon milyen tre. Vajon milyen sorrendben tsorrendben töörtrtéénik ez? nik ez? ÉÉs a s a megsemmismegsemmisüüllééssüük?k?Adjunk minden vilAdjunk minden viláágnak egy egyedi gnak egy egyedi azonosazonosííttóót, akkor megtudhatjuk:t, akkor megtudhatjuk:

Page 8: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

A mA móódosdosíított Univerzumtott Univerzum// egy univerzum, amelyik tudja mag// egy univerzum, amelyik tudja magáárróól melyikl melyik

class Univerzum // a vilclass Univerzum // a viláágnak mint objektumnak a gnak mint objektumnak a deklardeklaráácicióója ja Az Az {{

// le// leíírja az objektumot, de nem hoz lrja az objektumot, de nem hoz léétre egyet sem.tre egyet sem.public:public:

// en// enéélklküül kl kíívvüülrlrőől nem ll nem láátntnáánk az ezutnk az ezutáán felsorolt fn felsorolt füüggvggvéényeketnyeketUniverzumUniverzum((int melyikint melyik))

: _azon(melyik) // : ut: _azon(melyik) // : utááni rni réész a 'preambulum' ld. alsz a 'preambulum' ld. aláábbbb{{

std::coutstd::cout

<< "<< "A " << "_azon" << ". A " << "_azon" << ". Big Big BBangang

\\nn"";;}}~~UniverzumUniverzum()(){{

std::coutstd::cout

<< "<< "ViszlViszláátt\\nn""; ; }}

private: // ezt csaprivate: // ezt csak az objetum maga lk az objetum maga láátja (adatrejttja (adatrejtéés)s)// Jel// Jelööljljüük a privk a priváát vt vááltozltozóókat egy alkat egy alááhhúúzzáás karakterrel!s karakterrel!

const int _azon; // const const int _azon; // const ––

ha egyszer lha egyszer léétrejtrejöött nem vtt nem vááltozltozhathat

meg az meg az éértrtéékeke// ez// ezéért nem lehet rt nem lehet éértrtééket adni neki a ket adni neki a {}{}

belbelüül csak al csak a// 'preambulum'// 'preambulum'--ban. Aban. A

preambulumpreambulum

elelőőbb hajtbb hajtóódik vdik véégre, mintgre, mint// az objektum l// az objektum léétrehoztrehozáásasa

};};

Page 9: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

TTööbb Univerzum lbb Univerzum léétrehoztrehozáásasa

Ennek hasznEnnek hasznáálata:lata:……..Univerzum univ1(1), univ2(2);Univerzum univ1(1), univ2(2);main() main() {{

UniverzumUniverzum

univ(3);univ(3);}}

Page 10: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

Objektumokbeli Objektumokbeli ffüüggvggvéények/mnyek/móódszerek dszerek

HogyHogy lehetnelehetne megkmegkéérdeznirdezni a a vilviláágtgtóól, hl, hoogygy őő melyik?melyik?class Univerzum class Univerzum {{public:public:

......int int AzonAzon() const // a const () const // a const itt itt aztazt

jelentijelenti, , hogyhogy

ezez

a fa füüggvggvéényny

{{

// nem v// nem vááltoztat meg egy vltoztat meg egy vááltozltozóót semt semreturn _return _azonazon;;

// csak const f// csak const füüggvggvéények fnyek féérhetnek hozzrhetnek hozzáá

a a

} } // const objektumokhoz// const objektumokhoz, ill const , ill const objektumnakobjektumnak////csakcsak

const fconst füüggvggvéényeitnyeit

hhíívhatjukvhatjuk

megmeg

// ez l// ez láátsztszóólag egy klag egy kööltsltsééges fges füüggvggvéényhnyhíívváás, de itt s, de itt ingyeningyen

vanvan......

};};

Page 11: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

HHááttttéér informr informáácicióóEgy adott osztEgy adott osztáálynak megfelellynak megfelelőő objektumok mobjektumok méérete az objektumban rete az objektumban ttáárolt adatok (konstansok rolt adatok (konstansok éés vs vááltozltozóók) szk) száámmáára lefoglalt memra lefoglalt memóória ria mmééretek retek öösszege. A fsszege. A füüggvggvéények minden objektumra ugyanazok nyek minden objektumra ugyanazok éés a s a mmééret szret száámmííttáásban nem jelennek meg.sban nem jelennek meg.

Figyelem: Figyelem: az adatok maz adatok méérete lehet nagyobb, mint amit megadtunk! rete lehet nagyobb, mint amit megadtunk! Ugyanis a korszerUgyanis a korszerűű processzorok valamivel gyorsabban processzorok valamivel gyorsabban éérik el az rik el az adatot, ha az 'dupla szadatot, ha az 'dupla szóó' hat' hatáárra van illesztve. Ekkor pl. egy char trra van illesztve. Ekkor pl. egy char tíípuspusúúadat 4 badat 4 báájt helyet foglal el, amibjt helyet foglal el, amibőől csak 1l csak 1--et hasznet hasznáál, a tl, a tööbbi csak bbi csak helykithelykitööltltéés.s.

Honnan "tudja" egy osztHonnan "tudja" egy osztáály egy fly egy füüggvggvéénye mely objektum adatait nye mely objektum adatait hasznhasznáálja? Minden flja? Minden füüggvggvéény kap egy adott objektumra mutatny kap egy adott objektumra mutatóópointert is. Ezt a fordpointert is. Ezt a fordííttóó program rakja bele elsprogram rakja bele elsőő paramparamééterkterkéént, nt, nekneküünk sosem kell megadni. Ennek neve: nk sosem kell megadni. Ennek neve: this this pointer.pointer.A A thisthis pointert mi is hasznpointert mi is hasznáálhatjuk (nlhatjuk (nééha kell is).ha kell is).

Page 12: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

BeBeáágyazgyazááss

Minden univerzumban van anyag:Minden univerzumban van anyag:class Anyagclass Anyag{{

public:public:Anyag(int mi):_azon(mi) { cout << _azon << ". anyag Anyag(int mi):_azon(mi) { cout << _azon << ". anyag

lléétrejtrejöötttt\\n"; }n"; }~Anyag() {cout << _azon << ". anyag megsemmis~Anyag() {cout << _azon << ". anyag megsemmisüültlt\\n"; }n"; }

private:private:const int _azon;const int _azon;

};};

Page 13: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

BeBeáágyazgyazáás II.s II.class Univerzumclass Univerzum{{

// // azaz

__anyaganyag

lléétrehoztrehozáása a preambulumban azelsa a preambulumban azelőőtt ttt töörtrtéénik, hogy az nik, hogy az

public:public:

// objektum l// objektum léétrejtrejöönnenne// ez// ezéért amikor deklarrt amikor deklarááljuk alljuk aláább nem kell argumentumot adni neki (nem bb nem kell argumentumot adni neki (nem

ott hozzuk lott hozzuk léétre)tre)// A preambulumbeli sorrend l// A preambulumbeli sorrend léényegtelen. Az nyegtelen. Az éértrtéékadkadáás a deklars a deklaráálláási si

sorrend szerint tsorrend szerint töörtrtééniknikUniverzum(int melyik, int anyag) : _Univerzum(int melyik, int anyag) : ___azon(melyik), _anyag(azon(melyik), _anyag(__anyag) { cout << anyag) { cout <<

_azon << ". Big Bang_azon << ". Big Bang\\n"; }n"; }~Univerzum() { cout << _azon << ". elpusztult~Univerzum() { cout << _azon << ". elpusztult\\n"; }n"; }

private:private:const const int _int ___azon;azon;const const Anyag _Anyag ___anyag;anyag;

};};

Univerzum univ1(1,100), univ(2,200);Univerzum univ1(1,100), univ(2,200);

Page 14: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

BeBeáágyazgyazáás III.s III.

A beA beáágyazgyazáás egy "s egy "van nekivan neki" kapcsolat." kapcsolat.A lA léétrehoztrehozáás sorrendje:s sorrendje:

elelőőszszöör az r az UniverzumUniverzum _azon_azon konstansa jkonstansa jöön ln léétre tre éés kap s kap éértrtééket, ket, majd a bemajd a beáágyazott gyazott _a_anyag nyag oobjektumbjektum jjöön ln léétre benne a sajtre benne a sajáát t _azon_azon konstanskonstansáával, aminek semmi kval, aminek semmi kööze az ze az őőt tartalmazt tartalmazóóUniverzum objektum azonos nevUniverzum objektum azonos nevűű konstanskonstansáához.hoz.ezez a bea beáágyazott objektum azgyazott objektum azéért rt lehetlehet konstans, mert konstans, mert éértrtééke ke nem vnem vááltozik amltozik amííg a beg a beáágyazgyazóó osztosztáály ly éél.l.

Page 15: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

BeBeáágyazgyazáás IV.s IV.

A megsemmisA megsemmisüülléés sorrendjes sorrendjeelelőőszszöör a ber a beáágyazgyazóó objektum, az Univerzum objektum, az Univerzum pusztul elpusztul elututáána a bena a beáágyazott objektum, az Anyaggyazott objektum, az Anyag

Page 16: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

Objektum Objektum éélettartamalettartama

Legyen Legyen TT egy tegy tíípus (pl. char, int, Univerzum)pus (pl. char, int, Univerzum)GlobGlobáálisan, vagy lisan, vagy {}{} blokkon belblokkon belüül hozzunk ll hozzunk léétre tre egy T tegy T tíípuspusúú vvááltozltozóót:t:

T tT t; ; A fordA fordííttóó lefoglal a tlefoglal a t--nek megfelelnek megfelelőő nagysnagysáággúú memmemóóririáát t ((éés lefuttatja s lefuttatja TT constructorconstructor--áát, ha van neki). t, ha van neki). ValahValaháányszor nyszor tt--t hasznt hasznááljuk erre a memljuk erre a memóóririáára ra hivatkozik a ghivatkozik a géépi kpi kóódban. dban. A program (blokk) vA program (blokk) vééggéén n tt automatikusan megsemmisautomatikusan megsemmisüül l (destructor(destructor--a lefut).a lefut).

Page 17: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

ReferenciReferenciáákk

T & rtT & rt = = t; t; rt ert egy gy referencia referencia t t ––rere. . ReferenciReferenciáát csak a definit csak a definiáálláása sorsa soráán vn véégzett gzett éértrtéékadkadáással ssal hozhatunk lhozhatunk léétre. Nem vtre. Nem vááltoztathatltoztathatóó..A referencia a vA referencia a vááltozltozóó egy megy máásik neve (alias).sik neve (alias).Hasznos fHasznos füüggvggvéényhnyhíívváásban, ha tsban, ha tööbb bb éértrtééket akarunk ket akarunk visszaadni (Cvisszaadni (C--ben erre mutatben erre mutatóókat kellene hasznkat kellene hasznáálni):lni):

intint

fuggveny(fuggveny(intint

i, i, intint

&j, &j, intint

&k);&k);

Ez a fEz a füüggvggvéény 3 ny 3 éértrtééket ad vissza. A szokket ad vissza. A szokáásoson ksoson kíívvüül jl j--t t éés s kk--t is. Ezek hasznt is. Ezek hasznáálata flata füüggvggvéényen belnyen belüül olyan, mint az ott l olyan, mint az ott definidefiniáált vlt vááltozltozóókkéé

lenne.lenne.

Page 18: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

MutatMutatóókkT *ptT *pt; ; ez a deklarez a deklaráácicióó egy T tegy T tíípuspusúú vvááltozltozóóra mutatra mutatóó mutatmutatóót t (pointert) hoz l(pointert) hoz léétre. A fordtre. A fordííttóó csak egy mutatcsak egy mutatóónyi memnyi memóóririáát t foglal le, ami foglal le, ami nem mutat nem mutat éérvrvéényes memnyes memóória cria cíímre!mre!HasznHasznáálata:lata:

Pl. a Pl. a T tT t,,*pt*pt; ; deklardeklaráácicióó éés s ptpt == & t;& t; éértrtéékadkadáás uts utáán n tt éés s *pt*pt ugyanaz ugyanaz a va vááltozltozóóAA ptpt = = new Tnew T; dinamikus mem; dinamikus memóória foglalria foglaláássalssal ((ekkor ekkor TT construcconstruc--tortora is a is lefutlefut)). A . A ptpt ––t a program vt a program véége elge előőtt fel kell szabadtt fel kell szabadíítani: tani: delete ptdelete pt; ; --velvel. (. (ekkor a pt ekkor a pt ááltal mutatott T objektum destructora is ltal mutatott T objektum destructora is lefut)lefut)..AA ptpt = = new Tnew T[[sizesize]]; dinamikus mem; dinamikus memóória foglalria foglaláássalssal ((TT constructorconstructora a mindenminden elemreelemre lefutlefut)). A . A ptpt ––t a program vt a program véége elge előőtt fel kell tt fel kell szabadszabadíítani: tani: delete delete [] [] ptpt; ; --velvel. (. (ekkor ekkor mindenminden elemelem destructora lefut) destructora lefut) TTöömbmbööt csak akkor lehet ily mt csak akkor lehet ily móódon ldon léétrehozni, ha a trehozni, ha a TT osztosztáálynak lynak van argumrntum nvan argumrntum néélklküüli li T()T() constructora.constructora.

Page 19: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

MutatMutatóók II.k II.

MutatMutatóókat csak akkor hasznkat csak akkor hasznááljunk, ha nincs ljunk, ha nincs mmáás ms móód!d!MutatMutatóók hasznk hasznáálatlatáának vesznak veszéélyei:lyei:

1.1.

Nem inicializNem inicializáált mutatlt mutatóókk2.2.

FelszabadFelszabadíított memtott memóóririáára mutatra mutatóó

mutatmutatóókk

3.3.

Egy tEgy töömb vmb véége utge utáánra mutatnra mutatóó

mutatmutatóókk4.4.

MutatMutatóók, amik mk, amik máásra mutatnak, mint gondolnsra mutatnak, mint gondolnáánknk

5.5.

MutatMutatóók, amikrk, amikrőől fogalmunk sincs hova l fogalmunk sincs hova mutatnakmutatnak

Page 20: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

MutatMutatóók III.k III.MutatMutatóó aritmetika (a C aritmetika (a C éés C++ els C++ előőnye):nye):

const const intint size=100;size=100;T tT t, *pt, *p;, *pt, *p;pt = new pt = new T[sizeT[size]; ]; // pt // pt a size elema size eleműű ttöömb elsmb elsőő (0 index(0 indexűű) elem) eleméére mutatre mutat

p = pt; ++p; p = pt; ++p; // p most a pt // p most a pt ááltal mutatott tltal mutatott töömb 2. (1 indexmb 2. (1 indexűű) elem) eleméére mutatre mutat

p = pt + 2; p = pt + 2; // p a pt // p a pt ááltal mutatott tltal mutatott töömb 3. (2 indexmb 3. (2 indexűű) elem) eleméére mutatre mutat

Ezek ekvivalensek:Ezek ekvivalensek:*(pt+2) *(pt+2) ptpt[2][2]NNöövelvelőő operoperáátor: ++, ill. cstor: ++, ill. csöökkentkkentőő operoperáátor: tor: ----Van elVan előőzeteszetes-- éés uts utóólagoslagos-- verziverzióójuk, juk, ++p++p éés s p++p++, ill. , ill. ++p++p éés s pp——Pl. legyen Pl. legyen int aint a[2][2] = {3, 4};= {3, 4}; éés s intint *pi = &a;*pi = &a;ekkor ekkor **++p++pii = 5= 5;; ututáán a n a = {3, 5} = {3, 5} leszlesz, , mmííg ehelyett g ehelyett *p*pii++++ = 5 = 5 ututáánna a = {5,4} = {5,4} leszlesz. p. pii mindkmindkéét esetben at esetben a[1][1]--re fog mutatni.re fog mutatni.

Page 21: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

KitKitéérrőő: Mutat: Mutatóók IV.k IV.T const *p;T const *p; vagy vagy constconst T *p;T *p;

p egy mutatp egy mutatóó ami konstans T objektum(sorozat)ra mutat.ami konstans T objektum(sorozat)ra mutat.T * const p = & tT * const p = & t;;

p egy konstans mutatp egy konstans mutatóó, ami egy T objektumra mutat. Nem , ami egy T objektumra mutat. Nem lehet megvlehet megvááltoztatni (mintha hivatkozltoztatni (mintha hivatkozáás lenne). A s lenne). A deklardeklaráácicióójjáával egyidejval egyidejűűleg kell definileg kell definiáálni is. A p lni is. A p ááltal mutatott ltal mutatott éértrtéékek megvkek megvááltoztathatltoztathatóóak.ak.T const * const p = & tT const * const p = & t;;p is p is éés az s az ááltala mutatott vltala mutatott vááltozltozóó is konstansis konstans

Page 22: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

LeszLeszáármaztatrmaztatáássÍÍrjuk le az embereket, azaz a frjuk le az embereket, azaz a féérfiakat rfiakat éés a ns a nőőket.ket.Minden EmberMinden Ember--nek vannak knek vannak köözzöös tulajdonss tulajdonsáágai: feje, gai: feje, szeme, szszeme, száája, stb. Ezja, stb. Ezéért crt céélszerlszerűű az az öösszes Embert egy sszes Embert egy EMBER osztEMBER osztáállyal definillyal definiáálni.lni.TudjukTudjuk, , hogyhogy minmindden en NNőő éés Fs Féérfi egyrfi egyúúttal ttal EEmber is.mber is.Ugyanakkor a fUgyanakkor a féérfiaknak rfiaknak éés ns nőőknek vannak csak knek vannak csak rráájuk jellemzjuk jellemzőő tulajdonstulajdonsáágaik. Ezgaik. Ezéért rt íírjuk le a nrjuk le a nőőket a ket a NO a FNO a Féérfiakat a Frfiakat a FÉÉRFI osztallyal.RFI osztallyal.BeBeáágyazhatngyazhatnáánk minden NOnk minden NO--be be éés FERFIs FERFI--be egy be egy EMBEREMBER--t, de t, de ez nem a keresett kapcsolatez nem a keresett kapcsolat! Nem azt ! Nem azt akarjuk pl. leakarjuk pl. leíírni, hogy "rni, hogy "Minden nMinden nőőben van valami" ben van valami" emberember, hanem azt, hogy ", hanem azt, hogy "Minden nMinden nőő emberember".".

Page 23: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

LeszLeszáármaztatrmaztatáás II.s II.

PrPróóbbááljuk meg a definljuk meg a definíícicióókat (az kat (az úún. interfacen. interface--t) t) éés s a megvala megvalóóssííttáást/hasznst/hasznáálatot klatot küüllöönvnváálasztani!lasztani!Rakjuk az osztRakjuk az osztáálydefinlydefiníícicióókat kkat küüllöön fn fáájlba. Ennek jlba. Ennek kiterjesztkiterjesztéése rendszerint .se rendszerint .h h ('header' f('header' fáájl)jl)TehTeháát az alt az aláábbi forrbbi forráás fs fáájljaink lesznek:jljaink lesznek:

nemek.h nemek.h –– az osztaz osztáálydeklarlydeklaráácicióókkalkkalnemek.cpp nemek.cpp –– a defina definíícicióók k main.cpp main.cpp –– ebben van a main() a futtatebben van a main() a futtatááshozshoz

Egy bonyolultabb programban tEgy bonyolultabb programban tööbb .h bb .h éés .cpp fs .cpp fáájl jl van. A main() fvan. A main() füüggvggvéény csak egyben lehet.ny csak egyben lehet.

Page 24: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

LeszLeszáármaztatrmaztatáás III.s III.

A teljes Visual C++ os projekt a A teljes Visual C++ os projekt a TanszTanszééki honlaprki honlapróól letl letöölthetlthetőő éés s (b(bőővebb) magyarvebb) magyaráázatokat is zatokat is tartalmaztartalmazA nemek.h fA nemek.h fáájl tartalma jl tartalma (ahhoz, hogy ezt a (ahhoz, hogy ezt a ffáájlt a fordjlt a fordííttóó éértelmezni tudja azutrtelmezni tudja azutáán lehet csak hasznn lehet csak hasznáálni, lni, miutmiutáán az iostreamn az iostream--et met máár includer include--oltuk)oltuk)

Page 25: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

nemek.h I.nemek.h I.#if !defined(_nemekH)#if !defined(_nemekH)

#define _nemekH#define _nemekH

// felt// feltéételes fordteles fordííttáási blokk eleje. A blokk vsi blokk eleje. A blokk véége (#endif) a nemek.h IV oldalonge (#endif) a nemek.h IV oldalonnamespace nemeknamespace nemek{ { class SZOVEG class SZOVEG // s// segegééd osztd osztáály a nevek tly a nevek táárolroláássáához. hoz. {{public:public:

SZOVEG(char txt[] ) SZOVEG(char txt[] ) { {

_pszoveg = new char[ strlen(txt)+1];_pszoveg = new char[ strlen(txt)+1];

// dinamikus mem// dinamikus memóória ria a sza szöövegnek vegnek éés az azt lezs az azt lezáárróó

\\00--naknakstrcpy(_pszoveg, txt);strcpy(_pszoveg, txt);

// // szszööveg veg áátmtmáásolsoláássa pszovega pszoveg--bebe

a za záárróó

0 karakterrel egy0 karakterrel együütttt}}~SZOVEG() ~SZOVEG() { {

delete [] _pszoveg; delete [] _pszoveg; // a// a

lefoglallefoglalt memt memóória ria felszabadfelszabadííttáásasa}}char const *Szoveg() const { return _pszoveg; } char const *Szoveg() const { return _pszoveg; }

private:private:char *_pszoveg;char *_pszoveg;

// ez nem lehet konstans// ez nem lehet konstans};};

Page 26: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

nemek.h II.nemek.h II.class EMBERclass EMBER{{public:public:

EMBER(char nev[])EMBER(char nev[]); // a f; // a füüggvggvéény tny töörzse mrzse mááshol vanshol van~EMBER()~EMBER();;

const char *Neve() const { return _nev.Szoveg(); }const char *Neve() const { return _nev.Szoveg(); }virtual char *Megszolitasa()=0;virtual char *Megszolitasa()=0;

// "tiszt// "tisztáán virtun virtuáális flis füüggvggvéény" majd csak a ny" majd csak a

leszleszáármaztatott osztrmaztatott osztáályban lesz definilyban lesz definiáálva. Emiatt EMBER objektumot nem lehet lva. Emiatt EMBER objektumot nem lehet lléétrehozni minden lesztrehozni minden leszáármaztatott osztrmaztatott osztáályban mlyban máás leszs leszvoid Koszonti(EMBER &e) void Koszonti(EMBER &e) ; ; // B// Báármilyen EMBERrmilyen EMBER--t elfogadt elfogad

protected:protected:

// Mintha // Mintha private:private:

lenne, de a leszlenne, de a leszáámaztatott osztmaztatott osztáály is lly is láátjatjaconst SZOVEG _nev;const SZOVEG _nev;

// az EMBER // az EMBER éélete sorlete soráán nem vn nem vááltozikltozik

};};

Page 27: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

nemek.h III.nemek.h III.

class FERFI: public EMBERclass FERFI: public EMBER{{

// azaz a FERFI // azaz a FERFI az egyaz egy

EMBER EMBER éés annak minden public s annak minden public éés protected s protected

vvááltozltozóójjáát t éés ms móódszerdszeréét elt eléériri

public:public:FERFI(char nev[]): EMBER(nev)FERFI(char nev[]): EMBER(nev);;~FERFI() {}~FERFI() {}char *Megszolitasa() { return "Uram"; }char *Megszolitasa() { return "Uram"; }

};};

Page 28: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

nemek.h IV.nemek.h IV.class NO: public EMBERclass NO: public EMBER{{public:public:

NO(char nev[]): EMBER(nev)NO(char nev[]): EMBER(nev);;~NO() {}~NO() {}char *Megszolitasa() { return "Hchar *Megszolitasa() { return "Höölgyem"; }lgyem"; }

};};} } // A // A nemek nemek namespacenamespace

vvéégege

// a nemek.h I. oldalon kezdett felt// a nemek.h I. oldalon kezdett feltéételesen lefordtelesen lefordíítandtandóó

blokk vblokk véégege#endif#endif

Page 29: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

nemek.cppnemek.cpp#include "stdafx.h" #include "stdafx.h" // ez az el// ez az előőre fordre fordíított headertott header--ek miatt kell. Microsoft specialitek miatt kell. Microsoft specialitááss#include <iostream> #include <iostream> // ebben van a << defin// ebben van a << definíáíálláásasa

using std::cout; using std::cout; // ezut// ezutáán nem kell pl std::cout n nem kell pl std::cout --ot ot íírni. Elrni. Eléég a cout.g a cout.using std::endl;using std::endl;

#include "nemek.h"#include "nemek.h"

using namespace nemek; // hogy ne kelljen alusing namespace nemek; // hogy ne kelljen aláább nemek::FERFIbb nemek::FERFI--t hasznt hasznáálnunklnunkEMBER::EMBER(char nev[]):_nev(nev) EMBER::EMBER(char nev[]):_nev(nev) { {

cout << _nev.Szoveg() << " vagyok "; cout << _nev.Szoveg() << " vagyok "; }}EMBER::~EMBER() EMBER::~EMBER() { {

cout << "Viszlcout << "Viszláát! mondja " << _nev.Szoveg() << endl; t! mondja " << _nev.Szoveg() << endl; }}

Page 30: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

nemek.cpp II.nemek.cpp II.

void EMBER::Koszonti(EMBER &e) void EMBER::Koszonti(EMBER &e) { {

cout << "Jcout << "Jóó

napot " << e.Megszolitasa() << "!" napot " << e.Megszolitasa() << "!" << endl;<< endl;

}}MiutMiutáán a Megszn a Megszóóllííttáás() virtus() virtuáális mindlis mindííg a g a leszleszáármaztatott objektumnak megfelelrmaztatott objektumnak megfelelőőhhíívvóódik meg. Ha nem az lenne, akkor az dik meg. Ha nem az lenne, akkor az EMBER osztEMBER osztáálylyéé hhíívvóódna meg.dna meg.

Page 31: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

nemek.cpp III.nemek.cpp III.

FERFI::FERFI(char nev[]): EMBER(nev) FERFI::FERFI(char nev[]): EMBER(nev) { {

cout << "cout << "éés fs féérfi." << endl; rfi." << endl; }}NO::NO(char nev[]): EMBER(nev) NO::NO(char nev[]): EMBER(nev) {{

cout << "cout << "éés ns nőő." << endl; ." << endl; }}

Page 32: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

main.cppmain.cpp#include "stdafx.h" // ez az el#include "stdafx.h" // ez az előőre fordre fordíított headertott header--ek miatt kell. Microsoft ek miatt kell. Microsoft

specialitspecialitááss#include <iostream> // ebben van a << defin#include <iostream> // ebben van a << definíáíálláásasausing namespace std; // ezutusing namespace std; // ezutáán nem kell pl std::cout n nem kell pl std::cout --ot ot íírni. Elrni. Eléég a cout.g a cout.#include "nemek.h" // itt defini#include "nemek.h" // itt definiááltuk az osztltuk az osztáályokat egy sajlyokat egy sajáát namespacet namespace--

en been beüüll

using namespace nemek; // hogy ne kelljen alusing namespace nemek; // hogy ne kelljen aláább nemek::FERFIbb nemek::FERFI--t t hasznhasznáálnunklnunk

FERFI adam("FERFI adam("ÁÁddáám"); // adam nem csak Fm"); // adam nem csak FÉÉRFI, de EMBER isRFI, de EMBER isNO eva("NO eva("ÉÉva"); // eva nem csak NO, de EMBER is va"); // eva nem csak NO, de EMBER is

Page 33: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

main.cpp II.main.cpp II.

// a Koszonti() f// a Koszonti() füüggvggvéény EMBERny EMBER--t vt váár, mr, méégis gis 'tudja', hogy FERFI'tudja', hogy FERFI--t vagy NOt vagy NO--t kt kööszszööntnt

int main() int main() {{

cout << "cout << "----------------------------\\n";n";adam.Koszonti(eva);adam.Koszonti(eva);

eva.Koszonti(adam);eva.Koszonti(adam);

cout << "cout << "----------------------------\\n";n";return 0;return 0;

}}

Page 34: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

LeszLeszáármaztatrmaztatááss IV.IV.A leszA leszáármaztatrmaztatáás egy "s egy "az egyaz egy" kapcsolat: a " kapcsolat: a leszleszáármaztatott objektum rmaztatott objektum az egyaz egy szszüüllőő objektum plusz objektum plusz tulajdonstulajdonsáágokkalgokkalA leszA leszáármaztatott objektum rmaztatott objektum öörröökli a szkli a szüüllőő adat tagjait adat tagjait éés ms móódszereit, kivdszereit, kivééve a kve a köövetkezvetkezőőket:ket:

Constructor Constructor éés destructors destructoréértrtéékadkadáás opers operáátora: tora: operator=()operator=()friendfriend ffüüggvggvéények nyek éés oszts osztáályoklyok

A leszA leszáármaztatott objektum rmaztatott objektum áátdefinitdefiniáálhatja az lhatja az anyaobjektum manyaobjektum móódszereitdszereitA leszA leszáármaztatrmaztatáás lehet: public, protected, vagy s lehet: public, protected, vagy private:private:

Page 35: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

LeszLeszáármaztatrmaztatááss V.V. HozzHozzááfféérréés szabs szabáályozlyozáása a leszsa a leszáármaztatrmaztatáás ms móódja szerintdja szerint

LeszLeszáármaztatrmaztatáás ms móódjadja ami A szami A száámmáárara az B szaz B száámmáárara

class B : public Aclass B : public A publicpublicprotectedprotectedprivateprivate

publicpublicprotectedprotectednem hozznem hozzááfféérhetrhetőő

class B : private Aclass B : private A publicpublicprotectedprotectedprivateprivate

privateprivateprivateprivatenem hozznem hozzááfféérhetrhetőő

class B:protected Aclass B:protected A publicpublicprotectedprotectedprivateprivate

protectedprotectedprotectedprotectednem hozznem hozzááfféérhetrhetőő

Page 36: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

MegjegyzMegjegyzééssclass A class A

{{

public:public:void f();void f();void g();void g();

……}}

class class B : private AB : private A // ez minden A beli public vagy protetced adatb// ez minden A beli public vagy protetced adatbóól privatel private--t csint csinááll{{

// B// B--ben [ B nem fben [ B nem féér hozzr hozzáá

A private tagjaihoz]A private tagjaihoz]public:public:

using using A::fA::f; ; // // DE az A beli public f() fDE az A beli public f() füüggvggvéény public lesz Bny public lesz B--ben isben is……

// // [f ut[f utáán nincs ()!], mikn nincs ()!], miköözben g() private fzben g() private füüggvggvéénye Bnye B--neknek}}

Page 37: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

LeszLeszáármaztatrmaztatááss V.V.

A lA léétrehoztrehozáások sorrendje:sok sorrendje:elelőőszszöör a szr a szüüllőő objektum jobjektum jöön ln léétre a szoktre a szokáásos sos mmóódon. Ha vannak benne bedon. Ha vannak benne beáágyazgyazáások, akkor sok, akkor elelőőszszöör azok, utr azok, utáána az na az őőket tartalmazket tartalmazóó objektumobjektumezutezutáán jn jöön ln léétre a lesztre a leszáármaztatott objektum rmaztatott objektum ugyanilyen mugyanilyen móódon.don.

A megsemmisA megsemmisüülléés sorrendje a ls sorrendje a léétrehoztrehozáás s sorrendjsorrendjéének a fordnek a fordíítottja.tottja.

Page 38: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

HibakezelHibakezeléés I.s I.ProgramhibProgramhibáák lekezelk lekezeléésséének helyes mnek helyes móódszere a dszere a kivkivéételtel ((exceptionexception) kezel) kezeléés.s.A problA probléémmáás rs réészeket egy szeket egy try try {{ }} blokkbablokkba rakjukrakjukHiba esetHiba esetéén a n a trytry blokkban vblokkban véégrehajtott fgrehajtott füüggvggvéény egy kivny egy kivéételt telt úún. n. exceptionexception--t dob. Pl.t dob. Pl.intint

HibatAdoFuggvenyHibatAdoFuggveny(char (char szNameszName[]) []) throw(throw(……))

{{

// // a throw(...) a fa throw(...) a füüggvggvéény nny néév utv utáán azt jelzi, hogy vmilyenn azt jelzi, hogy vmilyen// egyel// egyelőőre hatre hatáározatlan exceptionrozatlan exception--t dobhatt dobhat

f f = = fopen(szNamefopen(szName, ", "wbwb");");ifif(!f(!f))

throwthrow

FileIOExceptionFileIOException

eio("Feio("Fáájl megnyitjl megnyitáási hiba"si hiba"););........

returnreturn

0;0;}}

A A throw(...)throw(...)

a fa füüggvggvéénynnynéév utv utáán opcionn opcionáális. Ha azt akarjuk kifejezni, hogy egy lis. Ha azt akarjuk kifejezni, hogy egy ffüüggvggvéény ny nemnem

dobbhat exceptiondobbhat exception--t akkor a ft akkor a füüggvggvéény neve utny neve utáán a "n a "..."..."

argumentum nargumentum náálklküüli li throw()throw()

––t t íírjunk.rjunk.

Page 39: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

HibakezelHibakezeléés II.s II.A A try try {}{} blokk utblokk utáán egy vagy tn egy vagy tööbbbb catchcatch blokkban kapjuk el a dobott blokkban kapjuk el a dobott exceptionexception--ttPl.Pl.

trytry{{

... ... esetlegesetleg

hibhibáát t okozokozóó

ffüüggvggvéényhnyhíívváásoksok

......}}catchcatch

((OutOfMemoryOutOfMemoryException &e)Exception &e){{

hhibakezelibakezelééss

I. I. // csak // csak OutOfMemoryOutOfMemoryException tException tíípuspusúú

exception exception ––re jre jöön iden idethrow; throw; // ugyanezt az exception// ugyanezt az exception--t tovt továábbkbbküüldildi

}}catchcatch

((......)){{

// minden eddig nem kezelt Exceptionra ide j// minden eddig nem kezelt Exceptionra ide jöönnhhibakezelibakezelééss

II. II. // innen nem k// innen nem küüldjldjüük tovk továábbbb}}

Page 40: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

OperOperáátor ttor túúlterhellterheléés (overloading)s (overloading)

A C++ ban szinte minden operA C++ ban szinte minden operáátor tor ttúúlterhelhetlterhelhetőő. Pl:. Pl:= + = + --

* / * / += += --= *= /= ++ = *= /= ++ ----

== () [] == () [] ^̂

~~

newnew

--> >

& | & | NemNem ttúúlterhelhetlterhelhetőőek:ek:. ? sizeof. ? sizeof

Csak olyan tCsak olyan túúlterhellterheléések lehetssek lehetséégesek, gesek, amelyekben legalamelyekben legaláább az egyik parambb az egyik paramééter nem ter nem bebeééppíített ttett tíípus.pus.

Page 41: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

OperOperáátor ttor túúlterhellterhelééssSzintaxis (pSzintaxis (péélda)lda)

1.1.

osztosztáály deklarly deklaráácicióón beln belüüll::class COMPLEXclass COMPLEX{{public:public:

COMPLEX(double r,double i) : real(r), im(i) {}COMPLEX(double r,double i) : real(r), im(i) {}double real,im;double real,im;

COMPLEX operator+(const COMPLEX &c2)COMPLEX operator+(const COMPLEX &c2){{

COMPLEX c(0,0);COMPLEX c(0,0);

// // ezez

egyegy

loklokáális vlis vááltozltozóóc.real = real + c2.real; // mert nem akarjuk megvc.real = real + c2.real; // mert nem akarjuk megvááltoztatniltoztatnic.im =im + c2.im; // az objektumot, amihez hozzc.im =im + c2.im; // az objektumot, amihez hozzááadunkadunkreturn c;return c;

// // éértrtéék alapjk alapjáán adja vissza, ezn adja vissza, ezéért nem bajrt nem baj

} // hogy a lok} // hogy a lokáális vlis vááltozltozóó

megsemmismegsemmisüüll};};

Page 42: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

OperOperáátor ttor túúlterhellterhelééssSzintaxis (pSzintaxis (péélda)lda)

1.1.

osztosztáály deklarly deklaráácicióón n kkíívvüüllclass COMPLEXclass COMPLEX{{public:public:

COMPLEX(double r,double i) : real(r), im(i) {}COMPLEX(double r,double i) : real(r), im(i) {}double real,im;double real,im;

};};

COMPLEX operator+(COMPLEX &c1, const COMPLEX &c2)COMPLEX operator+(COMPLEX &c1, const COMPLEX &c2){{COMPLEX c(0,0);COMPLEX c(0,0);c.real = c1.real + c2.real;c.real = c1.real + c2.real;

c.im = c1.im + c2.im;c.im = c1.im + c2.im;return c;return c;

}}

Page 43: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

OperOperáátor ttor túúlterhellterhelééssBBáármelyikrmelyik hasznhasznáálatalata::

using namespace std;using namespace std;intint

main()main()

{{COMPLEX a(1,COMPLEX a(1,--1), b(3,1), b(3,--3);3);cout << "a: " << a.real << " + " << a.im << "icout << "a: " << a.real << " + " << a.im << "i\\n";n";cout << "b: " << b.real << " + " << b.im << "icout << "b: " << b.real << " + " << b.im << "i\\n";n";cout << "a + b= " << (a+b).real << " + " << (a+b).im << "icout << "a + b= " << (a+b).real << " + " << (a+b).im << "i\\n";n";cout << "a + b + b= " << (a+b+b).real << " + " << (a+b+b).im <<cout << "a + b + b= " << (a+b+b).real << " + " << (a+b+b).im <<

"i"i\\n"; // prn"; // próóbbááljuk ki nem lokljuk ki nem lokáális vlis vááltozltozóóval az operator+()val az operator+()--ban...ban...}}

Page 44: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

TeljesebbTeljesebb ppééldaldaclass COMPLEXclass COMPLEX{{

public:public:COMPLEX():_re(0),_im(0) {}COMPLEX():_re(0),_im(0) {}COMPLEX(double re) : _re(re),_im(0) {}COMPLEX(double re) : _re(re),_im(0) {}COMPLEX(double re, double im): _re(re), _im(im) {}COMPLEX(double re, double im): _re(re), _im(im) {}COMPLEX &operator=(double i) { _re = i; _im = 0; return *this; }COMPLEX &operator=(double i) { _re = i; _im = 0; return *this; }COMPLEX &operator=(const COMPLEX c) { _re = c._re; _im = c._im; COMPLEX &operator=(const COMPLEX c) { _re = c._re; _im = c._im; return *this;}return *this;}COMPLEX operator+(double i) { COMPLEX c; c._re = _re + i; returCOMPLEX operator+(double i) { COMPLEX c; c._re = _re + i; return c;}n c;}COMPLEX operator+(const COMPLEX c) COMPLEX operator+(const COMPLEX c)

{{COMPLEX t; t._re = _re + c._re; t._im = c._im; ; retCOMPLEX t; t._re = _re + c._re; t._im = c._im; ; return t;urn t;

}}COMPLEX operator*(const COMPLEX c) COMPLEX operator*(const COMPLEX c)

{{COMPLEX t;COMPLEX t;t._re = _re*c._re t._re = _re*c._re --_im*c._im;_im*c._im;t._im= _re*c._im+_im*c._re;t._im= _re*c._im+_im*c._re;return t;return t;

}}double Re() { return _re; }double Re() { return _re; }double Im() { return _im; }double Im() { return _im; }

private:private:double _re, _im;double _re, _im;

};};

Page 45: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

TemplateTemplate--ekek

Sokszor talSokszor taláálunk lunk ááltalltaláános nos öösszefsszefüüggggééseket, seket, illetve feladatokat.illetve feladatokat.

Pl. kPl. kéét vt vááltozltozóó felcserfelcseréélléése:se:void swap(int &i, int &j)void swap(int &i, int &j)

{ { intint

k = i; i = j; j = k; }k = i; i = j; j = k; }

void void swap(COMPLEXswap(COMPLEX

&c1, COMPLEX &c2) { &c1, COMPLEX &c2) { COMPLEX c = c1; c1 = c2; c2 = c1; }COMPLEX c = c1; c1 = c2; c2 = c1; }

EzEz ffüüggvggvéényny ttúúlterhellterhelééssessel is megoldhatl is megoldhatóó, mint , mint itt, de van jobb mitt, de van jobb móódszer is: az dszer is: az ááltalltaláános nos (generic) oszt(generic) osztáályok, eljlyok, eljáárráások a sok a templatetemplate--ekek..EkkorEkkor a forda fordííttóóprogram generprogram generáálja a klja a kóódot.dot.

Page 46: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

TemplateTemplate--ekek

template template <class A> <class A> swap(Aswap(A &a, A &b)&a, A &b){{

A c = a; a=b; b = c; A c = a; a=b; b = c; }}HasznHasznáálatalata::

intint i=3,j=4; i=3,j=4; swap <int>(i,j);swap <int>(i,j);COMPLEX a(1,1),b(2,COMPLEX a(1,1),b(2,--3); 3); swap <COMPLEX>(swap <COMPLEX>(a,ba,b););

MegjegyzMegjegyzéés: a swap template az std namespaces: a swap template az std namespace--ben ben mmáár definir definiáálva van.lva van.

Page 47: Objektum Orientált Programozás C++ nyelven · 2008-05-13 · Megjegyzések A Microsoft Visual Studio (2005) –beli C++ fordítónak meg kell adni egy stdafx.h nev ű (akár üres)

Class TemplateClass Template--ekekNem csak fNem csak füüggvggvéénynek lehet templatenynek lehet template--jeje, , hanemhanem osztosztáályoknaklyoknak is. Plis. Pl::

templatetemplate

<class T> class GVECTOR // <class T> class GVECTOR // tetsztetszőőlegelege

objektumokobjektumok

ttáárolroláássáára alkalmas vera alkalmas vekktortor{{public:public:

GVECTOR(int mini, int maxi) GVECTOR(int mini, int maxi) ::

_min(mini), _max(maxi), _dim(_max _min(mini), _max(maxi), _dim(_max --

_min + 1)_min + 1){{

_v =_v =

newnew

T[_dim];T[_dim];}}~GVECTOR() { delete [] _v; }~GVECTOR() { delete [] _v; }

T &T &operator[](operator[](int i)int i){{if(i < _min || i > _max)if(i < _min || i > _max)throw "index hiba";throw "index hiba";

return _v[ i return _v[ i --

_min];_min];}}... ... // tov// továábbi operbbi operáátorok, private tagok, stbtorok, private tagok, stb

};};A teljes pA teljes péélda letlda letöölthetlthetőő

a tansza tanszééki honlaprki honlapróól.l.