Programozás C++ -ban

Hasonló dokumentumok
Programozás C++ -ban

Programozás C++ -ban 2007/7

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

C++ programozási nyelv Konstruktorok-destruktorok

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

Programozás II gyakorlat. 8. Operátor túlterhelés

Smart Pointer koncepciója

Programozás C++ -ban 2007/4

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

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

5. Gyakorlat. struct diak {

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

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

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

Java és web programozás

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

Objektumok inicializálása

Programozás C++ -ban 2007/1

Pénzügyi algoritmusok

C++ programozási nyelv

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

Programozás II gyakorlat. 6. Polimorfizmus

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Programozás II. 6.Öröklés Dr. Iványi Péter

Programozás C++ -ban

A C++ szigorúbban kezeli a típuseltéréseket, mint a C nyelv Lehetséges típuskonverziók:

Java és web programozás

C++ Gyakorlat jegyzet 5. óra. A C++ szabvány több memóriatípust különít el. Ezek közül elsősorban a stack-et használtuk eddig.

C++ programozási nyelv Struktúrák a C++ nyelvben

8. gyakorlat Pointerek, dinamikus memóriakezelés

1. Alapok. Programozás II

3. Osztályok II. Programozás II

Programozás. Osztályok, Származtatott osztályok. Fodor Attila

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

117. AA Megoldó Alfréd AA 117.

Java és web programozás

Globális operátor overloading

Pénzügyi algoritmusok

Programozás C és C++ -ban

7. fejezet: Mutatók és tömbök

Programozás C és C++ -ban

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

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

500. AA Megoldó Alfréd AA 500.

Bevezetés a C++ programozási nyelvbe

4. Öröklődés. Programozás II

C++ programozási nyelv Konstruktorok Gyakorlat

Programozás C és C++ -ban

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

OOP #14 (referencia-elv)

Programozás II gyakorlat. 4. Öröklődés

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

#include <iostream> using namespace std; // struct macska is lehetne class macska { public: int kor; int suly; }; void main() { macska cirmi;

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

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Alkalmazott modul: Programozás 9. előadás. Strukturált programozás: dinamikus adatszerkezetek

Osztályok. 4. gyakorlat

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

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

Osztály és objektum fogalma

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

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

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

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

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

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

Elemi alkalmazások fejlesztése I. Olvassunk be egy fájlból egész számokat egy tömbbe. Keressük meg a tömb valamely

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

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

ISA szimulátor objektum-orientált modell (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.

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Java programozási nyelv 4. rész Osztályok II.

Kivételkezelés a C++ nyelvben Bevezetés

500. CC Megoldó Alfréd CC 500.

INFORMATIKA tétel 2018

0.2.1 Operátorok túlterhelése (műveletek definiálhatók felhaszn. típusokra) Kutya. Eb1. Eb2. Név (txt): Rex. Blöki. Német juhász 3

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

Bevezetés a C++ programozási nyelvbe

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

Szoftvergyártás: gyártásvezérlés kód-figyeléssel

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

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

A C++ öröklés. (Előfeltétel: 12. tétel ismerete)

Bevezetés a programozásba 2

Programozás módszertan

Maximum kiválasztás tömbben

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

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

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

Programozás II. ATM példa Dr. Iványi Péter

Programozás II gyakorlat. 7. Példák a polimorfizmus alkalmazásaira

Elemi Alkalmazások Fejlesztése II.

Származtatási mechanizmus a C++ nyelvben

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

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

Átírás:

8. Dinamikus objektumok Programozás C++ -ban Ahhoz hogy általános prolémákat is meg tudjunk oldani, szükség van arra, hogy dinamikusan hozhassunk létre vagy szüntethessünk meg objektumokat. A C programozási nyelvben a malloc() és a free() függvényeket használtuk erre. A C++ programozási nyelvben ez nem működik. Egy objektum konstruktora nem engedi meg, hogy mi adjuk át neki az objektumnak lefoglalt memória helyet. Ha ezt megtehetnénk akkor a következőket is: Például elfelejtjük mi meghívni a konstruktort a memóriával és így a C++ nem tudja garantálni az objektumok inicializálását. Véletlenül valamilyen műveletet végzünk az objektummal mielőtt inicializálnánk. Rossz méretű memóriát adunk át a konstruktornak. Még ha mi mindent jól is csinálunk, valaki más, aki módosítani akarja a programot elkövetheti a fenti hibák valamelyikét. Tahát hogyan lehet ezeket a problémákat elkerülni? Úgy, hogy a dinamikus objektum kezelést a nyelv részévé tesszük. A malloc() és free() külső függvények, helyettük a new és a delete operátort kell használni. Amikor egy C++ objektumot létrehozunk, két dolog történik: A program memóriát foglal az objektumnak. A konstruktor inicializálja az objektumot. Először nézzük meg, hogy hogyan lehetne C nyelvben objektumot dinamikusan létrehozni: #include <cstdlib> // malloc() es free() #include <cstring> // memset() #include <iostream> class Obj int i, j, k; enum sz = 100 ; char buf[sz]; void initialize() // Nem hasznalhatunk konstruktort cout << "initializing Obj" << endl; i = j = k = 0; memset(buf, 0, sz); void destroy() const

; cout << "destroying Obj" << endl; Obj* obj = (Obj*)malloc(sizeof(Obj)); obj->initialize(); //... valamit csinalunk... obj->destroy(); free(obj); A fő problémát az sor obj->initialize(); jelenti, mivel nem automatikus, és könnyen elfelejthetjük. Azt is ellenőrizni, kell hogy a malloc() függvény tényleg tudott memóriát foglalni. Ha nem tud memóriát foglalni akkkor NULL-t ad vissza. Végül a legtöbb programozó nehezen birkízik meg a C nyelv dinamikus memória kezelésével. 8.1 Operátorok A C++ -os megoldás, hogy minden objektum foglalást és inicializálást egyben intezünk el a new operátorral. Például: MyType *fp = new MyType(1, 2); A fenti kód lefoglal egy megfelelő memória területet, melynek méretét a MyType típus mérete határozza meg. Ezután az objektum konstruktora is meghívódik az (1, 2) argumentumokkal. A lefoglalt objektumhoz nem férünk hozzá egészen addig amíg ez mind meg nem történik. Ha a konstruktornak nincs argumentuma akkor a következő módon kell meghívni az operátort: MyType *fp = new MyType; Az objektum megszüntetéséhez, a desktruktor meghívásához a delete operátort kell meghívni. Például delete fp; A delete operátort csak olyan objektumra lehet meghívni, melyet a new operátorral foglaltunk le.

8.2. new és delete használata objektum vektorokra A C++ -ban objektumokból álló vektorokat is létre lehet hozni. Egyetlen feltétele van az objektum vektornak, hogy az objektumnak legyen alap konstruktora, vagyis argumentum nélkül meghívható konstruktor. Például 100 darab MyType típusú objektum létrehozása: MyType *fp = new MyType[100]; Egy fontos dologra figyelni kell, hogy az így foglalt vektort másképpen kell felszabadítani: delete []fp; Ez nagyon fontos! Ha a delete fp; utasítást használnánk, akkor csak az első objektum destruktora hívodna meg a többi 99 objektumé nem. Azért annyi előnye van a delete operátornak hogy mindkét esetben mind a 100 objektum memóriáját felszabadítja. 8.3. new és delete operátorok újradefiniálása Lehetőség van arra is hogy a new és delete operátorokat újradefiniáljuk. Erre több okból is szükség lehet, például egy kevés memóriával rendelkező gépen, speciális memória foglaló algoritmusra van szükség. Fontos megjegyezni, hogy csak a memória foglalást és felszabadítást definiáljuk újra a konstruktor mindenképpen meghívódik. Ha a globális vagy alap new és delete operátorokat definiáljuk újra akkor azok többé nem lesznek elérhetők a programban. Nézzünk erre egy példát: #include <cstdio> #include <cstdlib> void* operator new(size_t sz) printf("operator new: %d Bytes\n", sz); void* m = malloc(sz); if(!m) puts("out of memory"); return m; void operator delete(void* m) puts("operator delete"); free(m);

class S int i[100]; S() puts("s::s()"); ~S() puts("s::~s()"); ; puts("creating & destroying an int"); int* p = new int(47); delete p; puts("creating & destroying an s"); S* s = new S; delete s; puts("creating & destroying S[3]"); S* sa = new S[3]; delete []sa; Arra is lehetőség van, hogy a new és delete operátorokat csak az adott osztályra írjuk felül. Az objektum vektort kezelő new és delete operátorokat külön-külön is újra kell definiálni. Például: #include <new> // Size_t definicio #include <fstream> ofstream trace("log.out"); class Widget enum sz = 10 ; int i[sz]; Widget() trace << "*"; ~Widget() trace << "~"; void* operator new(size_t sz) trace << "Widget::new: " << sz << " bytes" << endl; return ::new char[sz]; // globalis new void operator delete(void* p) trace << "Widget::delete" << endl; ::delete []p; // globalis delete void* operator new[](size_t sz)

trace << "Widget::new[]: " << sz << " bytes" << endl; return ::new char[sz]; void operator delete[](void* p) trace << "Widget::delete[]" << endl; ::delete []p; ; trace << "new Widget" << endl; Widget* w = new Widget; trace << "\ndelete Widget" << endl; delete w; trace << "\nnew Widget[25]" << endl; Widget* wa = new Widget[25]; trace << "\ndelete []Widget" << endl; delete []wa; return 0;