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

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

Osztályok. 4. gyakorlat

JAVA PROGRAMOZÁS 2.ELŐADÁS

C++ programozási nyelv Konstruktorok-destruktorok

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

Programozási alapismeretek 4.

C++ programozási nyelv

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

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

Osztály és objektum fogalma

OOP. Alapelvek Elek Tibor

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?

Már megismert fogalmak áttekintése

Globális operátor overloading

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 II. 4. Dr. Iványi Péter

OOP #14 (referencia-elv)

Bevezetés a Python programozási nyelvbe

és az instanceof operátor

Objektumok inicializálása

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

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

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

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

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

Interfészek. PPT 2007/2008 tavasz.

Objektumorientált szoftverfejlesztés alapjai

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Programozás módszertan p.1/46

Pénzügyi algoritmusok

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

Java és web programozás

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

Öröklés és Polimorfizmus

Programozási nyelvek Java

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

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

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

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

Java és web programozás

Objektum orientált programozás Bevezetés

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

Absztrakció. Objektum orientált programozás Bevezetés. Általános Informatikai Tanszék Utolsó módosítás:

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

Programozási nyelvek Java

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

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

Bevezetés a programozásba előadás: Öröklődés

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

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

III. OOP (objektumok, osztályok)

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

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

3. Osztályok II. Programozás II

Programozás C++ -ban

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

C++ programozási nyelv

Java és web programozás

Származtatási mechanizmus a C++ nyelvben

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

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

Alkalmazott Modul III 6. előadás. Objektumorientált programozás: öröklődés és polimorfizmus

Smart Pointer koncepciója

Web-technológia PHP-vel

ELTE SAP Excellence Center Oktatóanyag 1

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

Programozási nyelvek Java

8. gyakorlat Pointerek, dinamikus memóriakezelés

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

Programozási nyelvek Java

Objektumelvű programozás

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

Elemi Alkalmazások Fejlesztése II.

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

Programozás módszertan

500. AA Megoldó Alfréd AA 500.

C++ programozási nyelv

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

Objektumorientált programozás C# nyelven

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

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

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

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

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

Pénzügyi algoritmusok

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

Abstract osztályok és interface-ek. 7-dik gyakorlat

Osztály öröklődés. Öröklődés és polimorfizmus. Programozás II. előadás. Szénási Sándor.

OOP és UML Áttekintés

Google C++ style guide

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Java Programozás 3. Ea: Java osztályok. OOP alapalapok

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

Programozás I. Első ZH segédlet

Programozás. Objektum Orientált Programozás (OOP) Alapfogalmak. Fodor Attila

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Programozási nyelvek II.: JAVA, 3. gyakorlat

Programozási nyelvek Java

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

Átírás:

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

Tartalom OOP ismétlés Osztályok létrehozása Adattagok láthatóságai, elnevezési ajánlások Konstruktor, destruktor this pointer Statikus és dinamikus objektum példányosítás

OOP Ismétlés

Objektumorientáltság Az objektum valamilyen valós életből vett egyed Lehet konkrét, fizikai: személy, kártya, autó Lehet konkrét, nem fizikai: kurzus, hozzászólás Minden objektumot három fontos jellemző ír le Állapot milyen? Viselkedés mit tud csinálni? Identitás ki is ő? A fenti példák mindegyike rendelkezik mindhárommal

Állapot Az objektumot jellemezhetjük a tulajdonságaival (attribútumok) Minden tulajdonság sokféle értéket vehet fel (pl. születési év bármilyen egész szám lehet) Az objektum állapota a tulajdonságnak egy bizonyos kombinációja Pl. egy hallgató állapota lehet 1998-ban született, aktív féléves, 3.5 az átlaga és ABCEABC.SZE az EHA kódja

Viselkedés Az a mód, ahogy viselkedhet, reagálhat külső kérésekre Megmondja, hogy mit csinálhat és azt hogyan teszi Ezeket az objektum metódusai (~függvény) írják le Pl. a hallgató vehet fel vizsgát, adhat le vizsgát, passziváltathatja magát Tehát akkor lesz egy vizsgatfelvesz(), egy vizsgatlead() és egy passzivaltat() metódusa

Identitás Minden egyes objektum egyedi Még akkor is, ha mindenük egyforma A valóságban is, attól, hogy valakik ugyan arra a kurzusra járnak, ugyan abban az évben születtek, még különböző emberek Ettől függetlenül mégis hasonlítanak egymásra Ugyan azokkal a tulajdonságokkal jellemezzük őket Ugyan azokat tudják csinálni

Osztály Az osztály lesz az, ami tárolja a hasonlóságot Itt írjuk le, hogy milyen (mik az attribútumai) Miket tud csinálni (milyen metódusai vannak) Hogy kapcsolódnak más objektumokhoz Az osztály olyasmi lesz az objektumnak, mint az adattípus a változónak, tehát ez lesz a típusa

Objektum Az osztály egy konkrét példánya az objektum Ennek a létrehozását példányosításnak hívjuk Egy osztályból több objektum is lehet Egy objektum csak egy osztály példánya lehet

OOP paradigma alappillérei Abstraction Ami az osztályra tartozik, az legyen is ott Ami csak rá tartozik, azt csak ő lássa Encapsulation + Data hiding Encapsulation Minden, ami összetartozik (adattag, metódus), zárjuk össze egy osztályba Inheritance A közös részeket át lehet örökíteni Újrafelhasználható(bb) kódot írhatunk Polymorphism Egy objektum helyzettől függően több alakot is felvehet Gyerek lehet ős, ős nem lehet gyerek

Öröklődés Az öröklés az OOP paradigma egyik pillére Ha egy osztályt örököltetünk egy másikból, akkor az új (gyerek) megkapja a régitől (ős) az összes tulajdonságát és viselkedését Ezeket módosíthatja (ha engedjük), illetve kiegészítheti újakkal Overriding: ha definiálunk egy metódust, amilyen már volt az ősben, akkor felülírom, futásidőben dől el, hogy melyiket hívjuk

Öröklődés Az öröklődés specializáció/általánosító kapcsolat, attól függ, honnan nézzük A gyermek specializálja (szűkíti) az őst Az ős osztály a gyereknek egy általános (bővebb) esete Többszörös öröklődés: Javaban nincs! - de C++-ban lesz Egyszerre több dolog öröklése máshogy van megoldva, ld. később

Láthatóság OOP paradigma egyik fontos eleme: egységbezárás (encapsulation) Zárjuk össze és rejtsük el a külvilág elől, amit csak lehet Ezt a láthatóság módosításával érhetjük el

Polimorfizmus Leszármazott típusú osztályt mindig használhatunk ős típus helyett Metódus paraméterként Tömbben Objektum referenciánál Visszatérési értékként Őst viszont nem tudunk leszármazottra alakítani Kivéve, ha eredetileg leszármazott típusú volt és upcast miatt lett ős Ld. később

Konstruktor Speciális metódus, ami az objektum példányosításakor hívódik meg Példányosítást már nem tudja megakadályozni Kezdeti teendők megvalósítására szolgál A neve ugyan az, mint az osztálynak Nincs visszatérési értéke Lehet többféle paraméterlistája is lehet - overloading Általában public Minden osztálynak van default konstruktora

Overloading Azonos metódusnév, különböző paraméterlista A híváskor kapott paraméterek alapján dönt

Osztályok C++-ban

Osztályok létrehozása C++-ban az osztályok felfoghatók egy speciális névtérnek is Ez viszont nem folytatható Létrehozni a class kulcsszóval lehet (mint Javaban) Az adattagokat, metódusokat { } zárójelpár között soroljuk fel A záró } után ; kell!

Adattagok láthatósága A Javaban megismert láthatóságok itt is léteznek private csak az adott osztályban látható protected leszármazottak is láthatják (ld. Később) public bárki láthatja Alapértelmezett láthatóság a private

Adattagok láthatósága Láthatóságot nem kell minden adattag/metódus elé kirakni Elég egyszer, majd : után felsorolni az ilyen láthatósággal rendelkező adattagokat, metódusokat

Adattagok láthatósága Protected adattag és metódus class Kor { protected: double sugar; double kerulet(); }

Adattagok láthatósága Protected adattag és public metódus class Kor { protected: double sugar; public: double kerulet(); }

Elnevezési konvenciók Magyar jelölés: az adattag nevéven legyen benne a típusa is pl. double dsugar; int ievszam; Az adattagok nevét kezdjük m_ prefixszel, így elkülönülnek a lokális változóktól A kettő használható együtt is, pl. double m_dsugar; int m_ievszam;

Konstruktor Konstruktort már ismerjük Javaból, röviden: Speciális metódus Neve megegyezik az osztály nevével Nincs visszatérési értéke Egy objektum példányosításakor hívódik meg Értékadásra, erőforrások lefoglalására használjuk Az objektum létrejöttét már nem tudja megállítani Lehet több konstruktor is, aminek a neve ugyan az, de más paramétereket vár Default konstruktor: minden osztálynak van, felüldefiniálható az is

Konstruktor class Kor { double m_dsugar; public: Kor(double); }; Kor::Kor(double r) { m_dsugar = r; }

Destruktor Ilyen nem volt Javaban (ott van Garbage Collector) Az objektum törlésekor hívódik meg (de a törlést már nem tudja megakadályozni) Erőforrás felszabadításra használjuk (memória, fájl, hálózati kapcsolat...) Neve ugyan az, mint az osztály neve, csak az elején egy ~ van Nincs visszatérési értéke, nincs paramétere, csak egy lehet belőle

Destruktor class Kor { double m_dsugar; public: Kor(double); ~Kor(); }; Kor::Kor(double r) { m_dsugar = r; } Kor::~Kor(){}

This pointer Javaban is volt this, itt is az a jelentése Az aktuális objektumra mutat A this egy pointer Pl. Adattagjára a -> operátorral hivatkozhatunk (mint C-ben a dinamikusan foglalt struktúra mezőjére) Kor::Kor(double r) { } this->m_dsugar = r;

Objektum példányosítás C++-ban két módon lehet objektumokat létrehozni 1. stacken: statikus példányosítás 2. heapen: dinamikus példányosítás

Statikus példányosítás Stacken jön létre az objektum Automatikusan foglalódik neki hely a memóriában Automatikusan szabadul fel a hely a blokk végén A nevével tudunk hivatkozni rá, nem kell pointer Mint C-ben a változóknál

Statikus példányosítás Pl. Kor k1; //default konstruktor hívódik meg Kor k2(5.0); //paraméteres konstruktort hívjuk meg //ha az m_dsugar adattag public, így érhető el cout << k1.m_dsugar; delete k1; // ez hiba, nem lehet felszabadítani

Dinamikus példányosítás Heapen jön létre new operátorral foglaljuk Egészen addig él, amíg a delete operátorral nem töröljük Törölni kötelező, különben bent ragad a memóriában! Pointerrel tudunk rá hivatkozni Mint C-ben a dinamikusan foglalt tömbökre

Dinamikus példányosítás Pl. Kor *k2 = new Kor(); //default konstruktor Kor *k3 = new Kor(4.0); //paraméteres konstruktor cout << k3->m_dsugar; //adattag elérés delete k3; //memória felszabadítás, kötelező megtenni

Osztályok implementálása Javaban egy osztályt egy fájlba tettünk mindenestől C++-ban szétválasztjuk az osztály deklarációját az implementációjától C-ben ezt csináltuk a függvényekkel a header fájlok segítségével Minden osztály két fájlba lesz szétosztva: Osztaly.h osztály deklaráció: adattagok, metódus fejlécek Osztaly.cpp metódusok implementációja