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

Standardní knihovní funkce pro práci s textovými řetězci
(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í
1 Vnitřní řazení s využitím dynamických struktur Tvorba spojového seznamu je vcelku triviální záležitostí: a)Vytvořím prázdný seznam příkazem LIST:=nil.
Spojové struktury Spojová struktura ( linked structure ):
Pole, ukazatele a odkazy
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.
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.
Č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.
C# - struktury, výčtové typy, pole
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
OSNOVA: a) Řetězce v C b) Funkce stdio.h pro řetězce c) Funkce string.h pro řetězce d) Příklad Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače.
PB161 Jmenné prostory, I/O proudy PB161 | Jmenné prostory, IO proudy PB161 – Programování v jazyce C++ Objektově Orientované Programování.
Seminář C cvičení STL, Trolltech Ing. Jan Mikulka.
Dynamická alokace, polymorfismus
Jedenácté cvičení Vlákna. Java cv112 Vlákna Operační systém Mutitasking – více úloh se v operačním programu vykonává „současně“ Java Multithreading -
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í.
Memento. Obnovení operačního systému ( Windows | Linux...) Všichni víme, co jsou transekce v databázi Memento – zálohování databáze.
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í.
C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
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.
Netrvaloppa21 Vytvořte třídu Student pro reprezentaci struktury student na ZČU. Atributy třídy budou fakulta a osobniCislo. Název třídy: Student proměnné.
STRING A UKAZATELE. Co to je řetězec? Řetězec v Javě je samostatný objekt. Je konstantní, co znamená, že jednou vytvořený řetězec nelze změnit. Chceme-li.
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.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
PROGRAMOVÁNÍ 3ITA,3ITB Jaroslav Burdys Hlavní zdroj:
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
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í.
Y36PJC Programování v jazyce C/C++
Programování ENUM, SWITCH,pole jednorozměrná a vícerozměrná, deklarace, inicializace, kopírování, porovnání Erik Král.
Programovací jazyk C++
Programování v jazyce C++
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
Programování 2. hodina RNDr. Jan Lánský, Ph.D.
Návrhový vzor Flyweight
Programování v jazyce C++
Abstraktní datové typy
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.
Oblast platnosti identifikátoru (1)
C# přehled vlastností.
Transkript prezentace:

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

Dnešní přednáška Y36PJC Třídy a objekty II Více o konstruktorech: implicitní konstruktor, inicializace členských proměnných, kopírující konstruktor, konstruktory uživatelské konverze. Třídy jako datové typy: zásobník, fronta.

Minulá přednáška Y36PJC Třídy a objekty II 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.

Konstruktory Y36PJC Třídy a objekty II Volán automaticky při vytváření nové instance. Rozlišení konstruktoru – pravidla přetěžování funkcí. Speciální typy konstruktorů: implicitní, kopírující, uživatelské konverze. Volány systémem, pokud instance vzniká za specifických okolností.

Implicitní konstruktor Y36PJC Třídy a objekty II Implicitní konstruktor Konstruktor volatelný bez parametrů: nemá žádné formální parametry, nebo má pro všechny parametry implicitní hodnoty. Použit, pokud instance vzniká a parametry nejsou k dispozici (pole objektů, členská proměnná jiného objektu). Vygenerován systémem automaticky, pokud: má vzniknout instance a ve třídě neexistuje žádný jiný konstruktor. Vygenerovaný implicitní konstruktor: volá implicitní konstruktory staticky alokovaných členských proměnných – objektů, ostatní členské proměnné nechá neinicializované.

Implicitní konstruktor Y36PJC Třídy a objekty II Implicitní konstruktor class CFoo { … }; CFoo * array = new CFoo [100]; // celkem se vola 100 x implicitni konstruktor, // pro každý prvek pole 1x … delete [] array; // vola 100x destruktor // ---------------------------- CFoo * array2 = new CFoo [100]; delete array2; // bez [] by se destruktor pouze 1x pro prvni objekt

Implicitní konstruktor Y36PJC Třídy a objekty II Implicitní konstruktor class CFoo { … CFoo ( int x = 20 ) { … } //impl. konstruktor CFoo }; class CBar { CFoo Stat; CFoo * Dyn; CBar :: CBar ( int x ); CBar::CBar ( int x ) { // zde se vola impl konstruktor pro Stat Dyn = new CFoo ( 20 ); }

Implicitní konstruktor Y36PJC Třídy a objekty II Implicitní konstruktor class CFoo { … CFoo ( int x ) { … } // konstruktor CFoo, ne impl. }; class CBar { CFoo Stat; CFoo * Dyn; CBar :: CBar ( int x ); CBar::CBar ( int x ) { // zde se ma volat impl. konstruktor pro Stat, // neexituje, nedoplni se automaticky -> chyba Dyn = new CFoo ( 20 ); }

Implicitní konstruktor Y36PJC Třídy a objekty II Implicitní konstruktor class CFoo { … CFoo ( int x ) { … } // konstruktor CFoo, ne impl. }; class CBar { CFoo Stat; CFoo * Dyn; CBar :: CBar ( int x ); CBar::CBar ( int x ) : Stat ( 10 ) Dyn = new CFoo ( 20 ); }

Implicitní konstruktor a Java Y36PJC Třídy a objekty II Implicitní konstruktor a Java Existuje v Javě implicitní konstruktor? Java vytváří instance pouze dynamicky, Java neumí alokovat pole objektů. V Javě není implicitní konstruktor třeba. Toto je pole objektů: string * array = new string [100]; // C++ Toto není v Javě pole objektů, ale pole referencí: String array [] = new String [100]; // Java Poli Java referencí odpovídá C++ deklarace: string ** array = new string [100]; // C++

Kopírující konstruktor Y36PJC Třídy a objekty II Kopírující konstruktor Konstruktor, který má parametrem konstantní referenci na instanci své třídy. Volán pokud: vzniká nová instance, instance vzniká jako kopie existující instance. Vygenerován automaticky, pokud ve třídě neexistuje. Vygenerovaný kopírující konstuktor: vytvoří kopie staticky alokovaných členských proměnných – objektů voláním jejich kopírujících konstruktorů, ostatní členské proměnné zkopíruje binárně.

Kopírující konstruktor Y36PJC Třídy a objekty II Kopírující konstruktor class CFoo { … }; void foo1 ( CFoo a ) { … } void foo2 ( CFoo & a ) { … } void foo3 ( CFoo * a ) { … } CFoo x; CFoo y (x); // volan copy konstruktor CFoo z = x; // volan copy konstruktor foo1 ( x ); // volan copy konstruktor foo2 ( x ); // neni volan zadny konstruktor foo3 ( &x ); // neni volan zadny konstruktor CFoo a = x; // volan copy konstruktor z = x; // neni volan copy konstruktor, ale // operator = (pozdeji)

Kopírující konstruktor Y36PJC Třídy a objekty II Kopírující konstruktor Kdy automaticky generovaný kopírující konstruktor nestačí? Obsahuje-li instance dynamicky alokovaná data, prostředky OS (soubory, sockety, semafory, thready, mutexy, ...), využíváme-li techniku počítaných referencí (bude vysvětleno později). "Pravidlo" pro návrh tříd – následující rozhraní mívají třídy buď celé nebo vůbec: kopírující konstuktor, přetížený operátor =, destruktor.

Kopírující konstruktor Y36PJC Třídy a objekty II Kopírující konstruktor class CFoo { char * str; int len; public: CFoo ( const char * str = "" ) len = strlen ( str ); this -> str = new char [len + 1]; strncpy ( this -> str, str, len + 1 ); } ~CFoo ( void ) { delete [] str; } const char * GetStr ( void ) const { return str; }

Kopírující konstruktor Y36PJC Třídy a objekty II Kopírující konstruktor void SetChar ( int idx, char c ) { if ( idx >= 0 && idx < len ) str[idx] = c; } }; void f ( void ) { CFoo a ( "test" ), b ( "test" ); a . SetChar ( 2, 'z' ); b . SetChar ( 3, 'u' ); cout << a . GetStr () << " " << b . GetStr (); }

Kopírující konstruktor Y36PJC Třídy a objekty II Kopírující konstruktor void g ( void ) { CFoo a ( "test" ); CFoo b = a; a . SetChar ( 2, 'z' ); b . SetChar ( 3, 'u' ); cout << a . GetStr () << " " << b . GetStr (); }

Kopírující konstruktor Y36PJC Třídy a objekty II Kopírující konstruktor mělká kopie 1234 1234 test a 4 1234 b 4

Kopírující konstruktor Y36PJC Třídy a objekty II Kopírující konstruktor class CFoo { char * str; int len; public: … CFoo ( const CFoo & src ) len = src . len; str = new char [len + 1]; strncpy ( this -> str, src . str, len + 1 ); } };

Kopírující konstruktor Y36PJC Třídy a objekty II Kopírující konstruktor hluboká kopie a 1234 1234 test 4 b 5678 5678 test 4

Kopírující konstruktor a rychlost Y36PJC Třídy a objekty II Kopírující konstruktor a rychlost Kopírující konstruktor stojí mnoho času: pokud je instance velká, pokud je instance složitá (např. kopie stromu). Místo předávání objektů hodnotou: class CFoo { … }; void Bar ( CFoo x ) { … } Je rychlejší předávat pouze referenci či ukazatel (pokud objekt ve funkci Bar neměníme): void Bar ( CFoo & x ) { … } Ještě lepší je předávat konstantní referenci či ukazatel (kompilátor kontroluje, že objekt skutečně nezměníme): void Bar ( const CFoo & x ) { … }

Kopírující konstruktor a Java Y36PJC Třídy a objekty II Kopírující konstruktor a Java Má Java kopírující konstruktor? Problém #1 – uvolnění paměti: garbage collector počítá reference, paměť nikdy není uvolňovaná 2x (vícekrát). Problém #2 – sdílení dat: nepracuje se přímo s objekty, objekty jsou přístupné přes reference, je samozřejmé, že reference na týž objekt sdílí data. Je-li třeba vytvořit kopii objektu v Javě: interface java.lang.Cloneable, metoda java.lang.Object.clone.

Přímé volání konstruktoru Y36PJC Třídy a objekty II Přímé volání konstruktoru Konstruktor je volaný při vzniku instance automaticky: součást volání operátoru new, volán systémem při vytváření statické instance. Konstruktor lze zavolat explicitně: vytvoří se nová instance, instance se použije (zkopíruje, předá při volání, ...), nakonec instance automaticky zaniká. Využití – pro konverze mezi objektovými typy. class CFoo { … }; void foo ( CFoo x ) { … } foo ( CFoo ( 10 ) ); foo ( * new CFoo ( 10 ) ); // !! chyba – jak delete

Konstruktor uživatelské konverze Y36PJC Třídy a objekty II Konstruktor uživatelské konverze Konstruktor volatelný s jedním parametrem: má právě jeden parametr, má více parametrů, ale druhý (a všechny další) parametry mají implicitní hodnoty. Má-li konstruktor tvar: T ( T1 x ); Pak se konstruktor uživatelské konverze bude automaticky volat tam, kde je očekávána instance typu T a skutečnou hodnotou je parametr typu T1.

Konstruktor uživatelské konverze Y36PJC Třídy a objekty II Konstruktor uživatelské konverze class CFoo { public: … CFoo ( int x ) { … } }; void foo1 ( CFoo a ) { … } void foo2 ( CFoo & a ) { … } void foo3 ( const CFoo & a ) { … } CFoo a(1); CFoo b = 10; // CFoo b = CFoo ( 10 ) foo1 ( 5 ); // foo1 ( CFoo ( 5 ) ); foo2 ( 10 ); // chyba foo3 ( 20 ); // foo3 ( CFoo ( 20 ) );

Konstruktor uživatelské konverze Y36PJC Třídy a objekty II Konstruktor uživatelské konverze Uživatelská konverze – potenciální zdroj chyb: méně přehledný kód, problémy při přetěžování. Automaticky vkládanou uživatelskou konverzi lze u konstruktoru potlačit: klíčové slovo explicit, konverzi lze stále použít, je potřeba volání konstruktoru celé vypsat.

Konstruktor uživatelské konverze Y36PJC Třídy a objekty II Konstruktor uživatelské konverze class CFoo { public: … explicit CFoo ( int x ) { … } }; void foo1 ( CFoo a ) { … } void foo2 ( const CFoo & a ) { … } CFoo a(1); CFoo b = 10; // chyba CFoo c = CFoo ( 10 ); // ok, ale neefektivni foo1 ( 20 ); // chyba foo1 ( CFoo ( 20 ) ); // ok foo2 ( CFoo ( 20 ) ); // ok

Třídy a datové struktury Y36PJC Třídy a objekty II Třídy a datové struktury Datové struktury často dynamicky alokují paměť: vybavení destruktorem, kopírující konstruktor, přetížený operátor = (příští přednášku). Příklad z minulé hodiny (zásobník): doplnění kopírujícího konstruktoru pro realizaci polem, doplnění kopírujícího konstruktoru pro realizaci spojovým seznamem.

Třídy a datové struktury Y36PJC Třídy a objekty II Třídy a datové struktury class CStack { … int dataNr; // first free index int dataMax; // max. size int * data; // dyn. alloc data }; CStack::CStack ( const CStack & src ) { int i; dataNr = src . dataNr; dataMax = src . dataMax; data = new int [dataMax]; // deep copy for ( i = 0; i < dataNr; i ++ ) data[i] = src . data[i]; }

Třídy a datové struktury Y36PJC Třídy a objekty II Třídy a datové struktury CStack x; int y; x . Push ( 10 ); x . Push ( 20 ); x . Push ( 30 ); CStack z = x; x . Pop ( y ); x . Push ( 50 ); cout << "Stack x" << endl; while ( ! x . IsEmpty () ) { x . Pop ( y ); cout << y << endl; } cout << "Stack z" << endl; while ( ! z . IsEmpty () ) { z . Pop ( y ); cout << y << endl; }

Třídy a datové struktury Y36PJC Třídy a objekty II Třídy a datové struktury class CStack { … struct TItem { TItem * Next; int Data; }; TItem * top; // linked list

Třídy a datové struktury Y36PJC Třídy a objekty II Třídy a datové struktury CStack::CStack ( const CStack & src ) { TItem * n, *prev = NULL, *tmp; // tmp prochazi zdrojovy spoj. seznam. // prev ukazuje na poslední vlozeny prvek // vytvareneho seznamu. for ( tmp = src . top; tmp; tmp = tmp -> Next ) n = new TItem; n -> Data = tmp -> Data; if ( prev )prev -> Next = n; else top = n; prev = n; } if ( prev ) prev -> Next = NULL; else top = NULL; // ukoncit vytvareny seznam.

Třídy a datové struktury Y36PJC Třídy a objekty II Třídy a datové struktury CStack::CStack ( const CStack & src ) // alternativa { TItem * n, **wr = &top, *tmp; // tmp prochazi zdrojovy spoj. seznam. // wr ukazuje na misto, kam ma byt zapsana adresa // nove pridavaneho prvku vytvareneho spojoveho // seznamu for ( tmp = src . top; tmp; tmp = tmp -> Next ) n = new TItem; n -> Data = tmp -> Data; *wr = n; wr = &n -> Next; } *wr = NULL; // ukoncit vytvareny seznam.

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