Miskolci Egyetem Általános Informatikai Tanszék
Ficsor Lajos
Osztály és objektum fogalma
Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
1
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. Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
2
CPP1/
3
Osztálydeklaráció szintaktikája kulcsszó osztálynév <:szülők listája> { 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) Ficsor Lajos
A C++ programozási nyelv I.
Software fejlesztés II. Műszaki Informatikus kiegészítő levelező képzés
CPP1 / 1
Miskolci Egyetem Általános Informatikai Tanszék
Ficsor Lajos
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)
Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
4
CPP1/
5
CPP1/
6
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ályhatá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 Ficsor Lajos
A C++ programozási nyelv I.
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ó
Ficsor Lajos
A C++ programozási nyelv I.
Software fejlesztés II. Műszaki Informatikus kiegészítő levelező képzés
CPP1 / 2
Miskolci Egyetem Általános Informatikai Tanszék
Ficsor Lajos
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 Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
7
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! Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
8
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).
Ficsor Lajos
A C++ programozási nyelv I.
Software fejlesztés II. Műszaki Informatikus kiegészítő levelező képzés
CPP1/
9
CPP1 / 3
Miskolci Egyetem Általános Informatikai Tanszék
Ficsor Lajos
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); }; Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
10
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;} Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
11
Példa: főprogram void main(void) { jarmu bicikli; // Objektum def. bicikli.beallit(2,1,20); printf( “Bicikli kerekterheles: %lf”, bicikli.kerek_terheles() ); } Ficsor Lajos
A C++ programozási nyelv I.
Software fejlesztés II. Műszaki Informatikus kiegészítő levelező képzés
CPP1/
12
CPP1 / 4
Miskolci Egyetem Általános Informatikai Tanszék
Ficsor Lajos
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 Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
13
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 Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
14
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. Ficsor Lajos
A C++ programozási nyelv I.
Software fejlesztés II. Műszaki Informatikus kiegészítő levelező képzés
CPP1/
15
CPP1 / 5
Miskolci Egyetem Általános Informatikai Tanszék
Ficsor Lajos
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?
Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
16
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ő.
Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
17
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. Ficsor Lajos
A C++ programozási nyelv I.
Software fejlesztés II. Műszaki Informatikus kiegészítő levelező képzés
CPP1/
18
CPP1 / 6
Miskolci Egyetem Általános Informatikai Tanszék
Ficsor Lajos
Példa: friend függvény class X { friend int F (int); int i; public: int tag (double); }; int F (int a) { . . . } Ficsor Lajos
// Dekl.
// Def.
A C++ programozási nyelv I.
CPP1/
19
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.
Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
20
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 Ficsor Lajos
A C++ programozási nyelv I.
Software fejlesztés II. Műszaki Informatikus kiegészítő levelező képzés
CPP1/
21
CPP1 / 7
Miskolci Egyetem Általános Informatikai Tanszék
Ficsor Lajos
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. Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
22
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 Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
23
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. Ficsor Lajos
A C++ programozási nyelv I.
Software fejlesztés II. Műszaki Informatikus kiegészítő levelező képzés
CPP1/
24
CPP1 / 8
Miskolci Egyetem Általános Informatikai Tanszék
Ficsor Lajos
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!) Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
25
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! Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
26
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 Ficsor Lajos
A C++ programozási nyelv I.
Software fejlesztés II. Műszaki Informatikus kiegészítő levelező képzés
CPP1/
27
CPP1 / 9
Miskolci Egyetem Általános Informatikai Tanszék
Ficsor Lajos
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 Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
28
Egyoperandusú operátor feldolgozása Az x@ kifejezés feldolgozásának egy lehetséges forgatókönyve x alaptípusú?
Igen
Nem
Feldolgozás a beépített algoritmus szerint
Kész
x típusa Cx
Cx::operator@(void) ?
Van
x@ helyettesítése az x.operator@() függvényhívással
Kész
x@ helyettesítése az operator@(x) függvényhívással
Kész
Nincs ::operator@(Cx x) ? Nincs Hibajelzés! Ficsor Lajos
Van
Kész A C++ programozási nyelv I.
CPP1/
29
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
Ficsor Lajos
A C++ programozási nyelv I.
Software fejlesztés II. Műszaki Informatikus kiegészítő levelező képzés
CPP1/
30
CPP1 / 10
Miskolci Egyetem Általános Informatikai Tanszék
Ficsor Lajos
Operátor függvény paramétereinek száma Egyoperandusú Kétoperandusú operátor operátor Az operátor definiáló függvény tagfüggvény
0
1
Az operátor definiáló függvény külső függvény
1
2
Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
31
Operátor függvény és az operátor operandusai Egyoperan- Kétoperandusú dusú operátor operátor Az aktuális Az operátor definiáló függvény objektum tagfüggvény A függvény Az operátor definiáló függvény aktuális paramétere külső függvény
Ficsor Lajos
Baloldali: az aktuális objektum Jobboldali: a függvény paramétere Baloldali: a függvény első paramétere Jobboldali: a függvény második paramétere
A C++ programozási nyelv I.
CPP1/
32
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-; }; Ficsor Lajos
A C++ programozási nyelv I.
Software fejlesztés II. Műszaki Informatikus kiegészítő levelező képzés
CPP1/
33
CPP1 / 11
Miskolci Egyetem Általános Informatikai Tanszék
Ficsor Lajos
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"; } Ficsor Lajos
A C++ programozási nyelv I.
CPP1/
34
CPP1/
35
CPP1/
36
comp.cpp/2 complex complex::operator+ (complex z) // Osszeadas, tagfüggvény! {return complex(valos+z.valos, kepzetes+z.kepzetes); }
Ficsor Lajos
A C++ programozási nyelv I.
comp.cpp/3 complex operator- (complex z1, complex z2) // Külső függvény { return complex (z1.valos-z2.valos, z1.kepzetes-z2.kepzetes); } Ficsor Lajos
A C++ programozási nyelv I.
Software fejlesztés II. Műszaki Informatikus kiegészítő levelező képzés
CPP1 / 12
Miskolci Egyetem Általános Informatikai Tanszék
Ficsor Lajos
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) } Ficsor Lajos
A C++ programozási nyelv I.
Software fejlesztés II. Műszaki Informatikus kiegészítő levelező képzés
CPP1/
37
CPP1 / 13