Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaCsenge Papné Megváltozta több, mint 9 éve
2
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 1 Osztály és objektum fogalma
3
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 2 Az osztály (class) class: adatok és módszerek (method) (függvények) együttese, amely absztrakt adattípusként működik. objektum: egy osztály egy előfordulása módszer: az osztály egy eleme. Olyan függvény, amely az osztályba tartozó adatokon manipulál. Üzenet (message): kommunikáció az objektummal, annak módszerein keresztül.
4
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 3 Osztálydeklaráció szintaktikája kulcsszó osztálynév { mező lista } A kulcsszó lehet: class (esetleg struct, union) Osztály definícióra használjuk MINDIG a "class" kulcsszót! Az osztály tagjai (mezői) lehetnek: Adatmezők, adattagok (data member) függvény-mezők, tagfüggvények (member function)
5
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 4 A függvénymezők definíciója lehet belső (ekkor inline-nak minősül) külső (ekkor a hatáskör megjelölése szükséges)
6
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 5 Hatásköri kérdések Minden osztály egy önálló osztály-hatáskört definiál. (Egységbezárás alapelve!) A meződeklarációk lokálisak az osztály- hatáskörre nézve. A tagfüggvények egy hatáskörben vannak az adattagokkal => használhatják azokat! Hatáskör: scope Egységbezárás: encapsulation
7
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 6 Osztály használata Az osztálynév típusnévként viselkedik, és minden eddig ismert deklarációs konstrukcióban használható. Objektum: az osztály egy előfordulása. Például: osztály típusú változó
8
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 7 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 adattagra való hivatkozás (pontosan úgy, mint a struktúránál) tagfüggvény neve és aktuális paraméter-listája
9
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 8 Láthatósági kérdések Egy osztály tagjaira való hivatkozás az osztályon kívül alapértelmezés szerint tilos! (Információ rejtés alapelve!) (Information hiding) Láthatóságot szabályozó kulcsszavak: public: a mező bárhol használható ( protected: értelmezése majd később) private: csak az osztályon belül elérhető. Alapszabály: minden adattag private legyen!
10
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 9 A kulcsszavak a meződeklarációk közé írandók, a kettősponttal együtt. A kulcsszavak hatása a másik kulcsszóig, vagy az osztály deklarációjának a végéig tart. A láthatóságot befolyásolja még a friend mechanizmus is (lásd később).
11
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 10 Példa: osztálydefiníció class jarmu{ int kerekek; int szemely; int onsuly; public: void beallit(int k, int sz, int suly); double kerek_terheles (void); };
12
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 11 Példa: tagfüggvények implementációja void jarmu::beallit(int k, int sz,int suly) {kerekek = k; szemely = sz; onsuly = r;} double jarmu::kerek_terheles(void) {return (60.*szemely + onsuly)/ kerekek;}
13
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 12 Példa: főprogram void main(void) { jarmu bicikli;// Objektum def. bicikli.beallit(2,1,20); printf( “Bicikli kerekterheles: %lf”, bicikli.kerek_terheles() ); }
14
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 13 Objektum létrehozása Objektum létrehozása: objektum vagy objektumtömb definíció (statikus) new operátor (dinamikus) implicit létrehozás (ideiglenes objektumok) Folyamata: helyfoglalás az adattagoknak konstruktor automatikus meghívása
15
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 14 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
16
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 15 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.
17
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 16 A this mutató Minden objektumhoz saját adattag-készlet tartozik az osztály összes objektumára közös a tagfüggvény-készlet. Kérdés: hogyan tud a tagfüggvény az aktuális objektum adattagjaira hivatkozni?
18
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 17 Megoldás: 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ő.
19
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 18 A friend mechanizmus 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.
20
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 19 Példa: friend függvény class X { friend int F (int); // Dekl. int i; public: int tag (double); }; int F (int a)// Def. {... }
21
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 20 A friend mechanizmus (folyt.) 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.
22
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 21 A friend mechanizmus (folyt.) 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
23
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 22 Fordítási egységek Egy C++ programban az osztálydefiníció csak a tagfüggvények prototípusait tartalmazza, a definíciójuk külön forrásfile-ban van összegyűjtve. Szokásos megoldás: osztalynev.h Osztálydefiníció osztalynev.cpp Tagfüggvények definíciói. Hivatkozik az osztalynev.h file-ra.
24
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 23 Fordítási egységek (folyt.) Probléma: lehetséges többszörös beillesztés újradefiniálást okozhat fölöslegesen növeli a fordítási időt. Szokásos megoldás: egy pelda.h header file-ra #ifndef PELDA_H #define PELDA_h a header file tartalma #endif
25
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 24 Operátor overloading fogalma 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.
26
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 25 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!)
27
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 26 Alapszabályok (folyt.) 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. Az = operátornak azonos típusú objektumokra van alapértelmezése Nincs kommutativitás (felcserélhetőség) - a standard típusokra sem volt!
28
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 27 Operátor overloading: definíció Egyoperandusú (unáris) operátor: Az x@ és @x (@ tetszőleges operátorjel) ugyanaz, és a fordítóprogram az alábbi függvényhívások valamelyikével helyettesíti: x.operator@() ahol operator@ az x osztályának tagfüggvénye operator@(x) az operator@ külső függvény
29
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 28 Definíció (folyt.) Kétoperandusú (bináris) operátor: Az x@y kifejezést a fordítóprogram az alábbi függvényhívások valamelyikével helyettesíti: x.operator@(y) ahol operator@ az x osztályának tagfüggvénye vagy operator@(x,y) az operator@ külső függvény
30
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 29 Egyoperandusú operátor feldolgozása Az x@ kifejezés feldolgozásának egy lehetséges forgatókönyve x alaptípusú? Igen Feldolgozás a beépített algoritmus szerint Kész Nem x típusa Cx Cx::operator@(void) ? Van x@ helyettesítése az x.operator@() függvényhívással Kész Nincs ::operator@(Cx x) ? Van x@ helyettesítése az operator@(x) függvényhívással Kész Nincs Hibajelzés!Kész
31
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 30 Kétoperandusú operátor feldolgozása Analóg az egyoperandusú esettel, az alábbi eltérésekkel: –Ha mindkét operandus alaptípusú, a beépített algorimus beépítése –Ha a baloldali operandus osztálytípusú, annak osztályában keres tagfüggvényt –Ha a baloldali operandus alaptípusú, csak a külső operátor függvények között keres
32
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 31 Operátor függvény paramétereinek száma Egyoperandusú operátor Kétoperandusú operátor Az operátor definiáló függvény tagfüggvény 01 Az operátor definiáló függvény külső függvény 12
33
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 32 Operátor függvény és az operátor operandusai Egyoperan- dusú operátor Kétoperandusú operátor Az operátor definiáló függvény tagfüggvény Az aktuális objektum Baloldali: az aktuális objektum Jobboldali: a függvény paramétere Az operátor definiáló függvény külső függvény A függvény aktuális paramétere Baloldali: a függvény első paramétere Jobboldali: a függvény második paramétere
34
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 33 Példa: operátor overloading class complex {//comp.h double valos,kepzetes; public: complex (double v, double k); void kiir (void); complex operator+ (complex z); friend complex operator- (complex z1, complex z2); };
35
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 34 comp.cpp/1 #include #include ”comp.h” complex::complex (double v, double k) // Konstruktor { valos = v; kepzetes = k; } void complex::kiir (void) { cout << "(" << valos << "," << kepzetes << ")\n"; }
36
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 35 comp.cpp/2 complex complex::operator+ (complex z) // Osszeadas, tagfüggvény! {return complex(valos+z.valos, kepzetes+z.kepzetes); }
37
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 36 comp.cpp/3 complex operator- (complex z1, complex z2) // Külső függvény { return complex (z1.valos-z2.valos, z1.kepzetes-z2.kepzetes); }
38
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 37 proba.cpp #include ”comp.h” void main (void) { complex a(0,0), b(1,1), c(2,2); a = b + c; a.kiir(); // a = b.operator+(c) a = b - c; a.kiir(); // a = operator-(b,c) }
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.