Programozás módszertan II. p. Programozás módszertan II. Bevezetés, a C++ osztályok Pere László (pipas@linux.pte.hu) PÉCSI TUDOMÁNYEGYETEM TERMÉSZETTUDOMÁNYI KAR INFORMATIKA ÉS ÁLTALÁNOS TECHNIKA TANSZÉK
A munkamenet Programozás módszertan II. p.
Programozás módszertan II. p. A C és C++ nyelvek A C++ nyelv egyik legfontosabb tervezési szempontja a C programozási nyelvvel való kompatibilitás volt. Ezt a célt kitűnően sikerült megvalósítani és a mai napig megtartani. A kompatibilitás olyan jó, hogy a gyakorlatban minden C program egyben C++ programnak is tekinthető.
Programozás módszertan II. p. A fordítás UNIX rendszereken a C++ programokat tartalmazó állomány nevének végződése a hagyomány szerint.cpp, a C++ fordító pedig a c++ névvel indítható: # c++ stack.cpp # A UNIX C++ fordítóprogramok a gyakorlatban a UNIX C programokhoz hasonló módon használhatók. Általában ugyanaz a program végzi a C és C++ nyelvű programok fordítását. A GNU C fordító indítható g++ névvel is.
Összetett adatszerkezetek Programozás módszertan II. p.
Programozás módszertan II. p. Összetett adatszerkezetek Az összetett adatszerkezeteket (struktúrák, union-ok, tömbök stb.) a C++ nyelvben ugyanúgy készíthetünk, mint ahogyan azt a C programozási nyelvben már megszoktuk. A C és a C++ nyelvben is használható az eddig általunk nem tárgyalt bitmező (bit field) és pakolt struktúra adatszerkezet.
Programozás módszertan II. p. Bitmező Bitmezőket és pakolt struktúrákat használunk: Extrém helytakarékosság esetén (ritka). Szabvány által szabályozott adatszerkezetek (hálózat, állomány stb.) használatakor. Hardver közeli programozáskor a regiszeterek értékének kezelésekor. A bitmezők használata a programot lassítja!
Programozás módszertan II. p. Bitmező Bitmezőket a komponensnevek után megadott bitmérettel hozhatunk létre: struct command { int opcode:2; char retcode:6; };
Programozás módszertan II. p. Pakolt struktúrák A GNU C fordító lehetővé teszi pakolt struktúrák létrehozását: struct test{ unsigned char field1; unsigned short field2; unsigned long field3; } attribute (( packed )); typedef struct test test_t;
Egyszerű osztályok Programozás módszertan II. p. 1
Programozás módszertan II. p. 1 Osztályok A C++ nyelv legfontosabb újítása a C nyelvhez képest az osztályok, objektumok bevezetése, ezért a legfontosabb, hogy ezek használatát megtanuljuk. Az osztályok, objektumok használatán túl a legfontosabb, hogy az objektumorientált szemléletmódot is elsajátítsuk! Vizsgáljuk most át a stack.cpp állományt!
Programozás módszertan II. p. 1 Az osztály létrehozása class stack { public: stack(void); ~stack(void); void push(int value); int pop(void); private: int sp; int size; int *data; };
Programozás módszertan II. p. 1 Az osztály létrehozása Az osztály létrehozásának egyszerűsített vázlata: class név { public: definíció1; definíció2;... private: definíció3; definíció4; };
Programozás módszertan II. p. 1 Az osztály Primitív definíció: Az osztály olyan direktszorzat típuskonstrukció, amelynek komponensei közt alprogramok is lehetnek. A C++ osztályai tehát olyan struktúrák, amelyekben függvények is lehetnek. A C++ fel van készítve a komponensek hatókörének szabályozására is, így az adatrejtés fejlettebb eszközeivel rendelkezik.
Programozás módszertan II. p. 1 Objektumok Az osztály létrehozása mint ahogyan a struktúra létrehozása nem foglal memóriaterületet, nem hoz létre új változót. Az osztály létrehozása csak az új összetett típus felépítését írja le. Az objektumok létrehozásakor használjuk az előzőleg létrehozott osztályt, ahogyan a változó létrehozásakor használjuk az előzőleg létrehozott típust.
Programozás módszertan II. p. 1 Az objektum létrehozása int main(){ stack a; } a.push(10); a.push(20); printf("pop()=%d\n", a.pop()); printf("pop()=%d\n", a.pop());
Programozás módszertan II. p. 1 Az objektum Az objektum létrehozásának és használatának egyszerűsített vázlata: osztálynév objektumnév;...objektumnév.komponensnév...
Programozás módszertan II. p. 1 Az objektum Primitív definíció: Az objektum olyan változó, amely típusa valamely előzőleg létrehozott osztály. A C++ objektumai olyan struktúrák, amelyek komponensei közt függvények és objektumok is lehetnek. A C++ objektumainak létrehozása és használata ugyanúgy történik, ahogyan a C nyelvben a struktúrák létrehozása és használata.
Programozás módszertan II. p. 1 A hatókör szabályozása Az osztályon belül definiált komponensek láthatósága szabályozható a következő kulcsszavak segítségével: public: Az ilyen komponensek mindenütt elérhetők, ahol az osztály felhasználásával létrehozott objektum elérhető. private: Az ilyen komponensek csak az osztály függvényein belül érhetők el. protected: Az ilyen komponensek az osztály és bizonyos más osztályok függvényein belülről érhetők el.
Programozás módszertan II. p. 2 Komponensfüggvények Az osztály komponenseiként létrehozott függvények definíciója az osztály definícióján belül található, törzse pedig az osztály definícióján belül vagy az osztály definícióján kívül. A C++ nyelv esetében az osztálydefiníción belül elhelyezett függvények automatikusan inline típusmódosítót kapnak. A függvény törzsét csak egyszerűbb függvények esetében szokás az osztály definíciójának belsejében elhelyezni.
Programozás módszertan II. p. 2 Komponensfüggvények class stack { public: stack(void); ~stack(void); void push(int value); int pop(void){ return data[--sp]; }; private: int sp; int size; int *data; };
Programozás módszertan II. p. 2 Komponensfüggvények inline int stack::pop(void){ return data[--sp]; }
Programozás módszertan II. p. 2 Komponensfüggvények C++ nyelven írt programok esetében a függvények létrehozásakor a legtöbb esetben megadjuk a függvényt magába foglaló osztály nevét is. Erre a :: operátor használható: típus osztálynév::függvénynév(paraméterlista){... utasítás1; utasítás2;... }
Különleges komponensfüggvények Programozás módszertan II. p. 2
Programozás módszertan II. p. 2 Különleges függvények A C++ nyelv három különleges komponensfüggvényt ismer. Ezeket a függvényeket a lefordított program olyankor is hívja, mikor nem kapott rá kifejezetten utasítást. Ha ezeket a függvényeket nem hozzuk létre, a fordító létrehozza helyettünk! Az automatikusan létrehozott komponensfüggvények az egyszerűbb esetekben megfelelnek az igényeknek.
Programozás módszertan II. p. 2 Konstruktorok A konstruktor komponensfüggvényt a program akkor hívja meg, amikor az objektumot létrehozzuk. A konstruktor az alapbeállítások elvégzésére, az erőforrások lefoglalására használatos. A konstruktor neve megegyezik az osztály nevével. A konstruktornak nincs visszatérési értéke, paraméterlistája tetszőleges. A konstruktor túlterhelhető!
Programozás módszertan II. p. 2 Konstruktor (példa) A konstruktorok visszatérési értékét nem jelöljük! class stack { public: stack(void); ~stack(void); void push(int value); int pop(void); private: int sp; int size; int *data; };
Programozás módszertan II. p. 2 Kontruktor (példa) Ha a konstruktor paramétereket fogad, az objektum létrehozásakor az aktuális paramétereket meg kell adnunk. Ezt mutatja be a következő példa: pont a(3.2, 1.8); valtozo alpha("x", 3); ahol a pont és a valtozo osztályok, amelyek konstruktorai a megfelelő típusú paramétereket fogadják.
Programozás módszertan II. p. 2 Másoló konstruktor A konstruktor, amely csak az osztályhoz tartozó objektumot jelölő mutatót fogadja paraméterként, a másoló konstruktor. A fordító által készített program a másoló konstruktort hívja, amikor az objektumot le kell másolni (pl. paraméterátadáskor). A másoló konstruktornak egy új objektumot kell létrehoznia egy objektum lemásolásával. Ha objektumot adunk át paraméterként, ez létkérdés.
Programozás módszertan II. p. 3 Másoló konstruktor A másoló konstruktort megismerhetjük a nevéről (konstruktor) és a paraméterlistájáról. Figyelem: a C++ szigorúan veszi a const típusmódosítót! stack::stack(const stack &existing) {... }
Programozás módszertan II. p. 3 A destruktor A destruktor komponensfüggvényt a C++ fordító által készített kód meghívja, amikor az osztályhoz tartozó objektumot meg kell semmisíteni. A destruktor neve ~osztálynév formájú. A destruktornak nincsen visszatérési értéke, paraméterlistája pedig üres (void).
Programozás módszertan II. p. 3 A destruktor (példa) A következő példa bemutatja hogyan készíthetünk destruktort: stack::~stack(void){ if (sp!= 0) fprintf(stderr, "...\n"); free(data); }
Feladatok Programozás módszertan II. p. 3