Programozás módszertan II. Bevezetés, a C++ osztályok Pere László (
[email protected]) P ÉCSI T UDOMÁNYEGYETEM T ERMÉSZETTUDOMÁNYI K AR I NFORMATIKA ÉS Á LTALÁNOS T ECHNIKA TANSZÉK
Programozás módszertan II. – p.
A munkamenet
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˝un˝oen 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˝o.
Programozás módszertan II. – p.
A fordítás
UNIX rendszereken a C++ programokat tartalmazó állomány nevének végz˝odé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˝u programok fordítását. A GNU C fordító indítható g++ névvel is.
Programozás módszertan II. – p.
Összetett adatszerkezetek
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˝o (bit field) és pakolt struktúra adatszerkezet.
Programozás módszertan II. – p.
Bitmez˝o
Bitmez˝oket é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˝ok használata a programot lassítja!
Programozás módszertan II. – p.
Bitmez˝o
Bitmez˝oket 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˝ové 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;
Programozás módszertan II. – p.
Egyszer˝u osztályok
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˝usí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˝oz˝oleg létrehozott osztályt, ahogyan a változó létrehozásakor használjuk az el˝oz˝oleg 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˝usí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˝oz˝oleg 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˝o kulcsszavak segítségével: public: Az ilyen komponensek mindenütt elérhet˝ok, ahol az osztály felhasználásával létrehozott objektum elérhet˝o. private: Az ilyen komponensek csak az osztály függvényein belül érhet˝ok el. protected: Az ilyen komponensek az osztály és bizonyos más osztályok függvényein belülr˝ol érhet˝ok el.
Programozás módszertan II. – p. 1
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˝ubb 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; ... }
Programozás módszertan II. – p. 2
Különleges komponensfüggvények
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˝ubb 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˝oforrá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˝oleges. A konstruktor túlterhelhet˝o!
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˝o példa: pont a(3.2, 1.8); valtozo alpha("x", 3); ahol a pont és a valtozo osztályok, amelyek konstruktorai a megfelel˝o 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˝o 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. 2
Másoló konstruktor
A másoló konstruktort megismerhetjük a nevér˝ol (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˝o példa bemutatja hogyan készíthetünk destruktort: stack::~stack(void){ if (sp != 0) fprintf(stderr, "...\n"); free(data); }
Programozás módszertan II. – p. 3
Feladatok
Programozás módszertan II. – p. 3