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

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

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 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 II. (1. ea) C++

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

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

1. Alapok. Programozás II

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

Bevezetés a C++ programozási nyelvbe

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

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

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

- 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]++;

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

Pénzügyi algoritmusok

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

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

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

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

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

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

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

Bevezetés a C++ programozási nyelvbe

Pénzügyi algoritmusok

Programozás C és C++ -ban

Informatika terméktervezőknek

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

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

C++ programozási nyelv Konstruktorok-destruktorok

Programozás II gyakorlat. 6. Polimorfizmus

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

3. Osztályok II. Programozás II

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

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

Programozás C++ -ban

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

Programozás C++ -ban

Programozás C++ -ban

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

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

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

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

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

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

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

Globális operátor overloading

5. Gyakorlat. struct diak {

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

Java II. I A Java programozási nyelv alapelemei

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

Maximum kiválasztás tömbben

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

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

117. AA Megoldó Alfréd AA 117.

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

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

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

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

A C programozási nyelv I. Bevezetés

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

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

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

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

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

Osztály és objektum fogalma

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

Szoftvertechnológia alapjai Java előadások

A C programozási nyelv I. Bevezetés

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

Bevezetés a programozásba I.

8. gyakorlat Pointerek, dinamikus memóriakezelés

C++ programok fordítása

Programozás C++ -ban 2007/4

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

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

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) {} };

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

Programozási Nyelvek: C++

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

Java II. I A Java programozási nyelv alapelemei

Programozas 1. Strukturak, mutatok

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 I.

Szövegek C++ -ban, a string osztály

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

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

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 1

Mit ír ki? feladatok megoldásokkal

Bevezetés, a C++ osztályok. Pere László

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Mutatók. Dr. Bécsi Tamás 7. Előadás

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

Á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> M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 1 -

C++ kialakulása Veszélyforrások csökkentése C + javítások Objektum orientált szemlélet OOP elemek C++ 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. 2016.02.15. - 2 -

C és C++ viszonya preprocesszor preprocesszor buta C okos C C könyvtár C könyvtár C++ könyvtár C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 3 -

C és C++változatai C w. classes C++ 1979 C++03 C++98 1985 1990 1998 C++11 C++0x C++14 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. 2016.02.15. - 4 -

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. 2016.02.15. - 5 -

C99 támogatottság http://en.wikipedia.org/wiki/c99 C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 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-re! Ó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). C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 7 -

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. 2016.02.15. - 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 C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 9 -

Á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. 2016.02.15. - 10 -

C++ újdonságok, bővítések 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 C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 11 -

Típusok 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. 2016.02.15. - 12 -

bool false true Logikai típus (új típus) aritmetikai bool automatikus típuskonverzió, ahogyan a C-ben megszoktuk. C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 13 -

Aritmetikai és logikai konverzió Aritmetikai típus értékkészlete bool 0 = hamis, a többi = igaz 0 vagy 1 bool b1, b2, b3; int i; b1 = true; b2 = 3; i = b2; b3 = false; (b2 == true, i == 1) C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 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. 2016.02.15. - 15 -

#define PI 3.14 helyett const float PI = 3.14; Konstans (ism) const: 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. 2016.02.15. - 16 -

Két trükkös próbálkozás const int x = 3; int *px = &x; *px = 4; void f(int *i) { *i = 4; const int x = 3; f(&x); C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 17 -

Felsorolás típus (szigorúbb lett) enum Szinek { ; 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 típus nincs hiba, de meghatározatlan érték létrehozása C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 18 -

Prototípus kötelező Előrehivatkozáskor kötelező Tipikus C hiba: double z = sqrt(2); C feltételezi, hogy int (double) kellene C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 19 -

Miért baj ha elmarad? 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. 2016.02.15. - 20 -

Mutatók és címek (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, *ip; float f, *fp; int-re mutató pointer float-ra mutató pointer ip = &i; fp = &f; C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 21 -

Indirekció (ism.) int i; 13 *ip = 13; float f; int *ip; ip = &i i cime Memória float *fp; C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 22 -

Értékparamé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.) C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 23 -

Változóparaméter (ism.) 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. 2016.02.15. - 24 -

Referencia (új típus) 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++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 25 -

Változó paraméter referenciával 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. 2016.02.15. - 26 -

1. gyak. példája referenciával: // 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); C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 27 -

é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. 2016.02.15. - 28 -

Paraméterátadás /2 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 C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 29 -

Függvényhívás mint balérték 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. 2016.02.15. - 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). C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 31 -

Függvény overload int max(int a, int b) { return(a > b? a: b); double max(double a, double b) { return(a > b? a: b); 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. 2016.02.15. - 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) f(...) f(int a, int) - nincs paraméter - nem kell ellenőrizni - nem fogjuk használni C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 33 -

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. 2016.02.15. - 34 -

Ott deklaráljunk, ahol használjuk 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 C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 35 -

Deklarációk feltételben és ciklusban 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. 2016.02.15. - 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); C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 37 -

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 nevterem::alma; using nevterem::fv; alma = 8; float f = fv(3); nevterem::nev = "Dr. Bubo"; using namespace nevterem; alma = 8; float f = fv(3); C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 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. 2016.02.15. - 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 bnt = ::kis_nevterem::belso_terem; bnt::fontos = 8; C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 40 -

Az std névtér 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! C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 41 -

standard I/O, iostream 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. 2016.02.15. - 42 -

C-ben ezt írtuk: Miért iostream? 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()) C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 43 -

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. 2016.02.15. - 44 -

Dinamikus memória #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++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 45 -

Dinamikus memória /2 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. 2016.02.15. - 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;... C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 47 -

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. 2016.02.15. - 48 -

Kivételkezelés = globális goto Kivétel2 Kritikus műveletek Kivétel1 C: setjmp( ) longjmp( ) További műv. C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 49 -

try { Kivételkezelés/2... 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. 2016.02.15. - 50 -

Kivételkezelés példa Hiba észlelése double osztas(int y) { if (y == 0) throw "Osztas nullaval"; return((5.0/y); A típus azonosít Kritikus szakasz 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. 2016.02.15. - 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. 2016.02.15. - 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. 2016.02.15. - 53 -

1. gyak. példája az új elemekkel // createfromcharstr, createfromchar... Polimorfizmus Referencia void create(string& s, const char *p) { s.len = strlen(p); //s->p = malloc((s->len+1)*sizeof(char)); //assert(s->p); s.p = new char[s-len+1]; strcpy(s->p, p); Nyelvi elem C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 54 -

1. gyak. példája az új elemekkel/3 void print(const String& s) { //printf("%s", s->p); std::cout << s.p; Referencia void dispose(string& s) { //free(s->p) delete[] s.p; Memória kezelés char charat(string& s, unsigned idx) { if (idx >= s.len) throw "Indexelési hiba"; return s.p[idx]; Kivétel dobása C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 55 -

1. gyak. példája az új elemekkel/3 #include <iostream> #include string0.h Főprogram kivételkezeléssel int main() { String a, b; try { create(a, x ); create(b, "alma"); std::cout << charat(b, 3) << std::endl; catch (std::bad_alloc) { std::cerr << "elfogyott a mem." << std::endl; catch (const char *p) { std::cerr << "Baj van:" << p << std::endl; dispose(&a); dispose(&b); return 0; C++ programozási nyelv BME-IIT Sz.I. 2016.02.15. - 56 -