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

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

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

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

Programozás módszertan

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

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

C++ programozási nyelv Konstruktorok-destruktorok

Programozási nyelvek Java

3. Osztályok II. Programozás II

Kifejezések. Kozsik Tamás. December 11, 2016

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

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

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

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

OOP #14 (referencia-elv)

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

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

Pénzügyi algoritmusok

Informatika terméktervezőknek

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

1. Alapok. Programozás II

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

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

Alapok. tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók

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

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

Objektumok inicializálása

Generikus Típusok, Kollekciók

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

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

500. AA Megoldó Alfréd AA 500.

Programozás C és C++ -ban

Java II. I A Java programozási nyelv alapelemei

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

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

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 1

Bevezetés a programozásba. 11. Előadás: Esettanulmány

Apple Swift kurzus 3. gyakorlat

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

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Pénzügyi algoritmusok

Java II. I A Java programozási nyelv alapelemei

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

Imperatív és procedurális programozás a Javában

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

Szövegek C++ -ban, a string osztály

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

Programozás C++ -ban 2007/7

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

Delphi programozás IV.

117. AA Megoldó Alfréd AA 117.

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. (3. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozá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?

Objektum-orientált programozás

128. AA Megoldó Alfréd AA 128.

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

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

Kifejezések. Kozsik Tamás. December 11, 2016

Google C++ style guide

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Programozási nyelvek Java

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

Kivételkezelés a C++ nyelvben Bevezetés

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Java és web programozás

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

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

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

.AA Megoldó Alfréd AA.

Objektumorientált programozás C# nyelven

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

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.

Osztályok. 4. gyakorlat

Alprogramok, paraméterátadás

A C# programozási nyelv alapjai

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

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 2. előadás

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

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

Maximum kiválasztás tömbben

Cekla. Készítette Doxygen Tue Sep :13:44

JAVA PROGRAMOZÁS 2.ELŐADÁS

Bevezetés a programozásba 2

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

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

500. CC Megoldó Alfréd CC 500.

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

Globális operátor overloading

Készítette: Nagy Tibor István

7. fejezet: Mutatók és tömbök

Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás

Programozási Nyelvek: C++

Alkalmazott modul: Programozás 9. előadás. Strukturált programozás: dinamikus adatszerkezetek

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

Bevezetés a Python programozási nyelvbe

Pénzügyi algoritmusok

Átírás:

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

Emlékeztető struct Vektor { int meret, *mut; Vektor(int meret); int szamlal(int mit); }; int Vektor::szamlal(int mit) { int c=0; for (int i=0;i<meret;i++) if(mut[i]==mit) c++; return c; } int main() { Vektor v(5); v.szamlal(0);.. felület (interface) Típus megvalósítás (implementáció)

Emlékeztető struct Vektor { int meret, *mut; Vektor(int meret); Vektor(int meret, int a); ~Vektor(); int szamlal(int mit); }; Adatmezők Konstruktorok, Destruktor Tagfüggvények

Másoló konstruktor Kezdőérték int a=4; int b(a); vagy int b=a; Vektor a(5);.. Vektor b(a); Megtehető, de váratlan hatás jelentkezik a: 5 mut

Másoló konstruktor Kezdőérték int a=4; int b(a); vagy int b=a; Vektor a(5);.. Vektor b(a); Megtehető, de váratlan hatás jelentkezik a: 5 mut b: 5 mut

Másoló konstruktor a: 5 mut b: 5 mut a[3] = 42; cout << b[3]; // 42! ez nem biztonságos másolat!

Másoló konstruktor Megoldás: a Vektor tartalmazzon Vektor paraméterű konstruktort! Vektor(Vektor & masik); Vektor::Vektor(const Vektor & masik) { meret=masik.meret; mut = new int[meret]; for (int i=0;i<meret;i++) mut[i]=masik.mut[i]; }

Másoló konstruktor a: 5 mut b: 5 mut Vektor::Vektor(const Vektor & masik) { meret=masik.meret; mut = new int[meret]; for (int i=0;i<meret;i++) mut[i]=masik.mut[i]; }

Összefoglalás Ha tartalmaz referenciát egy rekord, felmerül a másolás biztonsága Shallow copy deep copy A másoló konstruktor (copy constructor) egy speciális konstruktor, aminek egy darab paramétere van, a lemásolandó szerkezet. Mindig létezik alapértelmezett másoló konstruktor Kifejezések kiértékelése : a=b+c+d; Érték szerinti paraméter átadás

Túlterhelés Ugyanazon a néven több függvény, amik paraméterlistájukban térnek el Egyértelműség Paraméterek típusa vagy száma alapján Visszatérési érték nem különböztet meg Komoly kuszálási lehetőség : lehetőleg ugyanahhoz függvénynévhez hasonló műveleteket társítsunk!

Túlterhelés string beolvas(istream &); string beolvas(string fajlnev); string beolvas(string fajlnev, int index); string beolvas(istream &, char terminalojel); Vigyázzunk az alapértelmezett paraméterértékkel: string beolvas(string fajlnev); string beolvas(string fajlnev, int index=0); hibás!

Túlterhelés : feloldás Néhány típus egymásba automatikusan átalakítható, ami bonyolít a helyzeten: Ha nincs szükség konverzióra Ha szükség van konverzióra, de az automatikus átalakításokkal csak egy lehetőség érhető el Ha szükség van konverzióra, automatikussal nem, de saját konverziókkal csak egy lehetőség érhető el Formális nyelvek, nyelvi elemző

Összefoglalás Túlterhelünk függvényeket, ha hasonló műveletet különböző típusokkal kell végrehajtani Túl sok, vagy túl kevés túlterhelés váratlan függvényhívásokat eredményezhet a nehezen végiggondolható túlterhelés-feloldás miatt Ilyenek például az operátorok is

Operátorok Első közelítés: az operátorok függvények, metódusok Vektor a,b; c=a+b; Vektor operator + (Vektor a, const Vektor& b) { return a.hozzaad(b); } tagfüggvény másoló konstruktor

Operátorok függvények Operátoroknak véges listája használható Az operátor csak adott számú paraméterrel rendelkezhet, attól függően, hogy önállóan, vagy metódusként használjuk A függvények csak zárójeles formában használhatóak (prefix vs infix forma) Operátornál nincs alapértelmezett paraméterérték

Operátorok függvényként: S& operator+(s& a, S& b) { } metódusként: S& S::operator+(S& a) { } Szükségesek az adatmezők? Mindkettő szerepelhet, ilyenkor a túlterhelés szabályai érvényesek Egy operandusú (referencia, negatív előjel, konverzió) is lehet

Operátorok : értékadás T& T::operator=(T& masik) nem összetévesztendő a másoló konstruktorral Változó definiálása NEM ez az eset: T a=b; a másoló konstruktort hívja meg Referencia visszatérési típus az a=b=c érdekében Vektor& Vektor::operator=(Vektor &masik){ if (mut)delete mut; meret=masik.meret; mut=new int[meret]; for(int i=0;i<meret;i++) mut[i]=masik.mut[i]; }

Operátorok : egyenlőségvizsgálat bool T::operator==(T& masik) bool Vektor::operator==(Vektor &masik){ if (meret==masik.meret) { for(int i=0;i<meret;i++) { if (mut[i]!=masik.mut[i]) return false; return true; } } else return false; }

Operátorok : kiírás ostream& T::operator<< (ostream& out) Referencia a cout << a << b érdekében: cout << a << b zárójelezve (cout << a) << b ostream& Vektor::operator<<(ostream &out) { out << "[ "; for(int i=0;i<meret;i++) out << mut[i] << " "; out << "]" << endl; return out; }

Operátorok : konverzió T::operator T2() { } T2 típusra konvertálásra ad lehetőséget struct racionalis { int szamlalo, nevezo; operator double() { return double(szamlalo)/nevezo; } Óvatosság

Operátorok : kifejezések A kifejezések kiértékelése a túlterhelt operátorok szerint keresett egyértelmű zárójelezés Szintaxisfa S a,b,c; a=a+-b+c; a=a+-b+c

Operátorok : kifejezések A kifejezések kiértékelése a túlterhelt operátorok szerint keresett egyértelmű zárójelezés Szintaxisfa S a,b,c; a=a+-b+c; a = a+-b+c

Operátorok : kifejezések A kifejezések kiértékelése a túlterhelt operátorok szerint keresett egyértelmű zárójelezés Szintaxisfa S a,b,c; a=a+-b+c; = a + a -b+c

Operátorok : kifejezések A kifejezések kiértékelése a túlterhelt operátorok szerint keresett egyértelmű zárójelezés Szintaxisfa S a,b,c; a=a+-b+c; = a + a + -b c

Operátorok : kifejezések A kifejezések kiértékelése a túlterhelt operátorok szerint keresett egyértelmű zárójelezés Szintaxisfa S a,b,c; a=a+-b+c; = a + a + - c b

Összefoglalás Hatékony eszköz Tömör kód Rugalmasság Majdnem minden operátor túlterhelhető kivételek: sizeof? : ::. (.*, typeid)