Osztály és objektum fogalma



Hasonló dokumentumok
Származtatási mechanizmus a C++ nyelvben

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

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

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

Programozás C++ -ban 2007/4

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

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

Objektumok inicializálása

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

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

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

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

117. AA Megoldó Alfréd AA 117.

Objektumorientált programozás C# nyelven

Információs Technológia

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

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

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

Globális operátor overloading

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

Bevezetés a C++ programozási nyelvbe

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

Osztályok. 4. gyakorlat

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

C++ programozási nyelv Konstruktorok-destruktorok

3. Osztályok II. Programozás II

PHP5 Új generáció (2. rész)

Programozás módszertan

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

Objektumorientált programozás C# nyelven

Bánsághi Anna

Elemi Alkalmazások Fejlesztése II.

Bánsághi Anna

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

Információs Technológia

C# osztályok. Krizsán Zoltán

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

500. AA Megoldó Alfréd AA 500.

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

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

Pénzügyi algoritmusok

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

JAVA PROGRAMOZÁS 3.ELŐADÁS

Bevezetés a programozásba Előadás: A const

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

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

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

1 Rev 4. A C++ programozás alapjai- segédlet

Programozás II gyakorlat. 6. Polimorfizmus

Magas szintű programozási nyelvek 2 Előadás jegyzet

C++ programozási nyelv

Java és web programozás

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

C++ programozási nyelv

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

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

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

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

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

Az élet szép, környezetünk tele van fákkal, virágokkal, repdeső madarakkal, vidáman futkározó állatokkal.

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?

VB C++ C# JScript J# Common Language Specification. ADO.NET and XML. Base Class Library. Common Language Runtime. Operating System

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

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

Java és web programozás

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

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

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

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

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

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

1.sz melléklet Nyári gyakorlat teljesítésének igazolása Hiányzások

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

Bevezetés a C programozási nyelvbe. Az Általános Informatikai Tanszék C nyelvi kódolási szabványa

BME MOGI Gépészeti informatika 8.

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

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

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

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

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Bevezetés a programozásba 2

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

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

Java VII. Polimorfizmus a Java nyelvben

Programozás alapjai II. (3. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

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

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

Objektumorientált szoftverfejlesztés alapjai

C++ Gyakorlat jegyzet 7. óra

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

3. Gyakorlat Ismerkedés a Java nyelvvel

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

Öröklés és Polimorfizmus

Vizuális programozás gyakorlat

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

Németország Düsseldorf MUNKANAPLÓ. Mobilitási projekt HU01 - KA Készítette: Bodonyi Bence

Átírás:

Osztály és objektum fogalma A C++ programozási nyelv I. CPP1/ 1 Az osztály (class) class: adatok és módszerek (method) (függvények) együttese, amely absztrakt adattípusként működik. objektum: egy osztály egy előfordulása módszer: az osztály egy eleme. Olyan függvény, amely az osztályba tartozó adatokon manipulál. Üzenet (message): kommunikáció az objektummal, annak módszerein keresztül. A C++ programozási nyelv I. CPP1/ 2 Osztálydeklaráció szintaktikája kulcsszó osztálynév <:szülők listája> { mező lista } A kulcsszó lehet: class (esetleg struct, union) Osztály definícióra használjuk MINDIG a "class" kulcsszót! Az osztály tagjai (mezői) lehetnek: Adatmezők, adattagok (data member) függvény-mezők, tagfüggvények (member function) A C++ programozási nyelv I. CPP1/ 3

A függvénymezők definíciója lehet belső (ekkor inline-nak minősül) külső (ekkor a hatáskör megjelölése szükséges) A C++ programozási nyelv I. CPP1/ 4 Hatásköri kérdések Minden osztály egy önálló osztály-hatáskört definiál. (Egységbezárás alapelve!) A meződeklarációk lokálisak az osztályhatáskörre nézve. A tagfüggvények egy hatáskörben vannak az adattagokkal => használhatják azokat! Hatáskör: scope Egységbezárás: encapsulation A C++ programozási nyelv I. CPP1/ 5 Osztály használata Az osztálynév típusnévként viselkedik, és minden eddig ismert deklarációs konstrukcióban használható. Objektum: az osztály egy előfordulása. Például: osztály típusú változó A C++ programozási nyelv I. CPP1/ 6

Hivatkozás a tagokra Analóg a struktúrák kezelésével. Tehát: objektumnév.mező vagy objektum_pointer->mező A mező lehet adattagra való hivatkozás (pontosan úgy, mint a struktúránál) tagfüggvény neve és aktuális paraméter-listája A C++ programozási nyelv I. CPP1/ 7 Láthatósági kérdések Egy osztály tagjaira való hivatkozás az osztályon kívül alapértelmezés szerint tilos! (Információ rejtés alapelve!) (Information hiding) Láthatóságot szabályozó kulcsszavak: public: a mező bárhol használható (protected: értelmezése majd később) private: csak az osztályon belül elérhető. Alapszabály: minden adattag private legyen! A C++ programozási nyelv I. CPP1/ 8 A kulcsszavak a meződeklarációk közé írandók, a kettősponttal együtt. A kulcsszavak hatása a másik kulcsszóig, vagy az osztály deklarációjának a végéig tart. A láthatóságot befolyásolja még a friend mechanizmus is (lásd később). A C++ programozási nyelv I. CPP1/ 9

Példa: osztálydefiníció class jarmu{ int kerekek; int szemely; int onsuly; public: void beallit(int k, int sz, int suly); double kerek_terheles (void); }; A C++ programozási nyelv I. CPP1/ 10 Példa: tagfüggvények implementációja void jarmu::beallit(int k,int sz, int suly) {kerekek = k; szemely = sz; onsuly = r;} double jarmu::kerek_terheles(void) {return (60.*szemely + onsuly)/ kerekek;} A C++ programozási nyelv I. CPP1/ 11 Példa: főprogram void main(void) { jarmu bicikli; // Objektum def. bicikli.beallit(2,1,20); printf( Bicikli kerekterheles: %lf, bicikli.kerek_terheles() ); } A C++ programozási nyelv I. CPP1/ 12

Objektum létrehozása Objektum létrehozása: objektum vagy objektumtömb definíció (statikus) new operátor (dinamikus) implicit létrehozás (ideiglenes objektumok) Folyamata: helyfoglalás az adattagoknak konstruktor automatikus meghívása A C++ programozási nyelv I. CPP1/ 13 Konstruktor Speciális tagfüggvény: neve egyezik az osztálynévvel nem lehet visszatérési értéke (még void sem!) nem hívható meg közvetlenül nem öröklődik Aktuális paraméterlista: deklarációban az objektumnév után new operátornál a típusnév (osztálynév) után A C++ programozási nyelv I. CPP1/ 14 Destruktor Speciális tagfüggvény: neve ~osztálynév nem lehet visszatérési értéke (még void sem!) nincs paraméterlistája nem hívható meg közvetlenül nem öröklődik Automatikusan meghívódik egy objektum megszűnésekor. A C++ programozási nyelv I. CPP1/ 15

A this mutató Minden objektumhoz saját adattag-készlet tartozik az osztály összes objektumára közös a tagfüggvény-készlet. Kérdés: hogyan tud a tagfüggvény az aktuális objektum adattagjaira hivatkozni? A C++ programozási nyelv I. CPP1/ 16 Megoldás: minden objektumra létezik az előredefiniált this mutató, amely az objektum címével inicializálódik. Ezen keresztül indirekt hivatkozással éri el az adattagot a tagfüggvény. A this mutató explicite is elérhető. A C++ programozási nyelv I. CPP1/ 17 A friend mechanizmus Ha egy F külső függvény egy X osztályban "friend"-ként van deklarálva, a tagfüggvényekkel azonos elérési jogokkal rendelkezik. Az F fgv-en belül az X osztály valamenyi "private" és "protected" eleme is elérhető. Deklaráció: az X osztályban a friend kulcsszó után a függvény prototípusa. A C++ programozási nyelv I. CPP1/ 18

Példa: friend függvény class X { friend int F (int); // Dekl. int i; public: int tag (double); }; int F (int a) // Def. {... } A C++ programozási nyelv I. CPP1/ 19 A friend mechanizmus (folyt.) Ha az X osztályban az Y osztály "friend"-ként van deklarálva, az Y osztály összes tagfüggvénye eléri az X osztály "private" és "protected" tagjait is. Deklaráció: az X osztályban a friend class Y; sorral. A C++ programozási nyelv I. CPP1/ 20 A friend mechanizmus (folyt.) Az Y osztály egy tagfüggvénye is lehet friend az X osztályban. Deklaráció: az X osztályban a friend kulcsszó után a tagfüggvény prototípusa. A tagfüggvény neve előtt az Y:: előtag szükséges! Megjegyzések: a friend viszony nem tranzitív a friend viszony öröklődik A C++ programozási nyelv I. CPP1/ 21

Fordítási egységek Egy C++ programban az osztálydefiníció csak a tagfüggvények prototípusait tartalmazza, a definíciójuk külön forrásfile-ban van összegyűjtve. Szokásos megoldás: osztalynev.h Osztálydefiníció osztalynev.cpp Tagfüggvények definíciói. Hivatkozik az osztalynev.h file-ra. A C++ programozási nyelv I. CPP1/ 22 Fordítási egységek (folyt.) Probléma: lehetséges többszörös beillesztés újradefiniálást okozhat fölöslegesen növeli a fordítási időt. Szokásos megoldás: egy pelda.h header file-ra #ifndef PELDA_H #define PELDA_h a header file tartalma #endif A C++ programozási nyelv I. CPP1/ 23 Operátor overloading fogalma A C++ nyelv lehetőséget nyújt arra, hogy a programozó által definiált típusokra az operátorok átértelmezhetők legyenek. A polimorfizmus implementációja! Egy operátorjel operandusainak típusa határozza meg az operátorjel jelentését. A jelentést függvénydefinícióval (tagfüggvénnyel vagy külső függvénnyel) írhatjuk le. A C++ programozási nyelv I. CPP1/ 24

Operátor overloading: alapszabályok Minden operátor újraértelmezhető, kivéve a..* ::?: (feltételes) operátorokat. Az = [] () -> new delete operátorokra speciális szabályok vonatkoznak Az operandusok száma nem változtatható meg Az előredefiniált típusokra vonatkozó operátorok nem definiálhatók újra. (Egy újradefiniált operátor legalább egy operandusa objektum kell legyen!) A C++ programozási nyelv I. CPP1/ 25 Alapszabályok (folyt.) A precedencia- és asszociativitási szabályok nem változnak meg, azaz a kiértékelés sorrendje ugyanaz marad. Az = operátor kivételével az újradefiniálás öröklődik. Az = operátornak azonos típusú objektumokra van alapértelmezése Nincs kommutativitás (felcserélhetőség) - a standard típusokra sem volt! A C++ programozási nyelv I. CPP1/ 26 Operátor overloading: definíció Egyoperandusú (unáris) operátor: Az x@ és @x (@ tetszőleges operátorjel) ugyanaz, és a fordítóprogram az alábbi függvényhívások valamelyikével helyettesíti: x.operator@() ahol operator@ az x osztályának tagfüggvénye operator@(x) az operator@ külső függvény A C++ programozási nyelv I. CPP1/ 27

Definíció (folyt.) Kétoperandusú (bináris) operátor: Az x@y kifejezést a fordítóprogram az alábbi függvényhívások valamelyikével helyettesíti: x.operator@(y) ahol operator@ az x osztályának tagfüggvénye vagy operator@(x,y) az operator@ külső függvény A C++ programozási nyelv I. CPP1/ 28 Egyoperandusú operátor feldolgozása Az x@ kifejezés feldolgozásának egy lehetséges forgatókönyve Feldolgozás a x alaptípusú? Igen beépített Kész Nem x típusa Cx algoritmus szerint Cx::operator@(void)? Nincs Van x@ helyettesítése az x.operator@() függvényhívással Kész ::operator@(cx x)? Nincs Hibajelzés! Van x@ helyettesítése az operator@(x) függvényhívással Kész Kész A C++ programozási nyelv I. CPP1/ 29 Kétoperandusú operátor feldolgozása Analóg az egyoperandusú esettel, az alábbi eltérésekkel: Ha mindkét operandus alaptípusú, a beépített algorimus beépítése Ha a baloldali operandus osztálytípusú, annak osztályában keres tagfüggvényt Ha a baloldali operandus alaptípusú, csak a külső operátor függvények között keres A C++ programozási nyelv I. CPP1/ 30

Operátor függvény paramétereinek száma Egyoperandusú operátor Kétoperandusú operátor Az operátor definiáló függvény tagfüggvény Az operátor definiáló függvény külső függvény 0 1 1 2 A C++ programozási nyelv I. CPP1/ 31 Operátor függvény és az operátor operandusai Az operátor definiáló függvény tagfüggvény Az operátor definiáló függvény külső függvény Egyoperandusú operátor Az aktuális objektum A függvény aktuális paramétere Kétoperandusú operátor Baloldali: az aktuális objektum Jobboldali: a függvény paramétere Baloldali: a függvény első paramétere Jobboldali: a függvény második paramétere A C++ programozási nyelv I. CPP1/ 32 Példa: operátor overloading class complex { //comp.h double valos,kepzetes; public: complex (double v, double k); void kiir (void); complex operator+ (complex z); friend complex operator-; }; A C++ programozási nyelv I. CPP1/ 33

comp.cpp/1 #include <iostream.h> #include comp.h complex::complex (double v, double k) // Konstruktor { valos = v; kepzetes = k; } void complex::kiir (void) { cout << "(" << valos << "," << kepzetes << ")\n"; } A C++ programozási nyelv I. CPP1/ 34 comp.cpp/2 complex complex::operator+ (complex z) // Osszeadas, tagfüggvény! {return complex(valos+z.valos, kepzetes+z.kepzetes); } A C++ programozási nyelv I. CPP1/ 35 comp.cpp/3 complex operator- (complex z1, complex z2) // Külső függvény { return complex (z1.valos-z2.valos, z1.kepzetes-z2.kepzetes); } A C++ programozási nyelv I. CPP1/ 36

proba.cpp #include comp.h void main (void) { complex a(0,0), b(1,1), c(2,2); a = b + c; a.kiir(); // a = b.operator+(c) a = b - c; a.kiir(); // a = operator-(b,c) } A C++ programozási nyelv I. CPP1/ 37