TFeri.hu

A C++ nyelv alapjai 8. rész PDF Nyomtatás E-mail
  
Tartalomjegyzék
A C++ nyelv alapjai 8. rész
Numerikus könyvtár
Input/Output műveletek könyvtára
String műveletek
Dátum/idő könyvtár
Többcélú műveleti könyvtár
Minden oldal

15. fejezet: Osztályok (Classes)

Az osztályok az adatszerkezetek egy kibővített fogalmát jelentik, ugyanis nem csupán adatszerkezeteket lehet bennük tárolni, hanem függvényeket is.
Az objektum (object) az osztály (class) egy lehetséges segítsége. Ha egy változó szempontjából tekintjük, akkor az osztály lenne a típus (type) és az objektum (object) lenne a változó. Az osztályokat általában kulcsszavak segítségével képezzük a következő formula alapján:


class osztály_név {
hozzáférés_megadás_1:
tag1;
hozzáférés_megadás_2:
tag2;
...
} objektum_neve;


Itt az osztály_név egy érvényes azonosító az osztályban, az objektum_neve ezen osztályban választható nevek (nem kötelezően adott) listája. Az osztály-deklaráció lényege tartalmazza az egyes elemeket, amik egyaránt lehetnek adatok és függvények, esetleg speciális hozzáférési megadások.

Mindez nagyon hasonló az adatstruktúrák deklarációjához, kivéve, hogy ezúttal beépíthetünk függvényeket és elemeket, de ezeket speciális hozzáférésű megoldásoknak (megadásoknak) hívjuk. A hozzáférés megadása három fajta lehet: magán (private), nyilvános (public) és védett (protected). Ezek az hozzáférési jogosultságok módosítják az alapvető hozzáféréseket is. Alapértelmezés szerint egy osztály (class) minden tagja a class kulcsszóval való deklarálás miatt nyilvános (public) hozzáféréssel rendelkezik. Például:
class CRectangle {
int x, y;
public:
void set_values (int,int);
int area (void);
} rect;


Itt a CRectangle osztály deklarál egy objektumot, melyet rect-nek hívunk. Ezen osztálynak négy tagja van: két int típusú számadat (x és y) saját hozzáféréssel (private access) - mivel a privát az alapértelmezett jogosultsági szint; továbbá tartalmaz két függvényt is nyilvános hozzáféréssel set_values() és area() néven, amelyekből most még csak a deklarálásuk látható, nem pedig a teljes definíciójuk.
Figyeljük meg a különbséget az osztály (class) és az objektum (object) neve között: az előző példában a CRectangle volt az osztály (class) neve, míg a rect egy CRectangle típusú objektum neve volt. Ez teljesen megfelel a következő mintának is:
int aaaa;
Itt az int a típus neve (mint egy osztályé) és az aaaa a változó neve (mint egy osztálybeli objektumé).
A fenti deklaráció után simán használhatjuk is a függvényeket, persze előtte meg kell írnunk azokat! Például:
rect.set_values(3,4);    //Itt használtuk a függvényt.
myarea = rect.area();    //Itt meg a másikat.

Következzen most egy teljes példa a fenti class-deklarációval:

---------------------------------------------
// Osztályok példa
#include <iostream>
using namespace std;

class CRectangle {
int x, y;
public:
void set_values (int,int);
int area () {return (x*y);}
};

void CRectangle::set_values (int a, int b) {
x = a;
y = b;
}

int main () {
CRectangle rect;
rect.set_values (3,4);
cout << "area: " << rect.area();
return 0;
}
---------------------------------------------

A fenti kód legfontosabb új eleme a két darab kettőspont (::), ami a set_values() deklarációjában található. Arra használják, hogy meghatározza egy osztály tagját egy külső definíció számára. Továbbá észre lehetett venni, hogy az area() függvény teljes egésze bekerült a CRectangle osztály definíciójába azon egyszerű okból, hogy a set_values() csak a prototípusát adta meg az osztályon belül, de ez a meghatározás azon kívül is érvényes. Ebben a külső definícióban fel kell használnunk a :: szűrő hatályát is, mivel egy olyan függvényt szeretnénk definiálni, ami a CRectangle osztály tagja és nem globális függvény.

A következő példában bonyolítsuk kissé az előző kódot úgy, hogy most egy osztályunk és két objektumunk legyen.
---------------------------------------------
// Egy osztály két objektum
#include <iostream>
using namespace std;

class CRectangle {
int x, y;
public:
void set_values (int,int);
int area () {return (x*y);}
};

void CRectangle::set_values (int a, int b) {
x = a;
y = b;
}

int main () {
CRectangle rect, rectb;
rect.set_values (3,4);
rectb.set_values (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
---------------------------------------------

Ebben a konkrét esetben az osztály még mindig a CRectangle, melynek két objektuma van: rect és rectb. a main() függvényben először is deklaráljuk őket, majd értéket adunk nekik, végül kiíratjuk a területüket. Lényeges megjegyezni, hogy a rect.area() nem ad azonos értéket a rectb.area()-val, mert különbözőek a bemeneti értékeik.
Ez az objektum-orientált programozás alapvető koncepciója: az adatok és a függvények egyazon objektum (jelen esetben osztály) tagjai. Ezen túl nem kell használnunk globális változókat, hogy átadjuk egyik függvénytől a másiknak a megfelelő értéket, hanem tárgyakat és eseményeket kezelünk, amelyek saját adatokkal és beépített függvényekkel rendelkeznek. Figyeljük meg, hogy nem kellett semmilyen paramétert megadni a rect.area() és a rectb.area() hívásakor.

 



 
Ulti Clocks content

Hirdetés