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

Hasonló dokumentumok
Bevezetés a programozásba Előadás: Fordítási egység

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

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

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

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

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

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

3. Osztályok II. Programozás II

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

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

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

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

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

Programozás C++ -ban

Alprogramok, paraméterátadás

Programozási nyelvek Java

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

és az instanceof operátor

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

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 és C++ -ban

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Google C++ style guide

C++ programok fordítása

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

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

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

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

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

OOP #14 (referencia-elv)

Osztály és objektum fogalma

Programozás módszertan

Pénzügyi algoritmusok

Objektumok inicializálása

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

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

Típusok és konstansok

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

500. AA Megoldó Alfréd AA 500.

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

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

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

Programozási nyelvek Java

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

Programozás II gyakorlat. 6. Polimorfizmus

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Pénzügyi algoritmusok

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

C programozási nyelv

Objektumelvű programozás

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

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

C++ programozási nyelv

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

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

1) Hány byte-on tárol a C++ egy karaktert (char)? implementáció-függő ( viszont lásd 79. megjegyzés ) 1 8 4

Web-technológia PHP-vel

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

Programozás C++ -ban 2007/7

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

Programozási nyelvek (ADA)

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

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

Pénzügyi algoritmusok

117. AA Megoldó Alfréd AA 117.

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

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

C++ Gyakorlat jegyzet 7. óra

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Osztályok. 4. gyakorlat

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

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?

1. Alapok. Programozás II

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

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

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

Mutatók és mutató-aritmetika C-ben március 19.

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

Java II. I A Java programozási nyelv alapelemei

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

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

Programozási Nyelvek (C++) Összefoglaló

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

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

Bevezetés a programozásba I.

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

1. Bevezetés szeptember 9. BME Fizika Intézet. Szám. szim. labor ea. Tőke Csaba. Tudnivalók. feladat. Tematika. Moodle Házi feladatok

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

500. CC Megoldó Alfréd CC 500.

Osztálytervezés és C++ implementációs ajánlások I.

Adatbázis és szoftverfejlesztés elmélet

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

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Programozás I. 5. Előadás: Függvények

Programozási nyelvek JAVA EA+GY 1. gyakolat

Programozási nyelvek Java

Programozás C++ -ban

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

Átírás:

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

ISMÉTLÉS Interface - Implementation struct Particle { int x,y; unsigned char r,g,b; void rajzol(); }; }; void Particle::rajzol() { gout << << move_to(x, y) y) << << color (r, g, g, b) b) << << dot; }

ISMÉTLÉS Láthatóság struct Particle { Particle(int X, X, int Y); virtual void mozog( ); ); virtual void rajzol( ); ); protected: double x,y; unsigned char r,g,b; }; };

ISMÉTLÉS Osztály class Particle { public: Particle(int X, X, int Y); virtual void mozog( ); ); virtual void rajzol( ); ); protected: double x,y; unsigned char r,g,b; }; };

ISMÉTLÉS particle.hpp #ifndef #ifndef PARTICLE_HPP PARTICLE_HPP #define #define PARTICLE_HPP PARTICLE_HPP struct struct Particle Particle { { int int x,y; x,y; unsigned unsigned char char r,g,b; r,g,b; void void rajzol(); rajzol(); }; }; #endif #endif Implementáció elrejtése particle.cpp #include #include particle.hpp particle.hpp void void Particle::rajzol() Particle::rajzol() { gout gout << << move_to(x, move_to(x, y) y) << << color color (r, (r, g, g, b) b) << << dot; dot; } main.cpp #include #include particle.hpp particle.hpp int int main() main() { { Particle Particle p; p; p.rajzol(); p.rajzol(); } }

ISMÉTLÉS A fordítás menete Preprocesszor Forráskódok értelmezése, típusok feltérképezése (pl. méret miatt). Forrásfájlonként egy tárgykód (object,.o) fájl létrehozása. Ebben gépi kódú részletek vannak, előkészítve a csatlakozási pontokat A linker összeköti a tárgykódokat undefined reference : egyik tárgykódban sincs feloldva egy csatlakozási pont, pl függvényhíváshoz nem található függvény implementáció

Konstansok Literál konstansok 5, vagy Hello world literál Változónak látszó, típussal, névvel ellátott konstans const double pi = 3.14159; konstans Globális változót nem illik csinálni, globális konstanssal nincs probléma.

Literálok A literáloknak is van típusa, tipikus példák: 21 : int 21ll : long long int 21.0 : double 21.0f : float C++11-ben lehet saját suffixeket gyártani Literál megadható nem csak decimálisan: 0x21 : =33, hexadecimális 021 : =17, oktális

Konstansok kizárólag kezdeti értékkel lehet deklarálni: definiálni Értékadás nincs értelmezve Fordítási időben ismert az értéke int a = 1; 1; a = 2; 2; const int c = 1; 1; c = 2 ez nem megy ez megy

Konstans referencia const T & r; A leggyakoribb paraméterezési forma Használandó: Másoló konstruktor operátorok Gyors, biztonságos

Érték, vagy const referencia paraméterezés? Az érték szerinti paraméterátvétel explicit másolást jelent, ez néha kihasználható A másolás nagyméretű típusoknál lassú Az érték szerinti paraméter átvételnél csak statikus típus van, a referencia szerinti megőrzi a dinamikus típust csonkolás: amikor egy objektumot az isa reláció szerint ősosztályként használva elhagyjuk a dinamikus típushoz tartozó adatait Ökölszabály: az olyan típusokat, ahol lehet öröklődés, const referenciával kezeljük

A const használata Ha valami const, akkor nem végezhető vele olyan művelet, ami az értéket megváltoztathatja A változatlanságra garanciát ad a fordító paraméterként csak akkor adható át, ha az adott függvény ott konstans paramétert vár, így a lokális változó is const még mutatót sem lehet rá állítani, csak olyan mutatót, ami konstansokra tud csak mutatni Honnan tudható, hogy tagfüggvény hívható-e?

Konstans tagfüggvények int main() { const string s = Hello ; cout << << s.length(); } Ez működik. A fordítóprogram valahonnan tudja, hogy a length() nem fogja megváltoztatni az értéket

Konstans tagfüggvények int main() { const string s = Hello ; cout << << s.length(); } size_type string::length() const { }

Konstans tagfüggvények class Particle { public: Particle(int X, X, int Y); virtual void mozog( ); ); virtual void rajzol( ) const; protected: double x,y; unsigned char r,g,b; }; };

Konstansság Mezei változónak konstans értékül adható úgyis másolat készül, az eredeti nincs veszélyben mutatót nem lehet rá állítani Konstansnak pályafutása kezdetén mezei változó értékül adható paraméterként kapott lokális változók Ez lehetőséget ad arra, hogy a változó által tárolt értéknek időszakosan, egy-egy függvényhívás idejére védettséget biztosítsunk

A this Kizárólag tagfüggvényben használható Mutató, ami a meghívott objektumra mutat más szavakkal maga az implicit paraméter Tipikus használata ha az objektum tagfüggvényén belül hív olyan függvényt, ahol paraméterként saját magát kell átadnia visszatérési értékként értékadás operátorban, és egyéb olyan operátorokban, függvényekben, ahol a kifejezés hatása a visszatérési értékben is hasznos

A this struct koord { double x,y; koord operator=(const koord& masik) { x=masik.x; y=masik.y; return *this; } }; }; int int main() { koord a,b,c; c=b=a; return 0; 0; }

Konstans tagfüggvények A this típusa C class egy sima tagfüggvényében: C * Konstans tagfüggvényben pedig const C * Tehát a konstans tagfüggvényen belül a mezőkre nem hívható nem konstans művelet Ez a technikai háttere a konstansság ellenőrzésének konstans tagfüggvényekben

Áttekintés A const használata az eddigiek alapján egy már tartalmas programra láncreakciót okoz Ha egy tagfüggvényt megjelölünk, hogy konstans, a bennelevő meg nem jelölt tagfüggvényekre hivatkozás, illetve paraméterátadás nem const paraméterként nem fordul le Ha paraméternél jelöljük a konstansságot, nem hívhatjuk meg az objektum nem megjelölt tagfüggvényeit Érdemes idejekorán ezt elintézni Később sem vészes, a fordító keresgél helyettünk

Kiskapuk Néha előfordul, hogy a szigorú konstansság követelmények bajt okoznak Meglevő, nem módosítható könyvtár készítői nem gondoltak a konstansok helyes kezelésére const_cast mutable

A mutable A mutable egy osztály mezőjének módosítója lehet Azt jelenti, hogy ez a mező akár egy konstans objektumban is megváltozhat Tipikus használata: olvasásszám nyilvántartás cache Jó tervezésnél a reprezentációt nem deklaráljuk mutable-ként

const_cast Általában nem állíthatunk mutatót konstansra, ha mégis kell*, akkor használjuk a const_cast-ot const T* cm =.. a konstansra mutató T* m = const_cast<t*>(cm); Ezzel most m változtatható módon mutat bele a konstansba, és ez veszélyes Nem definiált következmény! * nagyon ritkán kell. Ha kellett, akkor máris van miért újratervezni az egészet.

Biztonságos programozás és a const Fordítási időben kiderül a probléma konstans tagfüggvények használatával a lehetséges módosítások köre szűkül következetesség a fordítóprogram támogatásával Ismétlődő literálok elkerülése (magic numbers) a literálok típusai bizonytalanok (1/2 vs 0.5)

Konstansok és hatékonyság A konstansok fordítási időben ismertek, tehát a fordítóprogram fordítás közben a műveleteket elvégezheti velük, azaz nem futásidőben telik vele az idő Következtetés: a szép forráskód, ahol az olvasható értelmes konstansok műveletekben állnak (pl: képernyőfelbontásdobozméret, mint legszélső rajzolható pozíció) nem okoznak lassulást. C++11: constexpr

Egyéb érdekességek Mutatók is lehetnek konstansok: const int * m int const * m int * const m const int * const m Az első két írásforma felcserélhető mutató, ami konstans int-re mutat Ha a * után van a const, a mutató konstans, tehát nem mutathat később máshová Jobbról balra érdemes olvasni