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)

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

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. (3. ea) C++

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

Java és web programozás

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

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

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

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

Objektumelvű programozás

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

Programozás II gyakorlat. 8. Operátor túlterhelé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)

Osztály és objektum fogalma

Globális operátor overloading

Pénzügyi algoritmusok

Java és web programozás

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

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

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

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

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

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

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

Objektumok inicializálása

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

500. AA Megoldó Alfréd AA 500.

Programozás módszertan

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.

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

C++ programozási nyelv Konstruktorok-destruktorok

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

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

Programozás C++ -ban

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

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

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

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

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

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

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

Objektum orientált programozás Bevezetés

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

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.

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

OOP. Alapelvek Elek Tibor

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

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

3. Osztályok II. Programozás II

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

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

Objektumorientált paradigma és programfejlesztés Bevezető

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

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

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

.AA Megoldó Alfréd AA.

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?

500. CC Megoldó Alfréd CC 500.

C++ programozási nyelv

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

128. AA Megoldó Alfréd AA 128.

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

117. AA Megoldó Alfréd AA 117.

Programozás II gyakorlat. 6. Polimorfizmus

Osztályok. 4. gyakorlat

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

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

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

OOP #14 (referencia-elv)

0. Megoldó Manó 0. Programozás alapjai 2. (inf.) pót zárthelyi gyak. hiányzás: 2 n/kzhp: n/11,5. ABCDEF IB.028/2.

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

Programozási alapismeretek 4.

és az instanceof operátor

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

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

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

500. DD Megoldó Alfréd DD 500.

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

1. Öröklés Rétegelés Nyilvános öröklés - isa reláció Korlátozó öröklődés - has-a reláció

Java programozási nyelv

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

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

Bevezetés a programozásba 2

1000.AA Megoldo Alfréd 1000.A

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

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

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:

Programozás C++ -ban 2007/7

Programozás C++ -ban 2007/4

- 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++ programozási nyelv Struktúrák a C++ nyelvben

228. AA Default Konstruktor AA 228.

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

mul : S T N 1 ha t S mul(s, t) := 0 egyébként Keresés Ezt az eljárást a publikus m veletek lenti megvalósításánál használjuk.

Objektumorientált paradigma és a programfejlesztés

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

Átírás:

Programozás alapjai II. (3. ea) C++ OO paradigmák, osztály, operátorok átdefiniálása Szeberényi Imre BME IIT <szebi@iit.bme.hu> M Ű E G Y T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -1- Programfejlesztés Feladatanalízis világ = dolgok + tevékenységek Modellezés Tervezés absztrakció dekompozíció Implementáció (programozás) program = adatstruktúrák + algoritmusok C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -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. 2011.02.22. -3-1

Korai szoftverkészítés jellemzői többnyire gépi nyelvek követhetetlen módosíthatatlan nincsenek letisztult vezérlési szerkezetek ciklusba nem illik beugrani zsenigyanús programozók pótolhatatlan emberek, nem dokumentált szoftverkrízis kezdete C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -4- Gépi nyelv? // Kiírunk egy stringet void print(string str) 00401350 push ebp 00401350 55 8B EC 83 EC 40 53 56 U ě.ě@sv 00401351 mov ebp,esp 00401358 57 8D 7D C0 B9 10 00 00 WŤŔą... 00401353 sub esp,40h 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. 2011.02.22. -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. 2011.02.22. -6-2

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. 2011.02.22. -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. 2011.02.22. -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, C, MODULA-2 C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -9-3

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. 2011.02.22. -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. 2011.02.22. -11- Absztrakt adat Absztrakt adatszerkezetek a működésre koncentrálunk és nem az adatra működés: 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 az adat, csak a műveleteket egy adaton több funkció pl: verem, sor, tömb, lista, fa, stb. OBJEKTUM: a konkrét adat és a rajta végezhető műveletek megtestesítője C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -12-4

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óval a az adatokon végzett tevékenységekre koncentrálunk: Tevékenység beolvasás() kiírás() abs() Adat Komplex, KomplexTömb Komplex, KomplexTömb Komplex C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -13- Feladat: komplex számok/2 struct Komplex { ; void main() { Komplex t[10]; beolvasas(t); kiiras(t); // adat // funkciók C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -14- Feladat: komplex számok/3 double abs(komplex k) { { return sqrt(k.re*k.re + k.im*k.im); void beolvasas(komplex t[]) { for (int i=0; i<10; i++) cin >> t[i].re >> t[i].im; void kiiras(komplex t[]) { for (int i=9; i>=0; i--) cout << t[i].re << ' ' << t[i].im << ' ' << abs(t[i]) << endl; C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -15-5

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) Az eredmény nehezen használható fel újra C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -16- Adatorientált dekompozíció Kik a probléma szereplői? Strukturáló szempont: dolgok (adatok) Dekompozíció: szereplőkre (objektumokra) bontunk absztrakt: a belső szerkezetet eltakarjuk Tevékenységek: műveletek a szereplőkön absztrakt: nem kell tudni, hogy hogyan működik. C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -17- Feladat: komplex számok újra 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. 2011.02.22. -18-6

Feladat: komplex számok újra /2 Komplex k; KomplexTar t; for (int i = 0; i < 10; i++){ k.beolvas(); t.tarol(i, k); 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. 2011.02.22. -19- Objektum OBJEKTUM: a konkrét adat és a rajta végezhető műveletek megtestesítője 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. 2011.02.22. -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. 2011.02.22. -21-7

Leképezés a C++ eszközkészletére... for (int i = 0; i < 10; i++){ cin >> k; Nem biztos, hogy tömb, csupán jelölés!! t[i] = k; for (int i = 9; i >= 0; i--) { k = t[i]; cout << k << ' ' << (double)k << endl; Absz. érték jelölése lehetne ez is. Ez egy lehetséges jelölés a műveletekre. Nem biztos, hogy javítja az olvashatóságot! A példa itt csak a lehetőséget demonstrálja. C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -22- OO paradigmák egységbezárás (encapsulation) osztályok (adatszerkezet, műveletek összekapcsolá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 adatszerkezet alapú megoldások C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -23- Komplex obj. megvalósítása C-ben struct Komplex { ; 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; // deklaráció és definíció setkomplex(&k1, 1.2, 0); // inicializálás f = abs(&k1); C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -24-8

Interfész függvények setkomplex(komplex *kp, double r, double i); funkció + obj. típusa melyik adat művelet operandusai void beolvaskomplex(komplex *kp); double abskomplex(komplex *kp); C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -25- Adattakarás Ha egy db objektum van, akkor modullal: komplex.c: static struct Komplex {... void setkomplex(double r, double i) {... double abskomplex() {... komplex.h: extern void setkomplex(double r, double i); double abskomplex(); program.c: #include "komplex.h" setkomplex(1.2, 3.1); OO paradigmák csak önfegyelemmel tarthatók be! C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -26- Összetartozás C++-ban struct Komplex { egységbezárás void set(double r, double i); double abs(); ; nem tilos Kompex k1; k1.re = 1.2; k1.im = 0; k1.set(1.2, 0); f = k1.abs(); OO paradigmák csak önfegyelemmel tarthatók be! C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -27-9

Adattakarás C++-ban adatok privátak private: tagfüggvények nyilvánosak public: void set(double r, double i); double abs(); TILOS, mert privát ; Kompex k1; k1.re = 1.2; k1.im = 0; k1.set(1.2, 0); f = k1.abs(); CSAK ÍGY C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -28- Class 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; objektumok C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -29- Egy osztály: Komplex adatok privátak public: void set(double r, double i) { re = r; im = i; double abs(); inline-nak megfelelő ; double Komplex::abs() { return(sqrt(re*re+im*im)); void main() { scope operátor Komplex k1; k1.set(1.2, 3.4); cout << k1.abs(); C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -30-10

A class megvalósítása public: void set(double r, double i) { re = r; im = i; double abs() {... ; struct Komplex { ; void setkomplex(struct Komplex *this, double r, double i) { this -> re = r; this -> im = i; double abskomplex(komplex *this) {... C++ C C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -31- This pointer példányra mutató poi. 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*im)); Komplex k1; double f = k1.abs(); C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -32- Műveletek objektumokkal... ; Komplex k1; // definició és inicializálás k1.set(1.2, 3.4); // két lépésben Komplex k2 = k1; // definició másolással * k2.set(1.3, 8.1); // állapotváltás double f =k2.abs(); // állapot lekérdezése k2 = k1; // értékadás * Komplex kt[10]; // 10 elemű tömb (inicializálatlan) *Nem is adtunk meg hozzá metódust (tagfüggvényt)!!!? A C++-ban vannak alapértelmezett metódusok! C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -33-11

Konstruktor és destruktor KONSTRUKTOR: Definíció és inicializálás összevonása. DESTRUKTOR: Az objektum megszüntetése. ez az alapértelmezés public: Komplex() { // konstruktornak nincs típusa Komplex(double r, double i) { re = r; im = i; ~Komplex() { // destruktornak nincs paramétere... ; Komplex k1; ideiglenes objektum Komplex k2 = k1; // másoló (copy) konstruktorral Komplex k3 = Komplex(1.2, 3.4); C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -34- Komplex példa újból public: Komplex(double r) { re = r; Komplex(double r, double i) { re = r; im = i; double Re() { return re; double Im() { return im; ~Komplex() { cout << "Nincs mit megszüntetni"; ; { Komplex k1(1.3, 0); // definició és inic. Komplex k2(3), k3; Nincs ilyen! destruktorok meghívódnak C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -35- Mi a helyzet a műveletekkel? default arg. előnyei public: Komplex(double r = 0, double i = 0) { re = r; im = i;... ; int main() { Komplex k1, k2(1, 1), kt[10]; Komplex k3 = Komplex(2, 0); k1 = k2 + k3; Tömb, ha van paraméter nélküli konstruktor Művelet, hogyan? C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -36-12

k1 = k2 + k3 először a + -t kell kiértékelni: ha a bal oldal osztály, akkor van-e megfelelő, azaz k2.operator+(k3) alakú tagfüggvénye ha nincs, vagy beépített típus és a jobb old. osztály, akkor van-e megfelelő globális függvény, azaz operator+(k2, k3) alakú függvény. Ugyanez történik az = -vel is, de ehhez van alapértelmezett függvény abban az esetben, ha mindkét oldal azonos típusú, aminek a hatása az, amit várunk: másolás. C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -37- Műveletekkel bővített Komplex public:... Komplex operator+(const Komplex& k) { Komplex sum(k.re + re, k.im + im); return(sum); Komplex operator+(const double r) { return(operator+(komplex(r))); ;... Komplex k1, k2, k3; k1 + k2; k1 + 3.14; k1 = k2; 3.14 + k1; // bal oldal nem osztály! // Ezért globális függvény kell! C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -38- Alapértelmezett double + 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 adat! 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.re() + r, k.im())); Publikus lekérdező fv. (l. 35. dián) C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -39-13

2. megoldás: védelem enyhítése Szükséges lehet a privát adatok elérése egy globális, függvényből, vagy egy másik osztály tagfüggvényéből. Az ún. barát függvények hozzáférhetnek az osztály privát adataihoz.... public: // FONTOS! Ez nem tagfüggvény, csak így jelöli, hogy barát friend Komplex operator+(const double r, const Komplex& k); ; Komplex operator+(const double r, const Komplex& k) { k.re... k.im... // hozzáfér a privát adatokhoz C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -40- Majdnem kész a Komplex public:... Komplex operator+(const Komplex& k) { Komplex sum(k.re + re, k.im + im); return(sum); Komplex operator+(const double r) { return(operator+(komplex(r))); friend Komplex operator+(const double r, const Komplex& k); friend ostream& operator<<(ostream& s, const Komplex& k); ; ostream& operator<<(ostream& s, const Komplex& k) { s << k.re << ',' << k.im << 'j'; return(s); cout << k1 << k2; Így láncolható C++ programozási nyelv BME-IIT Sz.I. 2011.02.22. -41- Op. átdefiniálás szabályai Minden átdefiniálható 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. 2011.02.22. -42-14