C++ programozási nyelv Konstruktorok-destruktorok

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

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

3. Osztályok II. Programozás II

C++ programozási nyelv Konstruktorok Gyakorlat

Osztályok. 4. gyakorlat

Pénzügyi algoritmusok

C++ programozási nyelv

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

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

Objektumok inicializálása

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

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

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.

Programozás C++ -ban

C++ programozási nyelv

Programozás C++ -ban

OOP #14 (referencia-elv)

C++ programozási nyelv

Bevezetés a C++ programozási nyelvbe

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Java programozási nyelv 5. rész Osztályok III.

JAVA PROGRAMOZÁS 2.ELŐADÁS

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

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

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

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

Java III. I I. Osztálydefiníció (Bevezetés)

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

Java III. I I. Osztálydefiníció (Bevezetés)

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

1. Alapok. Programozás II

Programozás C++ -ban 2007/4

Osztály és objektum fogalma

és az instanceof operátor

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

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

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Java és web programozás

Programozás C++ -ban 2007/7

500. AA Megoldó Alfréd AA 500.

Java és web programozás

Smart Pointer koncepciója

C++ programozási nyelv

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

5. Gyakorlat. struct diak {

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

OOP: Java 8.Gy: Abstract osztályok, interfészek

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

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

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

Java és web programozás

Programozás C és C++ -ban

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

Objektumorientált programozás C# nyelven

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

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

Bevezetés a Python programozási nyelvbe

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Smalltalk 3. Osztályok létrehozása. Készítette: Szabó Éva

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

Virtuális függvények (late binding)

Programozási Nyelvek: C++

Pénzügyi algoritmusok

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

128. AA Megoldó Alfréd AA 128.

OOP alapok Egy OOP nyelvet három fontos dolog jellemez. egységbezárás ( encapsulation objektumoknak öröklés ( inheritance

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

Programozás BMEKOKAA146. Dr. Bécsi Tamás 7. előadá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.

Java II. I A Java programozási nyelv alapelemei

500. CC Megoldó Alfréd CC 500.

BME MOGI Gépészeti informatika 7.

Programozási nyelvek Java

Objektumorientált szoftverfejlesztés alapjai

1.AA MEGOLDÓ BERCI AA 1.

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

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

Informatika terméktervezőknek

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

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

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

ISA szimulátor objektum-orientált modell (C++)

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

Programozási nyelvek Java

Objektumorientált programozás IX. Osztályok, objektumok

Bevezetés a C++ programozási nyelvbe

- 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++ 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:

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

Programozás II gyakorlat. 6. Polimorfizmus

Programozás I gyakorlat

Származtatási mechanizmus a C++ nyelvben

Számítógép és programozás 2

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

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

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

Programozás módszertan

Átírás:

C++ programozási nyelv Konstruktorok-destruktorok Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. szeptember A C++ programozási nyelv Soós Sándor 1/20

Tartalomjegyzék Logikai típus A new és a delete operátorok Dinamikus tömbök kezelése A class fogalma A konstruktor fogalma C++ -ban Mikor fut le a konstruktor? A destruktor fogalma C++ -ban Mikor fut le a destruktor? Alapértelmezett konstruktor Hogyan hozhatunk létre objektumokból álló tömböt? Hogyan hozhatunk létre objektumokból álló dinamikus tömböt? A hozzáférési hatáskörök osztályszintűek Tagfüggvény szabad függvény Példa: a múlt heti autós példa folytatása A C++ programozási nyelv Soós Sándor 2/20

Logikai típus Új típus a C++ -ban: bool önálló típus, nem kell egész értékekkel kombinálni Két lehetséges érték: true, false Példa: bool a, b; a = true; b = false; int i = 10; a = 10 == i; // ==> def. szerint: a = (10 == i); a = true a bool és int típus között létezik konverzió oda-vissza: int (true) = 1, int(false) = 0 bool(0) = false, bool(nem 0) = true Például: int i = true; // i = 1 bool b = 8; // b = true A C++ programozási nyelv Soós Sándor 3/20

A new és a delete operátorok A new operátor: memória foglalás inicializálás (objektumok esetén konstruktor meghívása) A delete operátor: destruktor meghívása memória felszabadítás vannak olyan nyelvek (pl. a Java ilyen), amelyekben működik az ún. garbage collection (hulladékgyűjtés) mechanizmus. Ez automatikusan felszabadítja azokat a memória tartományokat, amelyekre már semmi nem "mutat". A C++ -ban ilyen nincs, nekünk kell gondoskodnunk arról, hogy amit new-val létrehoztunk, azt meg is semmisítsük. A C++ programozási nyelv Soós Sándor 4/20

Dinamikus tömbök kezelése A new és delete használata tömbök esetében: Például: Nev = new char[30]; // létrehozunk egy 30 elemű tömböt delete [] Nev; // felszámoljuk a tömböt Mi történne, ha elhagyjuk a [] jeleket a delete-ből? Nagy valószínűséggel elszállna a program, mert a tömböket másképpen adminisztrálja a memóriakezelő rendszer, mint a skalár változókat. Felszabadításkor meg kell mondani, hogyez a pointer tömbre, vagy skalárra mutat. A C++ programozási nyelv Soós Sándor 5/20

A class fogalma A legtöbb nyelvben a class kulcsszó jelzi az osztályt. A C++ -ban megmaradt a struct is a C-vel való kompatibilitás kedvéért. Mi a különbség a class és a struct között? A struct esetében minden tagra a public hozzáférés az alapértelmezés A class esetében viszont a private Ettől eltekintve a két fogalom azonos. Objektum orientált programozás esetén általában a class-t használjuk. Például: struct osztaly { // ugyanezt class-szal is írhatnám private: int x; // ugyanazt jelentené public: void SetX( int ax ); int GetX(); } A C++ programozási nyelv Soós Sándor 6/20

A konstruktor fogalma C++ -ban A konstruktor az osztály, illetve az objektum inicializáló eljárása. Hogyan ismeri meg a rendszer a konstruktort? neve megegyezik a struktúra nevével nincs visszatérő értéke (nem void!!!) Egy osztálynak több konstruktora lehet, amelyek a szignaturájukban eltérnek egymástól. Szignatura: a függvény ill. a konstruktor neve + paramétereinek száma, típusa. A visszatérési érték nem része a szignaturának! Miért? A C++ programozási nyelv Soós Sándor 7/20

Egy példa konstruktorokra class Valami{ int x; Valami(); // 1. konstruktor deklarációja Valami( int ax ); // 2. konstruktor dekl. }; // konstruktorok definíciója Valami::Valami() { x = 0; } Valami::Valami( int ax ) { x = ax; } A C++ programozási nyelv Soós Sándor 8/20

Mikor fut le a konstruktor? A programozó soha nem hívja meg közvetlenül a konstruktort! Mikor fut le a konstruktor automatikusan? amikor a program végrehajtása eljut egy objektum típusú változó deklarációjához (automatikus változó) void main() { Valami v; a program a new operátor segítségével létrehoz egy objektumot (dinamikus változó) Valami *vp; vp = new Valami; vannak más esetek is, de ezekkel most nem foglalkozunk Melyik konstruktor fut le ilyenkor, ha több van? a szignatura alapján egyértelműen csak egy jöhet szóba A C++ programozási nyelv Soós Sándor 9/20

A destruktor fogalma C++ -ban A destruktor az osztály, illetve az objektum lezáró megsemmisítő eljárása. Hogyan ismeri meg a rendszer a destruktort? neve megegyezik a struktúra nevével, előtte egy tilde (~) karakter. nincs visszatérő értéke (nem void!!!) Egy osztálynak csak egy destruktora lehet. A C++ programozási nyelv Soós Sándor 10/20

Példa destruktorra Példa: class Valami{ int x; Valami(); ~Valami(); }; // konstruktor deklarációja // destruktor deklarációja Valami::Valami() // konstruktor definíciója { x = 0; printf("konstruktor\n"); // demonstráció } Valami::~Valami() // destruktor definíciója { printf("destruktor\n"); // demonstráció } A C++ programozási nyelv Soós Sándor 11/20

Mikor fut le a destruktor? A programozó soha nem hívja meg közvetlenül a destruktort! Mikor fut le a destruktor automatikusan? amikor a program végrehajtása eljut egy objektum típusú változó hatáskörének végére (automatikus változó) void main() { Valami v; } a program a delete operátor segítségével megsemmisít egy objektumot (dinamikus változó) Valami *vp; vp = new Valami; delete vp; vannak más esetek is, de ezekkel most nem foglalkozunk A C++ programozási nyelv Soós Sándor 12/20

Alapértelmezett konstruktor Mit nevezünk alapértelmezett (default) konstruktornak? A paraméterek nélküli konstruktort. Ilyen konstruktora minden osztálynak van, ugyanis általában mi definiálunk egyet ha nem definiálunk egyetlen konstruktort sem az osztályban, akkor a fordító létrehoz egy üres, default konstruktort. ha létrehozunk egy vagy több paraméteres (nem default) konstruktort, akkor a fordító nem hoz létre default konstruktort, de tőlünk megköveteli, hogy megírjuk. Hasonlóképpen minden osztálynak van destruktora, ugyanis vagy mi definiáltuk vagy, ha mi nem tettük meg, akkor a fordító létrehoz egy üreset A C++ programozási nyelv Soós Sándor 13/20

Hogyan hozhatunk létre objektumokból álló tömböt? Ennek egyetlen feltétele van: az objektumnak legyen default konstruktora, vagy mi definiáljunk, vagy engedjük, hogy a fordító készítsen. Ekkor a következő példa azonnal működik: void main() { Valami vt[3]; printf("----\n"); } A kimenet: Konstruktor Konstruktor Konstruktor ---- Destruktor Destruktor Destruktor A C++ programozási nyelv Soós Sándor 14/20

Hogyan hozhatunk létre objektumokból álló dinamikus tömböt? Az előző példa a következőképpen módosul: void main() { Valami *vt; vt = new Valami[3]; printf("----\n"); delete [ ] vt; } A kimenet: Konstruktor Konstruktor Konstruktor ---- Destruktor Destruktor Destruktor A C++ programozási nyelv Soós Sándor 15/20

A hozzáférési hatáskörök osztályszintűek Mi történik akkor, ha egy objektum metódusa egy másik objektum adataihoz szeretne hozzáférni? Vizsgáljuk meg a következő példát: #include<iostream.h> class Valami{ public: void PublicFunc(Valami *Masik); private: int PrivateAdat; }; void Valami::PublicFunc(Valami *Masik) { cout << "A sajat PrivateAdat-om: " << PrivateAdat << endl; cout <<"Masik PrivateAdat-a: " << Masik->PrivateAdat << endl; } Ez is helyes! A C++ programozási nyelv Soós Sándor 16/20

Tagfüggvény szabad függvény Mikor használjunk tagfüggvényt és mikor hagyományos "szabad" függvényt? Hasonló kérdés, hogy ha több osztállyal dolgozunk, akkor egy adott funkciót melyik osztályba tegyünk, illetve mikor legyen szabad függvény? Példák Végső megoldás: Java - Csak tagfüggvény létezik! A C++ programozási nyelv Soós Sándor 17/20

Mikor írunk tagfüggvényt? Az egyes adatmezőket beállító, illetve azok értékét visszaadó függvények mindig metódusok. A kizárólag adatmezőkkel operáló függvények mindig tagfüggvények. A két vagy több objektummal operáló függvények lehetnek az egyik osztály tagfüggvényei, míg a másik objektumot paraméterként kapják meg. A C++ programozási nyelv Soós Sándor 18/20

Mikor írjunk szabad függvényt? Nincs olyan eset, amit csak szabad függvényként írhatunk meg. (Kivétel a programot elindító main függvény!) Ezt bizonyítja a Java példája. Javaban minden függvény valamelyik osztályhoz tartozik, még az indító main függvény is. Persze ez nem jelenti azt, hogy ne lehetne érdemes időnként szabad függvényt írni! A C++ programozási nyelv Soós Sándor 19/20

Példa: a múlt heti autós példa folytatása Vizsgáljuk meg a következő kérdéseket! Hány éves az autó? Mennyibe kerül egy út ezzel az autóval? Mennyi az éves súlyadó erre az autóra? Hány liter üzemanyagot használt el eddig az autó? Melyik a legfiatalabb, legöregebb autó a flottában? Ellenőrizzük, hogy csak helyes értékeket lehessen megadni az autóról! Írjunk függvényeket a fenti kérdések megválaszolására! Írjuk meg őket tagfüggvényként és szabad függvényként egyaránt! A C++ programozási nyelv Soós Sándor 20/20