Programozás alapjai II. (1. ea) C++

Hasonló dokumentumok
Programozás alapjai II. (2. ea) C++

Programozás alapjai II. (2. ea) C++

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

Programozás alapjai 2. (2. ea) C++

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

1. Alapok. Programozás II

Programozás II. 4. Dr. Iványi Péter

Bevezetés a C++ programozási nyelvbe

Alprogramok, paraméterátadás

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Programozás II. 2. Dr. Iványi Péter

Programozás alapjai II. (1. ea) C++

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Bevezetés a C++ programozási nyelvbe

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Pénzügyi algoritmusok

Programozás alapjai II. (4. ea) C++

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

C vagy C++? Programozási Nyelvek és Fordítóprogramok Tanszék. Pataki Norbert. Programozási Nyelvek I.

C++ programozási nyelv Konstruktorok-destruktorok

Kivételek, kivételkezelés a C++ nyelvben

Pénzügyi algoritmusok

Informatika terméktervezőknek

Algoritmizálás + kódolás C++ nyelven és Pascalban

Programozás C és C++ -ban

3. Osztályok II. Programozás II

Programozás C++ -ban

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Globális operátor overloading

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Programozás C++ -ban

Programozás C++ -ban

Programozás II gyakorlat. 6. Polimorfizmus

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

A C programozási nyelv II. Utasítások. A függvény.

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Bevezetés a programozásba. 9. Előadás: Rekordok

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

5. Gyakorlat. struct diak {

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

Programozás 1. Dr. Iványi Péter

Felhasználó által definiált adattípus

1. Bevezetés A C++ nem objektumorientált újdonságai 3

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Programozás 5. Dr. Iványi Péter

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Programozás. C++ típusok, operátorok. Fodor Attila

Programozás C++ -ban 2007/4

Programozási Nyelvek: C++

Memóriakezelés, dinamikus memóriakezelés

Programozas 1. Strukturak, mutatok

8. gyakorlat Pointerek, dinamikus memóriakezelés

Gregorics Tibor Modularizált programok C++ nyelvi elemei 1

Java II. I A Java programozási nyelv alapelemei

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

A C programozási nyelv III. Pointerek és tömbök.

Bevezetés a programozásba I.

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

A C programozási nyelv I. Bevezetés

Programozás 6. Dr. Iványi Péter

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Imperatív programozás

Szoftvertechnológia alapjai Java előadások

Programozás alapjai II. (4. ea) C++

A C programozási nyelv III. Pointerek és tömbök.

Programozás alapjai II. (4. ea) C++

117. AA Megoldó Alfréd AA 117.

Maximum kiválasztás tömbben

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

C++ programok fordítása

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

1. Gyakorlat. Rövid elméleti összefoglaló. <tárolási osztály>típus <típus > változónév <= kezdőérték><, >;

Osztály és objektum fogalma

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

PROGRAMOZÁSI NYELVEK - CPP. ELŐADÁS JEGYZET

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Mutatók és mutató-aritmetika C-ben március 19.

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

A C programozási nyelv I. Bevezetés

Bevezetés a programozásba I.

Java és web programozás

1) Hány byte-on tárol a C++ egy karaktert (char)? implementáció-függő ( viszont lásd 79. megjegyzés ) 1 8 4

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Átírás:

Programozás alapjai II. (1. ea) C++ C++ kialakulása, nem OO újdonságok: Szeberényi Imre BME IIT <szebi@iit.bme.hu> Veszélyforrások csökkentése C + javítások C++ kialakulása C++ Objektum orientált szemlélet OOP elemek M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 1 - A fejlődés során jelentős kölcsönhatások voltak a C és a C++ között C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 2 - C és C++ viszonya C és C++változatai preprocesszor buta C C könyvtár preprocesszor C könyvtár okos C C++ könyvtár C++03 C++11 C++ C++98 C++0x C++14 C w. classes 1979 1985 1990 1998 2003 2010 2011 C 1972 1978 198 1989 1999 2007 3 K&R C ANSI C C90 C99 C1X C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 3 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 4 - C++11, C++14, C++17? A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként. Ezt tanítja és ezt kéri számon, de lehet az újabb változatok elemeit használni háziban, zh-ban. A teljes C++11 azonban lényegesen bonyolultabb, amit másik tárgy keretében lehet megismerni. Bjarne Stroustrup: C++11 feels like a new language http://www.stroustrup.com/c++11faq.html C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 5 - C99 változók és a kód keverése (for fejében is) for (int i = 1; i < 12; i++). // comment, const, enum, inline változó hosszúságú tömb (függvényben) void f(int b) int c[b]; // változó méretű tömb új típusok (pl. long long, double _Complex) Pontosabb specifikáció pl: -3/5 = 0-3%5= -3 // C89-ben lehetne -1 és +2 C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 6 -

Általános kódolási tanácsok (ism) Olvasható legyen a kód, ne trükkös! Mellékhatásoktól tartózkodni! Nem triviális szintaxist kerülni, akkor is, ha a C nyelv szerint az egyértelmű (a+++b) Nem feltétlenül kell haragudni a break-re és a continue-ra! Óra végén látni fogjuk, hogy C++-ban még a goto -t is gyakran használjuk (bár nem így hívjuk). Mi történik, ha x > 2.3? while (i < 12 && q!= 0 && k > 87 && u < 3)... if (x > 2.3) q = 0;... while (i < 12 && k > 87 && u < 3)... if (x > 2.3) break;... C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 7 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 8 - Általános kódolási tanácsok/2 Makrókat kerüljük, ha lehet #define MAX(a,b) a > b? a : b int a1 = 1; int x = MAX(a1&7, 3); // x =??? #define MAX(a,b) (a) > (b)? a : b Általános kódolási tanácsok/2 Memória foglalás: ki foglal és ki szabadít? char *valami(char *); // lefoglal? Mit csinál? Ha foglal, kinek kell felszabadítani? Oda kell írni kommentbe! Összetartozó adatok struktúrába Konstansok, enum Style guide betartása (pl. google-styleguide) http://google-styleguide.googlecode.com/svn/trunk/cppguide.html A lényeg a következetességen van! C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 9 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 10 - C++ újdonságok, bővítések Típusok Struktúranév típussá válik Csak preprocesszorral megoldható dolgok nyelvi szintre emelése (const, enum, inline) Kötelező prototípus, névterek Referencia, cím szerinti paraméterátadás Többarcú függvények (overload) Alapértelmezésű (default) argumentumok Dinamikus memória nyelvi szint. (new, delete) Változó definíció bárhol logikai char egész felsorolás valós mutató referencia void integrális aritmetikai skalár összetett adatszerkezetek (tömb struktúra) és osztályok C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 11 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 12 -

Logikai típus (új típus) bool false true aritmetikai bool automatikus típuskonverzió, ahogyan a C-ben megszoktuk. Aritmetikai és logikai konverzió Aritmetikai típus értékkészlete 0 vagy 1 bool bool b1, b2, b3; int i; b1 = true; b2 = 3; i = b2; b3 = false; (b2 == true, i == 1) 0 = hamis, a többi = igaz C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 13 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 14 - Struktúra név típussá válik struct Komplex float re; float im; ; srtruct Lista_elem int i; Lista_elem *kov; ; C++-ban a név típus értékű önhivatkozó struktúránál kényelmes C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 15 - #define PI 3.14 helyett const float PI = 3.14; const: Konstans (ism) Típusmódosító amely megtiltja az objektum átírását (fordító nem engedi, hogy balértékként szerepeljen) Mutatók esetén: const char * p; //p által címzett terület nem módosítható char const * p; // ua. char * const q; //q-t nem lehet megváltoztatni C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 16 - Két trükkös próbálkozás Felsorolás típus (szigorúbb lett) const int x = 3; int *px = &x; *px = 4; void f(int *i) *i = 4; const int x = 3; f(&x); enum Szinek típus piros, sarga, zold = 4 ; Szigorúbb ellenőrzés, mint az ANSI C-ben. Pl: Szinek jelzo; jelzo = 4; jelzo = Szinek(8); fordítási hiba nincs hiba, de meghatározatlan érték létrehozása C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 17 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 18 -

Prototípus kötelező Miért baj ha elmarad? Előrehivatkozáskor kötelező Tipikus C hiba: double z = sqrt(2); C feltételezi, hogy int (double) kellene a függvényt hívó rész a hívott függvény double z=sqrt(2); double sqrt(double x) int int verem regiszter double double... x.. return res; C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 19 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 20 - Mutatók és címek (ism.) Indirekció (ism.) Minden változó és függvény memóriában levő helye (címe) képezhető. (pl: &valtozo) Ez a cím ún. pointerben vagy mutatóban tárolható. A pointer egy olyan típus, amelynek az értékkészlete cím, és mindig egy meghatározott típusú objektumra mutat. int i; int *ip; 13 i cime *ip = 13; float f; float *fp; int i, *ip; float f, *fp; int-re mutató pointer float-ra mutató pointer ip = &i; fp = &f; ip = &i Memória C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 21 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 22 - Értékparaméter (ism.) Változó paraméter (ism.) változó v. konstans érték függvény fv.érték A paraméterek nem változhatnak meg, mivel azok értéke adódik át. Azok eredeti tartalma az eredeti helyen megmarad. A függvény csak a függvényértéken keresztül tud a külvilágnak eredményt szolgáltatni. (Ez sokszor kevés.) változó fv.érték cím függvény A paraméter címe adódik át, így annak tartalma felhasználható, de meg is változtatható. A magas szintű nyelvek elfedik ezt a trükköt. Sem az aktuális paraméterek átadásakor, sem a formális paraméterekre való hivatkozáskor nem kell jelölni. Csupán a paraméter jellegét (változó) kell megadni. C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 23 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 24 -

Referencia (új típus) Változó paraméter referenciával Referencia: alternatív név tipus& int i = 1; int& r = i; // kötelező inicializálni, mert // valójában egy cím int x = r; // x = 1; r = 2; // i = 2; C: void inc(int *a) (*a)++; int x = 2; inc(&x); könnyen lemarad C++: void inc(int &a) a++; int x = 2; inc(x); nem kell jelölni a címképzést híváskor C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 25 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 26 - Példa: összeg és négyzetösszeg // int ad(int a, int b, int *no) int ad(int a, int b, int& no) no = a*a + b*b; return a+b; int main() int x, y, z; y = 5; x = ad(4, y, z); érték szerint skalár struct Paraméterátadás cím szerint (tömb, változtatni kell, hatékonyság) típus& típus* Pointer paraméter és a változtatandó paraméter szétválik. C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 27 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 28 - Paraméterátadás /2 Függvényhívás mint balérték Pointer, referencia + const használatával a hozzáférés jól szabályozható: struct Data double dx[1000]; int px[2000]; d; void f1(data); void f2(const Data* ); void f3(const Data&); void f4(data*); void f5(data&); // f1(d); értékparaméter // f2(&d); nem változhat // f3(d); nem változhat // f4(&d); változhat // f2(d); változhat int x; int& f( ) return x; main( ) f( ) = 5; f( )++; f( ) = f( ) + 2; f() egy alternatív nevet szolgáltat! C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 29 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 30 -

Inline #define max(a,b) (a) > (b)? a : b x = 8, y = 1; x = max(x++, y++); x,y =? inline int max(int a, int b) return(a > b? a: b); Nincs trükk. Pontosan úgy viselkedik, mint a függvény, de a hívás helyére kell beilleszteni a kódot (lehetőleg). int max(int a, int b) return(a > b? a: b); double max(double a, double b) return(a > b? a: b); Függvény overload int x = max(1, 2); double f = max(1.2, 0.2); Többarcú függvények C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 31 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 32 - Függvény argumentumok Konvertert írunk, ami tetszőleges számrendszerbe tud konvertálni. A fv. a számrendszer alapját paraméterként kapja. char *int2ascii(int i, int base = 10); Csak az argumentumlista végén lehetnek default argumentumok, akár több is. f(), f(void) - nincs paraméter f(...) - nem kell ellenőrizni f(int a, int) - nem fogjuk használni Deklaráció és definíció A deklarációs pont továbbra is legtöbbször definició is: int a; float alma; de: int fv(int x); - nem definició A típus nem hagyható el! Több deklaráció is lehet, extern int error; extern int error; Definició csak egy! C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 33 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 34 - Ott deklaráljunk, ahol használjuk Deklarációk feltételben és ciklusban y = 12; int z = 3; // és egyből inicializáljuk for (int i = 0; i < 10; i++) z += i; int k = i 1; y *= k; i, és k itt már nem létezik! élettartam, hatókör u.a, mint a C-ben if (double d = fx(y)) cout << d; else d = 21.2; cout << d; for (int i = 10; i--;) cout << i; while (cin >> ch) cout << ch; C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 35 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 36 -

Névterek, scope operátor A moduláris programozás támogatására külön névterületeket definiálhatunk. Ez ebben levő nevekre (azonosítókra) a hatókör (scope) operátorral (::), vagy a using namespace direktívával hivatkozhatunk. namespace nevterem int alma; float fv(int i); char *nev; nevterem::alma = 12; float f = nevterem::fv(5); using namespace nevterem; alma = 8; float f = fv(3); using direktíva A using namespace direktívával a teljes névteret, vagy annak egy részét láthatóvá tehetjük: using namespace nevterem; alma = 8; float f = fv(3); using nevterem::alma; using nevterem::fv; alma = 8; float f = fv(3); nevterem::nev = "Dr. Bubo"; C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 37 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 38 - Név nélküli névtér Biztosítani akarjuk, hogy egy kódrészlet csak az adott fájlból legyen elérhető. Névütközés biztosan nem lesz. namespace // nincs neve void solvetheproblem(). // névtér vége int main() solvetheproblem(); C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 39 - Névterek egymásba ágyazása, alias A névterek egymásba ágyazhatók. Egy létező névterhez egy újabb nevet rendelhetünk (rövidítés). namespace kis_nevterem namespace belso_terem int fontos; namespace bent = ::kis_nevterem::belso_terem; bent::fontos = 8; C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 40 - Az std névtér standard I/O, iostream Standard függvények konstansok és objektumok névtere. Ebben van standard az I/O is. Az egyszerű példákban kinyitjuk az egész névteret az egyszerűbb írásmód miatt: using namespace std; Komoly programokban ez nem célszerű. Header-ben pedig soha ne tegyük! cin cout cerr iostream, iostream.h Az "új" változatot illik használni! (névtér, wchar_t,...) #include <iostream> int main() int a, b; std::cin >> a >> b; std::cout << "a+b=" << a + b << std::endl; return 0; C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 41 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 42 -

Miért iostream? C-ben ezt írtuk: printf("i=%d j=%d\n", i, j); C++-ban ezt kell: cout << "i = " << i << " j=" << j << endl; Kinek jó ez? A printf, scanf nem biztonságos! Nem lehet ellenőrizni a paraméterek típusát. A printf, scanf nem bővíthető új típussal. Lehet vegyesen? (sync_with_stdio()) Ezek új operátorok? Nem új operatorok! A már ismert << és >> operatorok felüldefiniálása. Az operatorok a C++ -ban függvények a függvények pedig többarcúak. ostream& operator<<(ostream& os, int i); ostream& operator<<(ostream& os, double d); istream& operator>>(istream& is, int& i); Részletek később! C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 43 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 44 - Dinamikus memória Dinamikus memória /2 #include <malloc.h>... struct Lanc *p; p = malloc(sizeof(lanc)); if (p == NULL)... free( p ); Lanc *p; p = new Lanc;... delete p; Tömb: int *p; p = new int[10]; delete[] p; C: malloc(), free(), realloc() C++-ban is használható de csak nagyon körültekintően, ugyanis nem hívódik meg a megfelelő konstruktor ill. destruktor. Ezért inkább ne is használjuk. C++ (operátor): new, delete, new[], delete[] Figyeljünk oda, hogy a tömböket mindig a delete[] operátorral szabadítsuk fel. C++: nincs realloc()-nak megfelelő. C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 45 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 46 - Mi van, ha elfogy a memória? void OutOfMem() cerr << "Gáz van\n"; exit(1); int main() set_new_handler(outofmem); double p* = new double;... Kivételkezelés Hibák kezelése gyakran nem a hiba keletkezésének helyén történik. (Legtöbbször nem tudjuk, hogy mit kell tenni. megállni, kiírni valami csúnyát, stb.) C++ típusorientát kivételkezelése: figyelendő kódrészlet kijelölése (try) kivétel továbbítása (throw) esemény lekezelése (catch) C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 47 - C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 48 -

Kivételkezelés = globális goto Kivétel2 C: setjmp( ) longjmp( ) Kritikus műveletek További műv. Kivétel1 C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 49 - Kivételkezelés/2 try... Kritikus művelet1 if (hiba) throw kifejezés_tip1;... Kritikus művelet2 if (hiba) throw kifejezés_tip2; catch (típus1 param)... Kivételkezelés1 catch (típus2 param)... Kivételkezelés2... további utasítások A hiba tetszőleges mélységben (a try blokkból hívott függvények belsejében) is keletkezhet. C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 50 - Hiba észlelése Kritikus szakasz Kivételkezelés példa double osztas(int y) if (y == 0) throw "Osztas nullaval"; return((5.0/y); A típus azonosít int main() try cout << "5/2 =" << osztas(2) << endl; cout << "5/0 =" << osztas(0) << endl; catch (const char *p) cout << p << endl; Kivétel kez. C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 51 - Kivételkezelés a memóriára #include <iostream> using namespace std; // csak az egyszerűbb írás miatt int main() long db = 0; try while(true) double *p = new double[1022]; db++; catch (bad_alloc) cerr << "Gaz van" << endl; cerr << "Ennyi new sikerult:" << db << endl; return(0); C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 52 - Futási példa az ural2-n ural2:~$ cp ~szebi/proga2/mem_alloc.cpp. ural2:~$ g++ -static mem_alloc.cpp -o mem_alloc ural2:~$ ( ulimit -d 24;./mem_alloc ) # A static azért kell, hogy a betöltésnél ne legyen szükség # extra loader-re, ami extra memóriát használ. # A zárójel azért kell, hogy új shell induljon. C++ programozási nyelv BME-IIT Sz.I. 2017.02.07. - 53 -