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

Hasonló dokumentumok
Programfejlesztés. Programozás alapjai II. (3. ea) C++ Néhány programozási módszer. Korai szoftverkészítés jellemzői. Gépi nyelv? Strukturált tervezés

Programozás alapjai II. (2. 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. (2. 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. (2. ea) C++

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)

Programfejlesztés. Programozás alapjai II. (3. ea) C++ Néhány programozási módszer. Korai szoftverkészítés jellemzői. Gépi nyelv? Strukturált tervezés

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

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

Java és web programozás

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

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

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

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

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Objektumelvű programozás

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)

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

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

Programozás módszertan

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

500. AA Megoldó Alfréd AA 500.

Objektumok inicializálása

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

Globális operátor overloading

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

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

Programozás C++ -ban

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

Osztály és objektum fogalma

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.

Pénzügyi algoritmusok

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

OOP. Alapelvek Elek Tibor

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 II. 6.Öröklés Dr. Iványi Péter

Java és web programozás

C++ programozási nyelv Konstruktorok-destruktorok

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

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

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

Osztályok. 4. gyakorlat

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása

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

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

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

Programozás alapjai II. (3. ea) C++ Panaszok kezelése. Hol tartunk?

.AA Megoldó Alfréd AA.

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása. Biztonságos adattípusok megvalósítása

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

3. Osztályok II. Programozás II

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

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

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

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

Objektumorientált paradigma és programfejlesztés Bevezető

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

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

500. CC Megoldó Alfréd CC 500.

OOP #14 (referencia-elv)

Objektum orientált programozás Bevezetés

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?

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

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

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

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

128. AA Megoldó Alfréd AA 128.

Programozás C++ -ban 2007/7

117. AA Megoldó Alfréd AA 117.

Programozás II gyakorlat. 6. Polimorfizmus

228. AA Default Konstruktor AA 228.

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

1. Alapok. Programozás II

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

Stack Vezérlés szerkezet Adat 2.

OOP #1 (Bevezetés) v :39:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

C++ programozási nyelv

1000.AA Megoldo Alfréd 1000.A

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

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

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

Programozási nyelvek Java

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

S0-02 Típusmodellek (Programozás elmélet)

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

503.AA Megoldo Arisztid 503.A

500. DD Megoldó Alfréd DD 500.

A C programozási nyelv I. Bevezetés

Pénzügyi algoritmusok

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

Apple Swift kurzus 3. gyakorlat

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:

Objektumorientált szoftverfejlesztés alapjai

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

Bevezetés a programozásba 2

Objektumorientált paradigma és a programfejlesztés

Programozás C++ -ban

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

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

Generikus Típusok, Kollekciók

Átírás:

Programozás alapjai II. (3. ea) C++ OO paradigmák, osztály, operátorok átdefiniálása Szeberényi Imre, Somogyi Péter 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. 2018.02.20. - 1 -

Feladatanalízis Programfejlesztés világ = dolgok + tevékenységek Modellezés Tervezés absztrakció (elvonatkoztatás a részletektől) dekompozíció (részfeladatra bontás) Implementáció (programozás) program = adatstruktúrák + algoritmusok C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 2 -

Néhány programozási módszer Korai szoftverkészítés Strukturált Moduláris Objektum-orientált Funkcionális Deklaratív Adatfolyam-orientált Aspektus-orientált... C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 3 -

Korai szoftverkészítés jellemzői többnyire gépi nyelvek nehezen követhető nehezen módosítható nincsenek letisztult vezérlési szerkezetek ciklusba nem illik beugrani zsenigyanús programozók pótolhatatlan emberek, nem dokumentált szoftverkrízis kezdete (1968) http://homepages.cs.ncl.ac.uk/brian.randell/nato/natoreports C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 4 -

Gépi nyelv? // Kiírunk egy stringet void print(string str) 00401350 push ebp 00401351 mov ebp,esp 00401350 55 8B EC 83 EC 40 53 56 U ě.ě@sv 00401353 sub esp,40h 00401358 57 8D 7D C0 B9 10 00 00 WŤ}Ŕą... 00401360 00 B8 CC CC CC CC F3 AB. ĚĚĚĚó«00401356 push ebx 00401368 8B 45 08 50 68 1C 20 42 E.Ph. B 00401357 push esi 00401370 00 E8 5A 24 00 00 83 C4.čZ$...Ä 00401358 push edi 00401378 08 5F 5E 5B 83 C4 40 3B._^[.Ä@; 00401359 lea edi,[ebp-40h] 00401380 EC E8 9A 22 00 00 8B E5 ěčš".. ĺ 0040135C mov ecx,10h 00401388 5D C3 CC CC CC CC CC CC ]ĂĚĚĚĚĚĚ 00401361 mov eax,0cccccccch 00401366 rep stos dword ptr [edi] 00401368 mov eax,dword ptr [ebp+8] 0040136B push eax 0040136C push offset string "%s" (0042201c) 00401371 call printf (004037d0) 00401376 add esp,8 00401379 pop edi 0040137A pop esi 0040137B pop ebx 0040137C add esp,40h 0040137F cmp ebp,esp 00401381 call chkesp (00403620) 00401386 mov esp,ebp 00401388 pop ebp 00401389 ret C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 5 -

Strukturált tervezés "oldd meg a feladatot" -> "gépen futó pr." (E.W.Dijkstra, C.A.Hoare) "A" gép fokozatos finomítás "B" gép absztrakt gépek rétegei "C" gép absztrakció: részletektől való elvonatkoztatás, hasonlóságok felismerése, ábrázolás, műveletvégzés, axiomák felállítása dekompozíció: részekre bontás, egymástól függetlenül kezelhető kisebb feladatok elhatárolása, határfelületen "látható" viselkedések meghatározása C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 6 -

Strukturált tervezés /2 strukturált adatok, tipizálás strukturált műveletek, tipizálás előnyök: áttekinthetőbb, minden réteghez önálló döntések, hordozhatóság hátrányok: adatstruktúrákat nagyon pontosan kell definiálni a magasabb absztrakciós szinteken is, hatékonysági problémák PASCAL nyelv (blokkok fa struktúrája) C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 7 -

Moduláris tervezés modul: önálló egység meghatározott kapcsolódási felülettel (interface) cserélhető önállóan fordítható önállóan tesztelhető információ elrejtése funkcionális megközelítés modulban a belső kötés erős modulok között a kötés gyenge C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 8 -

Moduláris tervezés /2 egy adatszerkezeten egy funkció előnyök: funkcionális bontás magától értetődő interfészek jól kézben tarthatók hátrányok: esetenként több példány az elrejtés miatt az adatok megjelennek az interfészeken, így azok "kőbe" lettek vésve FORTRAN, MODULA-2, ADA C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 9 -

Dekompozíció Felbontás egyszerűbb részfeladatokra A felbontás absztrakt, ha a felbontás anélkül történik, hogy a részeket pontosan meg kellene oldani, vagy meg kellene érteni; csak a felület megadására szorítkozik (a kapcsolódáshoz); a részletek megadását elodázza C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 10 -

Funkcionális dekompozíció Mit csinál a rendszer? Strukturáló szempont: tevékenység Tevékenység: résztevékenységekre bontunk absztrakt: mit csinál a résztevékenység anélkül, hogy kellene tudni, hogy hogyan csinálja Adatok: résztevékenységek ki-bemenete nem absztrakt, mert tudnunk kell a pontos adatszerkezetet C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 11 -

Feladat: komplex számok Olvassunk be 10 komplex számot és írjuk ki a számokat és abszolút értéküket fordított sorrendben! Funkcionális dekompozíciónál az adatokon végzett tevékenységekre koncentrálunk: Tevékenység beolvasás() és tárolás kiírás() abs() Adat Komplex, KomplexTömb Komplex, KomplexTömb Komplex C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 12 -

Funkcionális dekompozícióval struct Komplex { double re, im; }; int main() { Komplex t[10]; // adatok beolvasas(t); // műveletek kiiras(t); return 0; } C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 13 -

Funkcionális dekompozícióval/2 double abs(komplex k){//adatot ismerni kell return sqrt(k.re*k.re + k.im*k.im); } void beolvasas(komplex t[]){//ismerni kell for (int i=0; i<10; i++) cin >> t[i].re >> t[i].im; } void kiiras(komplex t[]) {//ismerni kell for (int i=9; i>=0; i--) cout << t[i].re << '+' << t[i].im << 'j' << abs(t[i]) << endl; } C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 14 -

Kőbe vésett adatszerkezet Ahhoz, hogy dekompozíció során nyert funkciók megvalósíthatók legyenek, rögzíteni kell a funkciók által kezelt adatok formátumát, struktúráját. pl. el kell dönteni, hogy tömböt használunk, melynek a szerkezetét pontosan meg kell adni. Nehezen módosítható (pl. átállás polár koordinátákra) Nehezen használható fel újra. Az adat nem absztrakt C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 15 -

Absztrakt adattípus Az adat matematikai modellje viselkedésre koncentrálunk (viselkedési osztály) értékkészlet és az azon értelmezett a művelet halmaz a lényeges művelet: leképezés az értelmezési tartomány és az értékkészlet között a művelek algebrai leírással megadhatók nem kell ismerni a megvalósítást, azt sem, hogy mi a konkrét adat, csak a műveleteket egy adaton több funkció pl: komplex, verem, sor, tömb, lista, fa, stb. C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 16 -

Objektum Az OBJEKTUM testesíti meg a konkrét adatot és a rajta végezhető műveleteket egyedileg azonosítható viselkedéssel és állapottal jellemezhető felelőssége és jogköre van képes kommunikálni más objektumokkal a belső adatszerkezet, és a műveleteket megvalósító algoritmus rejtve marad könnyen módosítható újrafelhasználható általánosítható C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 17 -

Objektum orientált dekompozíció Kik a probléma szereplői? Strukturáló szempont: dolgok (alany, adatok) Dekompozíció: szereplőkre (objektumokra) bontunk Adat: absztrakt: a belső szerkezetet eltakarjuk Tevékenységek: műveletek a szereplőkön (ige) absztrakt: nem kell tudni, hogy hogyan működik. C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 18 -

A feladat OO dekompozícióval Olvassunk be 10 komplex számot és írjuk ki a számokat és abszolút értéküket fordított sorrendben! Objektum orientált dekompozíció használatakor az absztrakt adatra koncentrálunk: Szereplő (objektum) Komplex KomplexTar Művelet (üzenet) beolvas(), kiir() abs() tarol() elovesz() C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 19 -

A feladat OO dekompozícióval/2 Komplex k; // beolvas, kiir, abs KomplexTar t;// tarol, elovesz for (int i = 0; i < 10; i++) { k.beolvas(); t.tarol(i, k); a k objektum beolvas műveletét aktivizáljuk } for (int i = 9; i >= 0; i--) { k = t.elovesz(i); k.kiir(); cout << ' ' << k.abs() << endl; } C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 20 -

Objektum orientált modell az objektumok jelentik a valóság és a modell kapcsolatát együttműködő objektumok megvalósítás: objektumokat szimuláló programegységekkel C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 21 -

OO paradigmák egységbezárás (encapsulation) osztályok (adatszerkezet, műveletek egységbezárása) többarcúság (polymorphism) műveletek paraméter függőek, tárgy függőek (kötés) példányosítás (instantiation) öröklés (inheritance) generikus adatszerkezetek és algoritmusok C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 22 -

Komplex obj. megvalósítása C-ben struct Komplex { double re, im; }; Az összetartozásra csak a név utal void beolvaskomplex(komplex *kp); double abskomplex(komplex *kp); void setkomplex(komplex *kp, double r, double i); struct Komplex k1, k2; // deklaráció és definíció setkomplex(&k1, 1.2, 0); // inicializálás f = abskomplex(&k1); Névtér hiánya f = abskomplex(&k2); C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 23 -

Interfész függvények paraméterei setkomplex(komplex *kp, double r, double i); funkció + obj. típusa melyik konkrét adat művelet operandusa i void beolvaskomplex(komplex *kp); double abskomplex(komplex *kp); Ilyen paraméterezést használtunk a gyakorlaton a String esetében is. C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 24 -

k1.set(1.2, 0); f = k1.abs(); Egységbezárás C++-ban struct Komplex { adatok double re, im; void set(double r, double i); double abs(); }; Kompex k1, k2; k1.re = 1.2; k1.im = 0; tagfüggvények A fv. névben elég a funkciót jelölni. A saját adatot sem kell átadni. setkomplex(&k1, 1.2, 0); k1, k2 objektum: adatok és a rajta végezhető műveletek C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 25 -

Adattakarás C++-ban struct Komplex { private: double re, im; public: void set(double r, double i); double abs(); }; Kompex k1; k1.re = 1.2; k1.im = 0; k1.set(1.2, 0); f = k1.abs(); CSAK ÍGY privát adatok nyilvános tagfüggvények Közvetlen hozzáférés a priváthoz TILOS C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 26 -

Osztály Objektum osztály objektum fajta, típus (viselkedési osztály) Osztály Objektum Objektum Egy viselkedési osztály egy konkrét példánya. osztály Komplex k1, k2, k3; C++-ban a struct egy osztály! objektumok C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 27 -

Adatelérés megvalósítása class Komplex { double re, im; public: void set(double r, double i) { re = r; im = i; } }; Komplex k1; k1.set(1.2, 3.4); C++ struct Komplex { double re, im; }; void setkomplex(struct Komplex *this, double r, double i) { this -> re = r; this -> im = i; a konkrét objektumra mutat } struct Komplex k1; set(&k1, 1.2, 3.4); C C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 28 -

this pointer példányra mutató ptr. class Komplex { double re, im; public: void set(double re, double im) { this->re = re; this->im = im; }... *this azt az objektumot jelenti, amelyre a tagfüggvényt meghívták. }; double Komplex::abs() { return sqrt(this->re * this->re+this->im * this->im); } Komplex k1; double f = k1.abs(); C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 29 -

Kívül és belül definiált tagfvüggvény class Komplex { adatok privátak double re, im; public: void set(double r, double i) { re = r; im = i; } double abs(); }; double Komplex::abs() { return sqrt(re*re+im*im); } int main() { Komplex k1; k1.set(1.2, 3.4); cout << k1.abs(); } inline-nak megfelelő scope operátor C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 30 -

Tagfüggvények szerepe Privát adatok lekérdezése (getter fv.) Privát adatok beállítása (setter fv.) Objektum állapotának (adatainak) változtatása Műveletek az adatokkal Adatok létrehozása Adatok megszüntetése C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 31 -

Konstans tagfüggvények class Komplex { double re, im; public: void set(double r, double i) { re = r; im = i; } double getre() const { return re; } double getim() const { return im; } double abs() const; }; double Komplex::abs() const { } return sqrt(re*re + im*im); Nem változtat(hat)ja meg az állapotot (adatokat) C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 32 -

Alapértelmezett tagfüggvények Automatikusan keletkező (implicit deklarált): Konstruktor Létrehozza az objektumot Destruktor Megszünteti az objektumot Másoló konstruktor Másolás útján hoz létre új objektumot Értékadás (értékadó operátor) Új érteket ad egy létező objektumnak Címképző és dereferáló operátorok C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 33 -

Konstruktor KONSTRUKTOR: Az objektum létrejöttekor hívódik. Feladata, hogy alapállapotba hozza az objektumot. Ha nem deklarálunk egyet sem, akkor implicit jön létre. class Komplex { double re, im; public: Komplex() { } Ilyen üres programozott törzs keletkezik implicit módon // konstruktornak nincs típusa Komplex(double r, double i) { re = r; im = i; } }; Komplex k1; // paraméter nélkül hívható (default) Komplex k2 = k1; // másoló (copy) ctr. (ez most implicit) Komplex k3 = Komplex(1.2, 3.4); ideiglenes objektum C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 34 -

Destruktor DESTRUKTOR: Az objektum megszüntetésekor hívódik. Alapvető feladata, hogy megszüntesse az obj. által din. mem. területen létrehozott objektumokat/adatokat. class Komplex { double re, im; Ez keletkezne implicit módon public: ~Komplex() {} // destruktornak paramétere sincs }; { Komplex k1; // paraméter nélkül hívható (default) Komplex k2 = k1; // másoló (copy) konstruktor } destruktorok hívódnak C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 35 -

Komplex példa újból class Komplex { double re, im; public: Komplex(double r) { re = r; } Komplex(double r, double i) { re = r; im = i; } double getre() const { return re; } double getim() const { return im; } ~Komplex() { cout << "Nincs mit megszüntetni"; } }; { Komplex k1(1.3, 0); // definíció és inic. Komplex k2(3), k3; } Nincs ilyen konstr. destruktorok meghívódnak C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 36 -

Default argumentummal class Komplex { double re, im; public: Komplex(double r = 0, double i = 0) { re = r; im = i; } double getre() const { return re; } double getim() const { return im; } void kiir(ostream& os = cout) const; ~Komplex() { cout << "Nincs mit megszüntetni"; } }; void Komplex::kiir(ostream& os) const { os << re << '+' << im << 'j'; } Csak az egyik helyen, tipikusan a deklarációnál jelöljük a default-ot! C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 37 -

Paraméter nélküli (default) konstr Objektum létrehozása alapállapottal. Automatikusan hívódik minden olyan esetben, amikor az objektumnak alapállapotban kell létrejönnie. Pl: nem paraméteres ctor-t hívtunk ( Komplex k1; ) tömbelemek létrehozásánál ( Komplex kt[10]; ) tartalmazott objektumoknál struct Fraktal { Komplex c; int i;... }; származtatásnál (ld. később) Nem keletkezik implicit, ha van legalább 1 explicit C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 38 -

Most itt tartunk class Komplex { double re, im; public: Komplex(double r = 0, double i = 0) { re = r; im = i; } double getre() const { return re; } // hasonlóan getim() is void kiir(ostream& os = cout) const; void setre(double r) { re = r; } // hasonlóan setim(double) is void beolvas(isteram& is = cin); }; int main() { Komplex k1, k2(1, 1), kt[10], k3; kt[2].kiir(); // itt mit ír ki? Komplex *kp = new Komplex[100]; // mi történik itt? delete[] kp; } C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 39 -

Mit tud az osztályunk? Azokat a műveleteket (metódusokat), amit implementáltunk (set/get, kiír, beolvas,...) + néhány alapértelmezett dolgot, amit az ajándékba kapott implicit deklarált tagfüggvények valósítanak meg pl: Komplex k4 = Komplex(1,8) // inicializálás k1 = k2; // értékadás Komplex *p = &k1; // címképzés k2 = *p; // dereferálás Összeadni nem tud? C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 40 -

Tud összeadni, ha megtanítjuk Az operátorokat függvények valósítják meg. A függvények túlterhelhetők. Majdnem minden operátor túlterhelhető, ha legalább az egyik operandus objektum. Komplex összeadás: Globális operátorral (eddig ilyenek voltak) Tagfüggvénnyel (miért ne lehetne op. tagf.) C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 41 -

k1 = k2 + k3 először a + -t kell kiértékelni: ha a bal oldal objektum, akkor van-e megfelelő, azaz k2.operator+(k3) formára illeszkedő tagfüggvénye ha nincs, vagy beépített típus és a jobb old. obj., akkor van-e megfelelő globális függvény, azaz operator+(k2, k3) formára illeszkedő függvény. Ugyanez történik az = -vel is, de ehhez van implicit deklarált függvény abban az esetben, ha mindkét oldal azonos típusú, aminek a hatása az, amit várunk: értékadás. C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 42 -

Műveletekkel bővített Komplex class Komplex { double re, im; public:... Komplex operator+(const Komplex& k) const { Komplex sum(k.re + re, k.im + im); return sum; } Komplex operator+(const double r) const { return operator+(komplex(r)); } };... Komplex k1, k2, k3; k1 + k2; k1 + 3.14; k1 = k2; 3.14 + k1; // bal oldal nem objektum! // Ezért globális függvény kell! Alapértelmezett C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 43 -

double + Komplex class Komplex {... }; Globális fv., nem tagfüggvény: Komplex operator+(const double r, const Komplex& k) { return Komplex(k.re + r, k.im); } Baj van! Nem férünk hozzá, mivel privát! 1. megoldás: privát adat elérése pub. fv. használatával: Komplex operator+(const double r, const Komplex& k) { return Komplex(k.getRe() + r, k.getim()); } Publikus lekérdező fv. C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 44 -

Kiírás: cout << k1 A bal oldal objektum ugyan, de nincs a kezünkben. Ezért csak egy operator<<(cout, k1) hívásra illeszthető globális függvénnyel lehet megoldani: ostream& operator<<(ostream& os, const Komplex& k) { k.kiir(os); return os; } Így láncolható cout << k1 << k2; C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 45 -

Beolvasás: cin >> k1 A bal oldal objektum ugyan, de nincs a kezünkben. Ezért csak egy operator>>(cin, k1) hívásra illeszthető globális függvénnyel lehet megoldani: istream& operator>>(istream& is, Komplex& k) { k.beolvas(is); return is; } A kiir() és a beolvas() tagfüggvény akár el is hagyható: ostream& operator<<(ostream& os, const Komplex& k) { return os << k.getre() << '+' << k.getim() << 'j'; } C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 46 -

Op. túlterhelés szabályai Minden túlterhelhető kivéve:. ::?: sizeof A szintaxis nem változtatható meg Az egyop./kétop. tulajdonság nem változtatható meg Precedecia nem változtatható meg operator++() -- pre (++i) operator++(int) -- post (i++) operator double() -- cast (double) operator[ ](typ i) -- index (typ tetszőleges) operator()() -- függvényhívás C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 47 -

Op. túlterhelés előnye/hátránya Előnyök Szokásos aritmetikai, logikai funkciók Teljes aritmetika (pl: komplex) Összegzés növelés (pl. dátum) Összehasonlítás Hátrányok Szokásostól eltérő funkciók esetén zavaró lehet (double)komplex(3, 5) mit jelent? almás + rétes =?= rétes + almás A kommutativitás sérül. Lehet, hogy zavaró. cout << 1; C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 48 -

Egy furcsa példa Komplex k1, k2; double d = (double)k1; // mit jelent? valós rész? abs? Jelentse a valós részt: Komplex { operator double() { return re; } // formálisan nincs típusa!!! }; Veszély! A típuskonverzió automatikus is lehet! Pl: k1 + 3.14 (double)k1 + 3.14 lesz, ha nincs operator+(komplex, double) C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 49 -

Demo (ural2: ~szebi/proga2) #include <iostream> using std::cout; using std::endl; struct Valami { Valami() { cout << "HAHO!" << endl; } ~Valami() { cout << "Jaj!" << endl; } }; int main() { } cout << "1." << endl; Valami o1; cout << "2." << endl; Valami o2; Valami *o3 = new Valami; return 0; http://svn.iit.bme.hu/proga2/eloadas_peldak/ea_03 C++ programozási nyelv BME-IIT Sz.I. 2018.02.20. - 50 -