next up previous contents
Elõre: Öröklés Fel: Programozás C++-ban Vissza: Az OOP alapjai

Egységbezárás

A C++ egyik fontos tulajdonsága, hogy lehetõségünk van az adataink és az õket manipuláló programkód összeforrasztására, egy egységbe zárására, egy osztályba foglalására. (Ez az ún. encapsulation.) Például tegyük fel, hogy defináltunk egy karakterkészletet (font-ot) leíró adatstruktúrát (például egy fejrészt és az egyes karakterek tulajdonságait leíró tömböt), amely kellõ információt tartalmaz ahhoz, hogy a karaktereket kirajzolhassuk a képernyõre, és vannak függvényeink, amelyekkel a karaktereinket megjeleníthetjük, átszínezhetjük és mozgathatjuk a képen.

A hagyományos C-ben az a szokásos megoldás, hogy az adatstruktúráinkat és a hozzájuk tartozó függvényeket egy önálló, külön fordítható forrásmodulban helyezzük el. Ez a megoldás már elég elegáns, de az adatok és az õket manipuláló függvények között még nincs explicit összerendeltség, továbbá más programozók egy másik modulból direkt módon is hozzáférhetnek az adatainkhoz, anélkül, hogy az adatok kezelésére szolgáló függvényeinket használnák. Ilyen esetekben az alap-adatstruktúra megváltozása fatális hibát okozhat egy nagyobb project-ben.

A C++-ban speciális tárolási egységfajták, az osztályok szolgálnak arra, hogy adatokat és a hozzájuk rendelt függvényeket egy egységként, egy objektumként kezelhessünk. Az osztályok alaptípusa a C++-ban a class, amely hasonlít a hagyományos C-bõl ismert struct-ra és union-ra. A C++-ban a struct és union is egy bizonyos fajta osztályok. A union-ra a hagyományos értelemben továbbra is szükség van, a struct-ot a kulcsszót pedig a C++-ban alapvetõen a hagyományos C-vel való kompatibilitás biztosítása végett tartották meg.

Tehát a fenti kulcsszavak szolgálnak arra, hogy osztályokat definiálhassunk. A C++-ban egy osztály típusú tárolási egység ( class, vagy struct) függvényeket (ún. függvénymezõket - angolul member functions) kombinál adatokkal (adatmezõkkel - angolul data members), és az így létrejött kombinációt elrejtjük, elzárjuk a külvilág elõl. Ezt értjük az egységbezárás alatt. Egy class-deklaráció hasonló a jól ismert struktúradeklarációhoz:

            class font {
                         ...
                       };
A fenti deklaráció után a font típussal tetszõleges változó, objektumpéldány (instance) definiálható:
            font times[10]; 
            font *f_ptr;
Egy másik változás a hagyományos C-hez képest az, hogy egy struct vagy class típuscímke (fenti példánkban a font) kulcsszó elhagyásával önmagában is típusértékû, tehát közvetlenül is használható változók definiálására, deklarálására.

A hagyományos C struktúrák (struct) és a C++ osztályok ( class) között a fõ különbség a mezõkhöz való hozzáférésben van. A C-ben egy struktúra mezõi (a megfelelõ érvényességi tartományon belül) szabadon elérhetõek, míg a C++-ban egy struct vagy class minden egyes mezõjéhez való hozzáférés önállóan kézbentartható azáltal, hogy publikusnak, privátnak, vagy védettnek deklaráljuk a public, private és protected kulcsszavakkal. (A hozzáférési szinteket késõbb részletesebben is tárgyaljuk.) A C és a C++ union-jai többé-kevésbé hasonlóak, egy C++ union-ban minden mezõ public, azaz mindenhonnan hozzáférhetõ, és ez a hozzáférési szint nem is változtatható meg. Egy struct-tal definiált osztályban alapértelmezés szerint minden mezõ public (ennek a hagyományos C-vel való kompatibilitás az oka, egyébként a struct osztályként való használata kerülendõ), de ez megváltoztatható, míg egy class-szal definiált osztályban a mezõk alapértelmezés szerint private hozzáférésûek, bár ez is módosítható. Az OOP-re jellemzõ az, hogy az adatmezõket privátnak, a függvénymezõket pedig publikusnak deklaráljuk. A továbbiakban csak a class típusû osztályokkal foglalkozunk, és javasoljuk, hogy a C++-ban programozók is csak a class kulcsszóval definiáljanak osztályokat.

Elõbbi pédánknál maradva, a font típust class-ként (osztályként) deklarálva elérhetjük, hogy a privát (private) hozzáférésû karakter-leíró információt csak a hozzájuk rendelt publikus (public) függvényekkel lehessen kezelni. Így, ha a karakterfont leírásában valamit változtatunk, azt az adott projectben résztvevõ többi programozó észre sem fogja venni (feltéve persze, hogy az adatmezõkkel együtt az azokat kezelõ függvénymezõket is módosítjuk). A font-definíciónk többé már nem egy konkrét reprezentációhoz kötõdik, hanem azokhoz a mûveletekhez, amelyeket az egyes karakterekkel végezhetünk.


next up previous contents
Elõre: Öröklés Fel: Programozás C++-ban Vissza: Az OOP alapjai