Típusmegvalósítás
A standard C++ programozási nyelv a C –ből átvett és
némileg módosított összetett adatszerkezetek definiálását teszi lehetővé.
Typedef
Egy meglévő típusból származtatott típus, mely örökli az szülő minden tulajdonságát, beleértve a típusműveleteket
is. Gyakorlatilag egy átnevezett másolat.
Használata: typedef
szülőtípus új_típus_neve;
Példa: typedef unsigned char octet;
Enum
Speciális, típusfüggetlen
felsorolási típus. A felsorolás minden eleme megfeleltethető egy természetes
számnak, így értelmezhető az elemein egy egyszerű részbenrendezés.
Használata: enum típusnév {elem1,
elem2, …};
Példa: enum evszakok {tavaz, nyar,
osz, tel};
Itt a tavaszhoz a 0-ás
sorszám tartozik, a nyárhoz
az 1-es és így tovább. Hagyományos ’C’ módszerekkel ez a következőképpen
implementálható:
#define tavasz 0
#define nyar 1
#define osz 2
#define tel 3
Union
A
union –nal definiált típus különböző adattípusok együttes tárolására szolgáló
adatszerkezet. Az adattagjaira külön-külön hivatkozhatunk, alapértelmezésben public
elérésűek, tehát a struct –hoz hasonló adatforma. Van azonban egy nagyon fontos
funkcionális különbség: minden adattagja a ugyanazon a
memóriacímen helyezkedik el. A program deklarációkor statikusan lefoglalja az
adatok helyét a memóriában. A közös címzés eredménye, hogy különböző adattagok
értékadása a többi adattagra is hatással van, ezért a gyakorlatban ritkán
használt, csak specifikus problémák megoldásához használt adatszerkezet.
Használata: union típusnév {típus1
változó1; típus2 változó2 …};
Példa: union plreg{struct{char
al,ah;} b; int w;}axreg;
Ebben a példában
létrehoztuk egy „plreg” típusú „axreg” nevű 16 bites regiszter modelljét,
amelynek alsó és felső 8 bitjére külön is hivatkozhatunk. Például a következő
utasítássorozat eredménye pontosan ugyanazt az eredményt produkálja a
memóriában, mint ez: axreg.w=0xFFFF;
axreg.b.al=0xFF;
axreg b.ah=0xFF;
Struct
A struct, a class és a union nagyon hasonlóak egymáshoz. Az előbbi union –tól
abban különbözik a struct, hogy külön címzése van minden adattagjának és a
típushoz saját metódusokat definiálhatunk, beleértve a
konstruktort és a destruktort is. A union –hoz
hasonlóan alapértelmezésben minden adattagja és metódusa public. A class –tól
csak alapértelmezett láthatóság szempontjából tekinthetjük különbözőnek,
egymásnak megfeleltethetőek. A struct a C nyelv, a class pedig a C++ nyelv
preferált struktúrája.
Használata: struct típusnév {típus1
változó1; típus2 változó2 …; metódusdef 1, metódusdef
2; …};
Példa: struct ember {string nev;
private: int kor; public: ember(string n, int
k){nev=n; kor=k;};};
Az előbbi példában
létrehoztunk egy olyan „ember” nevű adatszerkezetet, amely két attribútumból
áll, a nev (string) –ből és a kor (int) –ből, melyek közül az első
alapértelmezésben public, a második pedig private.
Ezen kívül definiáltunk egy konstruktort (ha ezt nem tesszük meg, akkor az
attribútumok alapértelmezett konstruktorai hívódnak meg). A következő
kódrészlet a fent definiált struct –nak létrehozza egy példányát és
megváltoztatja a nevét!
ember emb(„Lajos”,20);
emb.nev=”Anna”;
Nem hivatkozhatnék a kor
attribútumra, mivel az private elérésű, tehát annak nem módosíthattam volna,
sőt, le sem kérdezhettem volna az értékét!
Class
A C++ szabványos,
preferált és legjobban támogatott típusmegvalósító eszköze. A struct –tól
csupán láthatóság szempontjából nevezhető különbözőnek: alapértelmezésben
minden adattagja és metódusa private. Ez megfelel az objektumelvű programozás
azon alapelvének, hogy rejtve legyen a konkrét típusreprezentáció és a típus a típusműveletein keresztül legyen elérhető.
Használata: class osztálynév {típus1
változó1; típus2 változó2 …; metódusdef 1, metódusdef
2; …};
Példa: class ember {string nev; int
kor; public: ember(string n, int k){nev=n; kor=k;};
public: void set_Nev(string n){nev=n;};};
Ez a példa a struct –nál
látott példa megfeleltetése osztályokra. A különbség az, hogy most az
alapértelmezett láthatósága az adattagoknak private, tehát az ember osztály
konkrét típusreprezentációja rejtve van. Az osztályt a public metódusain
(típusműveleteken) keresztül érjük el. Így a struct –nál látott módon most nem
változtathatjuk meg közvetlenül a példány nevét, ahhoz public: string nev; -vel
kellett volna deklarálnunk azt. Viszont van erre megfelelő típusműveletünk,
tehát a következő kódrészlet megfelelő:
ember emb(„Lajos”,20);
emb.set_Nev(”Anna”);
Természetesen ezt a
módszert is alkalmazhattuk volna a struct esetében és viszont, hiszen a kettő
egymásnak megfeleltethető.
Végszó
Természetesen ez csak egy
rövid bevezető, egy egyszerű ízelítő a standard C++ -ban használatos
típusmegvalósító programozói eszközökről. Részletesebb leírások, szintaxisok,
valamint példák bőségesen fellelhetőek az Interneten, elsősorban angol, de sok
site –on magyar nyelven is. Mivel az objektumorientált programozás
modularizációs elvének alapvető építőköveit reprezentálják, aki C++ -szal, vagy
egyéb OO programozási nyelvvel kíván komolyabban foglalkozni, annak
mindenképpen ajánlom figyelmébe az itt felsoroltak, elsősorban az osztályok
alaposabb tanulmányozását!
Az itt található írás !!!nem ellenőrzött anyag!!!, az ELTE elsőéves
programtervező matematikus és programtervező informatikus hallgatók oktatási segédanyaga
az elemi alkalmazások fejlesztése, ill. alkalmazások fejlesztése c. tárgyakhoz.
Írta: Kátai Kornél, dr. Gregorics Tibor írásai alapján
Budapest, 2006