Y36PJC Programování v jazyce C/C++

Slides:



Advertisements
Podobné prezentace
A1PRG - Programování – Seminář Ing. Michal Typová konverze, oblast platnosti, paměťové třídy 9 Verze
Advertisements

(instance konkrétní třídy)
Seminář C++ 5. cvičení Dědičnost Ing. Jan Mikulka.
Programovací jazyk C++
Přednáška 11 Jiří Šebesta
Programování 2 Cvičení 5.
Úvod do objektově orientovaného programování
Pole, ukazatele a odkazy
ÚVOD DO CPP 7 Dědičnost - pokračování
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Singleton 1 1.
C++ Přednáška 3 Konstantní a statické členy tříd, ukazatel this, konstantní instance třídy Ing. Jiří Kulhánek , kat. 352, VŠB TU Ostrava 2004.
Preprocess Úvod do tvorby funkcí Princip preprocesoringu Direktivy preprocesoru Podmíněný překlad Základy tvorby funkcí Zjednodušený popis principu předávaní.
Programování v C++ Cvičení.
Principy překladačů Běhová podpora Jakub Yaghob. Běhová podpora Statická podpora jazyka Překladač Interface na knihovny Hlavičkové soubory Dynamická podpora.
Algoritmizace a programování
Čtvrté cvičení Objektové programování Objektový model v Javě
C++0x stručný náhled na nadcházející revizi standardu programovacího jazyka C++ (ISO/IEC 14882) Jan Ringoš.
J a v a Začínáme programovat Lucie Žoltá metody, objekty, konstruktor.
State. State – kontext a problém Kontext  chování objektu má záviset na jeho stavu, který se typicky mění za běhu Neflexibilní řešení  metody obsahují.
Páté cvičení Dědičnost Interface Abstarktní třídy a metody
Seminář C++ 9. cvičení Šablony Ing. Jan Mikulka. Šablony ► template – vzory, podle kterých může překladač tvořit skupiny podobných tříd nebo funkcí, které.
A1PRG - Programování – Seminář Ing. Michal Standardní knihovní funkce pro práci se soubory 13 Verze
Školení správců II. Petr Pinkas RNDr. Vít Ochozka.
Třída jako zdroj funkcionality
Seminář C cvičení STL, Trolltech Ing. Jan Mikulka.
Objektové programování
Dynamická alokace, polymorfismus
Seminář C cvičení Obsluha výjimek Ing. Jan Mikulka.
PB161 – Programování v jazyce C++ Objektově Orientované Programování
Seminář C++ 4. cvičení Objekty Ing. Jan Mikulka. Co je objekt ► obraz třídy i instance ► třída – definovaná za pomocí klíčového slova class ► instance.
6. cvičení Polymorfismus
A1PRG - Programování – Seminář Ing. Michal Ukazatele a pole 10 Verze
Další abstraktní datové typy
Počítače a programování 1
PB161 Právo friend, přetěžování operátorů, přetypování PB161 | Friend, operátory PB161 – Programování v jazyce C++ Objektově Orientované Programování.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
OSNOVA: a) Úvod do OOPb) Třídy bez metod c) Třídy s metodamid) Konstruktory a destruktory e) Metody constf) Knihovní třídy g) Třídy ve tříděh) Přetížení.
IB111 Programování a algoritmizace
Návrh a tvorba WWW Přednáška 5 Úvod do jazyka PHP.
OSNOVA: a) Přetížení členských funkcí b) Dědičnost tříd Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 2 pro obor EST BPC2E.
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
13/04/20151 Indexery (1) Členy třídy (struktury) umožňující třídě (struk- tuře) používat hranaté závorky a pracovat s ní podobně jako s polem (používat.
13/04/20151 Datový typ třída – class (1) Datový typ definovaný uživatelem Poskytuje mechanismus pro modelování entit, s nimiž manipulují aplikace Charakterizuje.
Šesté cvičení Výjimky Balíky.
Uživatelem definované typy Ing. Lumír Návrat  katedra informatiky, A 1018 
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
FEL Komunikátor. Memory Leak program konsumuje operační paměť, kterou neumožňuje uvolnit o uvolnění paměti stará Garbage Collector ▫plně v režii Java.
Pokročilé programování v C++ (část B)
Vazby dynamických proměnných,databázové systémy Přednáška č. 10.
Ukazatele, řetězce Přednáška č. 3. Ukazatele  Ukazatel (pointer) – typ o velikosti 4 bajty (v 32bit. systémech) pro uložení adresy objektu na který ukazuje.
Soubory BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
Pokročilé datové typy (struktury, unie, dynamické proměnné)
PROGRAMOVÁNÍ 3ITA,3ITB Jaroslav Burdys Hlavní zdroj:
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA:
Programování OPERÁTOR SIZEOF, FUNKCE, POLE JAKO PARAMETRY FUNKCÍ ERIK KRÁL.
Programování v jazyce C++ Speciality jazyka C++, úvod do OOP.
Alokace paměti v C++ Funkce v C++ a parametry typu reference, implicitní parametry funkcí.
Počítače a programování 2
Úvod do C# - OOP Jaroslav BURDYS 4IT.
Programování ENUM, SWITCH,pole jednorozměrná a vícerozměrná, deklarace, inicializace, kopírování, porovnání Erik Král.
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
Programovací jazyk C++
Y36PJC Programování v jazyce C/C++
Programování 2. hodina RNDr. Jan Lánský, Ph.D.
Návrhový vzor Flyweight
Programování v jazyce C++
Dynamické proměnné (1) Proměnné, jejichž počet a (nebo) velikost pa-měti využívané těmito proměnnými se v prů-běhu programu mění Dynamické proměnné lze.
C# přehled vlastností.
Transkript prezentace:

Y36PJC Programování v jazyce C/C++ Třídy a objekty I Ladislav Vagner

Dnešní přednáška Y36PJC Třídy a objekty I Deklarace třídy. Konstruktor, destruktor, metody. Zapouzdření. Třídní a instanční proměnné a metody. Třídy v C++ a struktury v C.

Minulá přednáška Y36PJC Třídy a objekty I Práce s řetězci v C. Buffer-overflow chyby. Práce s řetězci v C++.

Třídy a objekty Y36PJC Třídy a objekty I Třídy: Reprezentace modelované skutečnosti v programu. Soustředí související údaje do jednoho celku. Uzavření před vnějším světem (omezení přístupu). Rozhraní pro práci (metody). Využitelné pro polymorfismus a dědění. Pouze v C++. V C třídy nejsou, pouze struktury (bez metod a řízení přístupu). Objekty: instance nějaké (právě jedné) třídy, třída má typicky mnoho instancí.

Příklad třídy v C++ Y36PJC Třídy a objekty I class CCplx { public: CCplx(double r, double i=0) {re=r; im=i;} CCplx(const char * str) { … } ~CCplx(void) { } double Re (void) {return re;} double Im (void) {return im;} double Abs (void) {return sqrt (re*re+im*im);} double Phi (void) {return atan2 (im, re);} private: double re, im; }; CCplx a ( 3, 4 ); cout << a.Re() << "+" << a.Im () << "i = " << a.Abs() << "<" << a.Phi() << endl;

Deklarace třídy v C++ Y36PJC Třídy a objekty I Konstruktor: jméno stejné jako třída, inicializace členských proměnných, volán vždy při vzniku instance, konstruktorů může být ve třídě více, rozlišení – viz pravidla pro přetěžování funkcí. Destruktor: jméno stejné jako třída s ~, maximálně jeden, volán vždy, když je odstraňována instance, úklid členských proměnných. Existují v Javě destruktory?

Deklarace třídy v C++ Y36PJC Třídy a objekty I Řízení přístupu: public: – neomezený přístup, protected:– pouze pro metody třídy a metody potomků, private: – pouze pro metody třídy. Viditelnost je daná blokově, podle poslední použité direktivy public/protected/private.

Deklarace třídy v C++ Y36PJC Třídy a objekty I Klíčové slovo class: zahajuje deklaraci třídy, stejný význam má i klíčové slovo struct. Rozdíl mezi class a struct: class – implicitní viditelnost je private, struct – implicitní viditelnost je public. class ABC { public: … }; struct ABC { … }; struct XYZ { private: … }; class XYZ { … };

Deklarace třídy v C++ Y36PJC Třídy a objekty I Deklarace metod – v deklaraci třídy. Definice metod (těla metod): v deklaraci třídy (jako v Javě), v odděleném souboru. Definice metod v deklaraci – inline metody: doporučení kompilátoru, že má metody rozepsat na místě použití, podobné klíčovému slovu inline u funkcí. Doporučení inline nemusí překladač respektovat: dlouhé metody, rekurzivní metody, ukazatel na metodu.

Deklarace třídy v C++ Y36PJC Třídy a objekty I // inline zpusob class CCplx { public: CCplx(double r, double i=0) {re=r; im=i;} CCplx(const char * str) { … } ~CCplx(void) { } double Re (void) {return re;} double Im (void) {return im;} double Abs (void) {return sqrt (re*re+im*im);} double Phi (void) {return atan2 (im, re);} private: double re, im; };

Deklarace třídy v C++ Y36PJC Třídy a objekty I // .h soubor – deklarace, ne tela metod class CCplx { public: CCplx(double r, double i=0); CCplx(const char * str) ~CCplx(void); double Re (void); double Im (void); double Abs (void); double Phi (void); private: double re, im; };

Deklarace třídy v C++ Y36PJC Třídy a objekty I // .cpp soubor – definice tel metod #include "CCplx.h" CCplx::CCplx(double r, double i) { // uz bez implicitnich hodnot parametru re = r; im = i; } double CCplx::Re (void) { return re; …

Konstruktory v C++ Y36PJC Třídy a objekty I Inicializace členských proměnných při vzniku instance. Výběr konstruktoru parametry v závorce při vytváření instance: CCplx a ( 10, 20 ); CCplx b ( "10 + 2i" ); Pravidla pro přetěžování funkcí. Implicitní hodnoty parametrů – snížení počtu přetížených konstruktorů.

Destruktory v C++ Y36PJC Třídy a objekty I Volán při zániku instance. Uvolnění prostředků, které objekt vlastnil: dynamicky alokovaná paměť, prostředky OS (soubory, sokety, thready, semafory, mutexy, ...). Není povinný, systém si "domyslí" prázdný destruktor, pokud neexistuje jiný. V ukázkovém příkladu nebyl potřeba.

Instance vytvořené staticky Y36PJC Třídy a objekty I Instance vytvořené staticky void foo1 ( CCplx & x ) { cout << x . Abs (); } void foo2 ( CCplx * x ) cout << x -> Abs (); void foo3 ( void ) CCplx a ( 10, 20 ); // konstruktor CCplx b ( "1 + 2i" ); // konstruktor foo1 ( a ); foo2 ( &a ); cout << a . Re (); // pristup k metode pomoci . } // destruktor a, destruktor b

Instance vytvořené dynamicky Y36PJC Třídy a objekty I Instance vytvořené dynamicky void foo1 ( CCplx * x ) { … cout << x -> Abs (); } void foo2 ( void ) CCplx * a; CCplx * b = new CCplx ( "1 + 2i" ); // konstruktor a = new CCplx ( 10, 20 ); // konstruktor foo1 ( a ); cout << a -> Re (); // pristup k metode pomoci -> delete a; // destruktor a delete b; // destruktor b

Operátory . a -> Y36PJC Třídy a objekty I Oba operátory slouží pro: přístup ke členským proměnným, volání metod. Operátor . se použije pro: práci přímo s instancí, práci s referencí. Operátor -> se použije pro práci s ukazatelem na instanci. Platí: X . foo () <=> (&X) -> foo (); Y -> foo () <=> (*Y) . foo ();

Konstantní metody Y36PJC Třídy a objekty I class CCplx { public: … double Re ( void ) const { return re; } double Im ( void ) { return im; } void Inc ( void ) const {re += 1;} // !! }; CCplx a ( 1, 2 ); const CCplx b ( 3, 4 ); cout << a . Re (); // ok cout << a . Im (); // ok cout << b . Re (); // ok cout << b . Im (); // Im není const

Třídní metody Y36PJC Třídy a objekty I Instanční metoda: spuštěna nad konkrétní instancí, má přístup k jejím členským proměnným. Třídní metoda: spuštěna bez konkrétní instance, má přístup pouze ke svým parametrům a ke globálním proměnným. Deklarace třídní metody – klíčové slovo static. Volání třídní metody – čtyřtečková notace.

Třídní metody Y36PJC Třídy a objekty I class CCplx { public: … static CCplx Add ( const CCplx & a, const CCplx & b ) return CCplx ( a.re + b.re, a.im + b.im ); } }; CCplx u ( 2,3 ), v (4, 5), w; w = CCplx::Add ( u, v );

Třídní proměnné Y36PJC Třídy a objekty I Instanční proměnné: každý objekt má vlastní sadu instančních proměnných, instanční proměnné různých objektů se vzájemně "nevidí". Třídní proměnné: vázané na třídu, v systému existuje právě 1x, bez ohledu na počet aktivních instancí. Deklarace třídní proměnné – klíčové slovo static. Zpřístupnění třídní proměnné – čtyřtečková notace. Využití – hlavně pro tabulky předpočítaných hodnot.

Třídní proměnné Y36PJC Třídy a objekty I // hlavickovy soubor - deklarace class CCplx { public: CCplx (double r, double i); ~CCplx ( void ); … protected: double re, im; static int instCnt; };

Třídní proměnné Y36PJC Třídy a objekty I // soubor .cpp - definice #include "CCplx.h" int CCplx::instCnt = 0; // definice CCplx::CCplx (double r, double i) { re = r; im = i; instCnt ++; } CCplx::~CCplx ( void ) instCnt --; }

Struktury v C Y36PJC Třídy a objekty I Podobné třídám v C++: členské proměnné – složky struktury, neobsahovaly metody, konstruktor a destruktor. Použití: v C docela běžné, základ C++ tříd.

Struktury v C Y36PJC Třídy a objekty I struct TTime { int h, m, s; }; struct TTime a; // C zapis a . h = 12; a . m = 0; a . s = 0;

Unie v C Y36PJC Třídy a objekty I Podobné strukturám: složky unie jsou skládané "přes" sebe, variantní záznam – platí jen jedna z nich, šetří paměť. Příklad: union UAngle { struct int deg, min, sec; } degrees; double radians; };

Unie v C Y36PJC Třídy a objekty I Problém – která složka platí? Informace musí být součástí unie. Vyžaduje další (vnější strukturu - nepraktické). Nepřehledný přístup ke složkám. Řešení třídami a dědičností je zde mnohem přehlednější. Použití – výjimečné, pro volání některých služeb OS (typicky ioctl).

Unie v C Y36PJC Třídy a objekty I struct TAngle { enum { DEG, RAD } eType; union { struct { int deg, min, sec; } degrees; double radians; } uVal; }; struct TAngle x; x . eType = DEG; x . uVal . degrees . deg = 90; …

Třídy jako datové struktury Y36PJC Třídy a objekty I Třídy jako datové struktury Abstraktní datové typy: definované rozhraní pro práci, definované axiómy popisující chování. Příklady: zásobník, fronta, tabulka, prioritní fronta, seznam. Implementace: třída (pro konkrétní datový typ), třída polymorfní, třída generická.

Třídy jako datové struktury Y36PJC Třídy a objekty I Třídy jako datové struktury Příklad – zásobník celých čísel: vznik (konstruktor), zánik (destruktor), vložení (push), čtení z vrcholu (read), čtení a vyzvednutí (pop), test prázdnosti (isEmpty). Operace se promítnou do veřejného rozhraní (metody, konstruktor, destruktor). Vnější svět je izolován od implementace: pole fixní velikosti, pole realokované podle potřeby, spojový seznam.

Zásobník jako třída Y36PJC Třídy a objekty I class CStack { public: CStack ( int maxSize=100 ); ~CStack ( void ); int Push ( int X ); int Read ( int & X ) const; int Pop ( int & X ); int IsEmpty ( void ) const; protected: int dataNr; // first free index int dataMax; // max. size int * data; // dyn. alloc data };

Zásobník jako třída Y36PJC Třídy a objekty I CStack::CStack ( int maxSize ) { dataNr = 0; dataMax = maxSize; data = new int [maxSize]; } CStack::~CStack ( void ) delete [] data; int CStack::Push ( int X ) if ( dataNr >= dataMax ) return ( 0 ); // full - failed data[dataNr++] = X; return ( 1 ); // success

Zásobník jako třída Y36PJC Třídy a objekty I int CStack::Read ( int & X ) const { if ( IsEmpty () ) return ( 0 ); // empty - failed X = data[dataNr - 1]; return ( 1 ); } int CStack::Pop ( int & X ) if ( Read ( X ) ) dataNr --; return ( 0 ); int CStack::IsEmpty ( void ) const { return ( dataNr == 0 ); }

Zásobník jako třída Y36PJC Třídy a objekty I int main ( int argc, char * argv [] ) { CStack x; int y; x . Push ( 10 ); x . Push ( 20 ); x . Push ( 30 ); while ( ! x . IsEmpty () ) x . Pop ( y ); cout << y << endl; } return ( 0 );

Třídy jako datové struktury Y36PJC Třídy a objekty I Třídy jako datové struktury Nevýhoda implementace: shora omezená velikost, struktura se nedokáže přizpůsobit požadavkům. Řešení: realokace pole podle potřeby: režie na kopírování. spojový seznam: režie – správa paměti. kombinace.

Zásobník jako třída Y36PJC Třídy a objekty I class CStack { public: CStack ( void ); ~CStack ( void ); int Push ( int X ); int Read ( int & X ) const; int Pop ( int & X ); int IsEmpty ( void ) const; protected: struct TItem TItem * Next; int Data; }; TItem * top; // linked list

Zásobník jako třída Y36PJC Třídy a objekty I CStack::CStack ( void ) { top = NULL; } CStack::~CStack ( void ) TItem * tmp; while ( top ) tmp = top -> Next; // !! ulozit kopii delete top; top = tmp;

Zásobník jako třída Y36PJC Třídy a objekty I int CStack::Push ( int X ) { TItem * n; n = new TItem; n -> Data = X; n -> Next = top; top = n; return ( 1 ); // success } int CStack::Read ( int & X ) const if ( IsEmpty () ) return ( 0 ); // empty - failed X = top -> Data; return ( 1 );

Zásobník jako třída Y36PJC Třídy a objekty I int CStack::Pop ( int & X ) { if ( Read ( X ) ) TItem * tmp = top -> Next; delete top; top = tmp; return ( 1 ); } return ( 0 ); int CStack::IsEmpty ( void ) const return ( top == NULL );

Zásobník jako třída Y36PJC Třídy a objekty I int main ( int argc, char * argv [] ) { CStack x; int y; x . Push ( 10 ); x . Push ( 20 ); x . Push ( 30 ); while ( ! x . IsEmpty () ) x . Pop ( y ); cout << y << endl; } return ( 0 );

Y36PJC Třídy a objekty I Dotazy... Děkuji za pozornost.