320 likes | 548 Views
Bevezet é s a C++ programozási nyelvbe. Ficsor Lajos Miskolci Egyetem Ãltalános Informatikai Tanszék. Története. A C++ programozási nyelv a C programozási nyelv objektum orientált kiterjesztése. Az ANSI-C nyelvet - néhány megszorÃtással - valódi részhalmazaként tartalmazza.
E N D
Bevezetés a C++ programozási nyelvbe Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék
Története • A C++ programozási nyelv a C programozási nyelv objektum orientált kiterjesztése. • Az ANSI-C nyelvet - néhány megszorítással - valódi részhalmazaként tartalmazza. • Első implementáció: AT&T Bell Labs, Bjarne Stroustrup, a nyolcvanas évek eleje. • Ez egy pre-compiler volt, amely a C++ kódot C kódra fordította, ami aztán a szokásos C fordítóval volt feldolgozható. Bevezetés a C++ programozási nyelvbe
Története(folyt.) • ANSI szabványtervezet: 1996. december 2. • A hivatalos szabvány szám: ISO/EIC 14882. • Általánosan elterjedt programozási nyelv • Gyakorlatilag minden architektúra támogatja • Számos előre definiált osztálykönyvtár • Sok fejlesztőeszköz épül erre a nyelvre Bevezetés a C++ programozási nyelvbe
Használatának módjai • funkcionális szemléletű programok készítésére, kényelmi szolgáltatásokkal ellátott C nyelvként • az osztály és objektum használata nélkül • funkcionális szemléletű programok készítésére, tetszőleges típusokkal bővíthető nyelvként • kihasználva a C++ szinte valamennyi nyelvi konstrukcióját • objektum orientált szemléletű programok implementálására Bevezetés a C++ programozási nyelvbe
Nem objektum orientált kiterjesztések • Nem igénylik az osztály fogalmát. Új vagy módosított szabályok vonatkoznak az alábbiakra • megjegyzés • definíció • hivatkozás típus • felsorolás, struktúra és unió típusú objektumok • típuskonverzió • dinamikus memóriakezelés • új alaptípusok • függvényekre vonatkozó kiterjesztések Bevezetés a C++ programozási nyelvbe
Megjegyzés (comment) • A // (dupla törtvonal) olyan megjegyzés elejét jelzi, amelynek a vége a következő sorváltás karakter. • Bárhol alkalmazható. Bevezetés a C++ programozási nyelvbe
A definíció • A definíció végrehajtható utasításnak számít, így bárhol előfordulhat, ahol utasítás írható. • Alapszabályként a definiált objektum hatásköre a definíciótól az azt magábanfoglaló blokk végéig terjed. • Kivétel • afor utasításban foglalt első két kifejezésben • az if, while és switch utasítások feltételében deklarált azonosítók ezen utasításokra nézve lokálisak Bevezetés a C++ programozási nyelvbe
index betu A definíció (folyt.) • Példa a kivételre: for (int index=1; index<8; index++) { printf ("%d ",index); char betu = index+65; printf ("%c\n",betu); } • betu és indexegyaránt lokális a ciklusmagra nézve Bevezetés a C++ programozási nyelvbe
A definíció (folyt.) • Mivel a betudefiníciója ténylegesen a ciklusmag belsejében van, így a ciklusmag minden végrehajtásakor létrejön, a végén pedig megszűnik • Az index az őt tartalmazó kifejezés kiértékelésekor létrejön, és a ciklusból való kilépéskor megszűnik • Megjegyzések: • A most hatályos szabvány előtt nem létezett ez a kivétel! • A kétféle értelmezés között kapcsolókkal lehet választani. • Nem egységes a fordítók alapértelmezése! Bevezetés a C++ programozási nyelvbe
Hivatkozás típus • C: minden alaptípusból pointer típus származtatható • C++ : minden típusbólhivatkozás típusis származtatható • Formája: típusnév & • A hivatkozás valamely objektum alternatív neveként szerepel, mindig kötelező tehát inicializálni. Bevezetés a C++ programozási nyelvbe
Hivatkozás típus (folyt.) • Egy hivatkozás típusú változó szabályos definíciója például: int valt; int& masik = &valt; • A hivatkozás típust a leggyakrabban a függvény paraméterének és visszatérési értékének típusaként használjuk. • A hivatkozás típuscímet tárol de értékként(indirekció nélkül) hivatkozhatunkrá. Bevezetés a C++ programozási nyelvbe
Felsorolás, struktúra, unió típusú objektumok deklarálása • A C++ a fenti típusú objektumok deklarálása esetén nem követeli meg a deklarációban az enum, struct illetve unionkulcsszavak alkalmazását, az adatszerkezetek deklarációjában szereplő nevek önmagukban típusnévként használhatók Bevezetés a C++ programozási nyelvbe
Felsorolás, struktúra, unió típusú objektumok deklarálása (folyt.) • Példa: struct datum { int ev; char honap[15]; int nap; }; // a "struct" alapszó elmaradhat datum ma,holnap,szulinap; Bevezetés a C++ programozási nyelvbe
Típuskonverzió • A cast stílusú típuskonverzió helyett használható az alábbi forma is: típusnév(kifejezés) • Tehát pl. (char)a helyett char(a) is írható • A két forma keverhető egy programon belül. Bevezetés a C++ programozási nyelvbe
Dinamikus memóriakezelés • A C programokban megszokott memóriakezelő függvények (malloc(), free() és társai) helyett a C++ két új operátort vezet be: new delete Bevezetés a C++ programozási nyelvbe
A new operátor • Formája: new típusnév • vagy new típusnév[elemek száma] • Az operátor a típusnév (és ha adott, az elemek száma) által meghatározott méretű helyet kísérel meg lefoglalni a memóriában • Ha sikeres volta művelet, eredménye egy típusnev*típusú érték, amely a lefoglalt terület kezdőcímét adja, egyébként az eredmény 0. Bevezetés a C++ programozási nyelvbe
A new operátor(folyt.) • Egyszerű példák: // helyfoglalás egy egész értéknek int *p=new int; // helyfoglalás egy 200 elemű egész // tömbnek int *pp; pp = new int[200]; Bevezetés a C++ programozási nyelvbe
A delete operátor • Egy objektum törlése és az általa elfoglalt hely felszabadítása a memóriából: delete pointer; • Egy tömb törlése: delete [] pointer; • Csak a new operátorral értéket kapott pointerrel alkalmazható, egyébként az eredménye definiálatlan. Bevezetés a C++ programozási nyelvbe
A delete operátor (folyt.) • A NULL pointerre alkalmazva hatástalan. • Tömb törlése az egyszerű formájú operátorral, vagy egy objektum törlése a tömbökre vonatkozó formával definiálatlan hatású. Bevezetés a C++ programozási nyelvbe
Az ANSI-C helyfoglaló függvényei • A C++ ismeri az ANSI-C helyfoglaló függvényeit is, tehát (elsősorban kompatibilitási okokból) azok is használhatóak. • Tilos azonban a két allokációs mechanizmus együttes alkalmazása egy programon belül: ennek hatása definiálatlan. Bevezetés a C++ programozási nyelvbe
A bool alaptípus • Az alaptípus logikai értékek tárolására szolgál • Értéke igaz(nem 0) vagy hamis(0) lehet • A C++ nyelvben a logikai kifejezések végeredménye bool típusú. • Integrális típus • Ha szükséges, egy bool típusú érték a C konvenció értelmében a 0 vagy 1 értékre, egy egész érték pedig 0 esetén a hamis, nem 0 esetén az igaz értékre konvertálódik. Bevezetés a C++ programozási nyelvbe
A wchar_t alaptípus • Az egy byte-nál hosszabb kódú karaktereket alkalmazó karakterkészletek egy elemét tárolni képes típus. Szintén integrális típus. Bevezetés a C++ programozási nyelvbe
Hivatkozás (cím) szerinti paraméterátadás • Az adott formális paramétert hivatkozási típusúnak kell deklarálni • Az aktuális paraméter kompatibilis típusú balérték • A hivatkozás szerinti paraméternek a címe adódik át • A függvényben nem kell indirekciót alkalmazni a változó értékének elérésére. • Ha a függvény értékadást tartalmaz a formális paraméterrre, akkor azzal az aktuális paraméterének az értékét is megváltoztatja. Bevezetés a C++ programozási nyelvbe
Hivatkozás szerinti paraméterátadás (példa) void csere (int &a, int &b) { int i; i=a; a=b; b=i; } main() {int a=5, b=10; csere (a,b); printf ("%d %d\n",a,b); } Bevezetés a C++ programozási nyelvbe
Alapértelmezés szerinti paraméter érték 1. • Ha egy formális paraméterhez = jellel egy kifejezést kapcsolunk, az a paraméter híváskor elmaradhat, de a kifejezésnek megfelelő kezdőértéket veszi fel. • Az alapértelmezés szerinti paraméterérték megadása formálisan is egy inicializálásnak felel meg. Bevezetés a C++ programozási nyelvbe
Alapértelmezés szerinti paraméter érték 2. • Szabályok: • Ha egy paraméternek van alapértelmezés szerinti (default) értéke, akkor az utána következő valamennyi paraméternek kell legyen. • A kifejezés értékének típusa a paraméter típusával kompatibilis kell legyen. • Egy adott paraméter default értékét vagy a prototípusban, vagy a definícióban kell megadni, mindkét helyen tilos! Bevezetés a C++ programozási nyelvbe
Alapértelmezés szerinti paraméter érték 3. • Szokásos eljárás, hogy valamennyi default értéket a prototípusban adunk meg, hiszen az mindig publikus, a függvény definíció pedig nem mindig az. • A kifejezés kiértékelése a hívás során futási időben történik. • Default értékkel nem rendelkező formális paraméter helyére kötelező aktuális paramétert írni. Bevezetés a C++ programozási nyelvbe
Alapértelmezés szerinti paraméter érték 4. • Egy példa: int kobtart (int hossz, int szel=3, int mag=5); main () {int x=10, y=12, z=2, k; k = kobtart (x,y,z); k = kobtart (x,y); //k=kobtart(x,y,5) k = kobtart (x); //kobtart(x,3,5) k = kobtart (); // Ez hibás! } Bevezetés a C++ programozási nyelvbe
Az inline függvény • Egy függvényt a deklarációjában az inline minősítővel láthatunk el • Ezzel feljogosítjuk a fordítóprogramot arra, hogy a függvény hivását a definícióból és az aktuális paraméterekből készített kódsorozattal helyettesítse. • Az inline függvény függvény törzse annyiszor kerülhet bemásolásra a kódba, ahányszor a hívása szerepel. Bevezetés a C++ programozási nyelvbe
Az inline függvény(folyt.) • Mire lehet jó? • A C++-ban gyakori anagyon rövidfüggvénytörzs. Ilyenkor a hívás helyén történő kódgenerálás rövidebb kódot eredményezhet, mint a paraméterátadás adminisztrálása és az ugrás majd visszatérés. • Jól használható a makrók kiváltására. Az inline függvényt nem az előfeldolgozó, hanem a fordítóprogram dolgozza fel, amely képes a típusellenzőrzésre. • Az inline minősítő nem kötelezi a fordítót az inline módú hivás-feldolgozásra Bevezetés a C++ programozási nyelvbe
Függvény overloading1. Azonos hatáskörben • azonos névvel • különböző paraméterszignatúrával • különböző függvényeket definiálhatunk. • Paraméterszignatúra: a formális paraméterek száma és típus-sorrendje. • A polimorfizmus egyik implementációs formája • "környezet": paraméter szignatúra Bevezetés a C++ programozási nyelvbe
Függvény overloading2. • A függvény hívásakor a fordítóprogram az aktuális paraméterek szignatúráját sorban egyezteti az összes azonos nevű definíció formális paramétereinek szignatúráival. Ennek az egyeztetésnek az alábbi eredményei lehetnek: • Pontosan egy illeszkedőt talál: ilyenkor az ennek megfelelő függvény hívását fordítja be. • Egyetlen illeszkedőt sem talál: hibajelzést ad • Több egyformán illeszkedőt talál: hibajelzést ad • Korai kötés (early binding) Bevezetés a C++ programozási nyelvbe