Programování v C++ 1, 5. cvičení

Podobné dokumenty
Programování v C++ 1, 6. cvičení

Programování v C++ 2, 4. cvičení

Programování v C++ 3, 3. cvičení

Programování v C++ 2, 7. cvičení

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Programování v C++ 2, 8. cvičení

PREPROCESOR POKRAČOVÁNÍ

Úvod do programovacích jazyků (Java)

Programování v C++ 1, 1. cvičení

Virtuální metody - polymorfizmus

Chování konstruktorů a destruktorů při dědění

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

PB161 Programování v jazyce C++ Přednáška 4

Více o konstruktorech a destruktorech

Konstruktory a destruktory

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Programování v C++ 1, 17. cvičení

Mělká a hluboká kopie

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Dědění, polymorfismus

Programování v C++ 1, 14. cvičení

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Jazyk C++ I. Polymorfismus

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PB161 Programování v jazyce C++ Přednáška 4

24. listopadu 2013, Brno Připravil: David Procházka

přetížení operátorů (o)

Kolekce, cyklus foreach

PB161 Programování v jazyce C++ Přednáška 9

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Dynamická identifikace typů v C++.

map, multimap - Asociativní pole v C++.

PB161 Programování v jazyce C++ Přednáška 8

Abstraktní třídy, polymorfní struktury

Generické programování

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

PB161 Programování v jazyce C++ Přednáška 3

8 Třídy, objekty, metody, předávání argumentů metod

konstruktory a destruktory (o)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

PB161 Programování v jazyce C++ Přednáška 10

PB161 Programování v jazyce C++ Přednáška 10

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PŘETĚŽOVÁNÍ OPERÁTORŮ

Abstraktní datové typy: zásobník

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

PB161 Programování v jazyce C++ Přednáška 1

Programování v jazyce C a C++

PB161 Programování v jazyce C++ Přednáška 7

PRINCIPY OOP, DĚDIČNOST. PB161 Principy OOP - Zapouzdření

PB161 Programování v jazyce C++ Přednáška 7

Programování v C++, 2. cvičení

Ukazka knihy z internetoveho knihkupectvi

IRAE 07/08 Přednáška č. 1

Vector datový kontejner v C++.

přetížení operátorů (o)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Šablony, kontejnery a iterátory

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

Datové struktury. alg12 1

Programování II. Polymorfismus

typová konverze typová inference

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Jazyk C++ II. Šablony a implementace

Funkční objekty v C++.

Standardní algoritmy vyhledávací.

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

Programování v C++ VI

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

PB161 Programování v jazyce C++ Přednáška 3

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Jazyk C++ I. Šablony 2

Zpracoval:

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

C++ objektově orientovaná nadstavba programovacího jazyka C

PB přednáška (12. října 2015)

Abstraktní datové typy

Dynamika objektů. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze

Dědičnost (inheritance)

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Principy objektově orientovaného programování

PB přednáška (21. září 2015)

20. Projekt Domácí mediotéka

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

PB161 Programování v jazyce C++ Přednáška 2

Programování v C++ 1, 16. cvičení

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

NMIN201 Objektově orientované programování 1 / :36:09

NPRG031 Programování II 1 / :25:46

Programování v Javě I. Leden 2008

Objektové programování

PB161 Programování v jazyce C++ Přednáška 9

Programování v Javě I. Únor 2009

Řetězce. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Transkript:

Programování v C++ 1, 5. cvičení konstruktory, nevirtuální dědění 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019

Přehled 1 2 3

Shrnutí minule procvičené látky spřátelené funkce statické metody a atributy konstruktory význam inicializační část neobjektová implementace zásobníku uložení dat do dynamického pole základní operace vložení na vrchol zásobníku získání hodnoty z vrcholu zásobníku odstranění vrcholu test prázdnosti nevýhody neobjektové implementace

Konstruktor metoda sloužící k inicializaci instance konstruktor nelze volat přímo, volán automaticky při: vytváření instancí v deklaraci nebo pomocí operátoru new předávání parametrů objektového typu hodnotou konverzích jméno konstruktoru stejné jako identifikátor třídy deklarace neobsahuje typ vrácené hodnoty konstruktory se nedědí konstruktor nesmí být virtuální ani statický konstruktor může mít parametry libovolného typu s výjimkou typu své třídy (ale reference na svou třídu parametrem být může => kopírovací konstruktor)

Inicializační část konstruktoru inicializace nestatických atributů předání parametrů konstruktorům předků syntaxe: inicializační_část identifikátor(seznam_výrazů nep ) identifikátor(seznam_výrazů nep ), inicializační_část inicializační část proběhne před vstupem do těla konstruktoru před vstupem do těla také zavolány konstruktory předků inicializace v inicializační části v pořadí, ve kterém jsou složky uvedeny v deklaraci třídy konstantní složky lze nastavit jen v inicializační části

Kopírovací konstruktor jeden z jeho parametrů je reference na danou třídu použije se při předávání parametrů objektového typu hodnotou v deklaracích typu T x = y; (y je typu T) a T x(y); pokud třída kopírovací konstruktor neobsahuje, překladač vytvoří vlastní: neobjektové složky přenese objektové složky okopíruje pomocí jejich kopírovacích konstruktorů veřejně přístupný a vložený takovýto konstruktor vytváří mělkou kopii často potřeba hluboká kopie => vlastní kopírovací konstruktor

Použití kopírovacího konstruktoru 1 class TStack{ 2 int size; 3 int sp; 4 int *d; 5 public: 6 TStack(int); 7 TStack(TStack &); 8 ~TStack(); 9 void push(int value); 10 int top() const; 11 void pop(); 12 bool empty() const; 13 bool full() const; 14 };

Hluboká kopie 1 TStack::TStack(int items) 2 : size(items), sp(-1), d(new int[size]) 3 {} 4 //kopirovaci konstruktor 5 TStack::TStack(TStack &s) 6 :size(s.size), sp(s.sp), d[new int[size]] 7 { 8 //vlastni kopirovani dat 9 for(int i = 0; i <= sp; i++) 10 this->d[i] = s.d[i]; 11 } podobný problém s operátorem =

Implementace dalších metod 1 void TStack::push(int value){ 2 sp++; 3 d[sp] = value; 4 } 5 int TStack::top() const{ 6 return d[sp]; 7 } 8 void TStack::pop(){ 9 sp--; 10 } 11 bool empty() const{ 12 return (sp == -1); 13 } 14 bool full() const{ 15 return (sp == size -1); 16 } opět chybí kontrola chybových situací (vkládání do plného zásobníku, vyjímání z prázdného zásobníku)

Použití zásobníku pro převod do šestnáctkové soustavy 1 void convert(int i, TStack &s){ 2 char digits[16] = {'0', '1', '2', '3', '4', '5', '6', 3 '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; 4 //char digits[17] = "0123456789abcdef"; 5 while(i!= 0){ 6 s.push(digits[i % 16]); 7 i = i / 16; 8 } 9 } 10 void print(int i, TStack &s){ 11 cout << "Cislo " << i << " ma v sestnactkove soustave tvar: "; 12 while(!s.empty()){ 13 cout << s.top(); 14 s.pop(); 15 } 16 cout << endl; 17 } zásobník předáváme do funkcí odkazem!

Dědičnost v C++ vícenásobná dědičnost (potomek má více předků) nevirtuální dědění: předci neobsahují specifikace virtual class identifikátor : seznam_předků{tělo_třídy}; seznam_předků: identifikátor_přístupu nep identifikátor identifikátor_přístupu nep identifikátor, seznam_předků identifikátor přístupu: public, protected, private private: zděděné složky budou v potomkovi soukromé protected: zděděné složky budou v potomkovi chráněné public: zděděné veřejné a chráněné složky budou v potomkovi veřejné a chráněné ve všech případech budou soukromé složky předka v potomkovi nedostupné potomek při nevirtuálním dědění zdědí: všechny atributy svých předků všechny metody s výjimkou konstruktorů, destruktorů (a přetíženého operátoru =)

Poznámka: dědění a skládání Odvodit úsečku od bodu zděděním? Příklad: ne úsečka není speciální případ bodu úsečka má dva body relace is a relace has a 1 class Usecka{ 2 public: 3 //seznam verejnych polozek 4 private: 5 A, B: Bod; 6 };

Příklad: studenti a zaměstnanci 1 class Osoba{ 2 public: 3 Osoba(std::string, std::string, int); 4 void tisk(); 5 private: 6 std::string jmeno, prijmeni; int id; 7 }; 8 class Student : public Osoba{ 9 public: 10 Student(std::string, std::string, int, int); 11 int pocetkreditu() const{return kredity;} 12 private: 13 int kredity; 14 };

Implementace metod 1 Osoba::Osoba(string jm, string prij, int i) 2 : jmeno(jm), prijmeni(prij), id(i) 3 {} 4 5 void Osoba::tisk(){ 6 cout << jmeno << " " << prijmeni << endl; 7 } 8 9 Student::Student(string jm, string prij, 10 int i, int kr) 11 : Osoba(jm, prij, i), kredity(kr) 12 {}

Třída std::string hlavičkový soubor string pro práci s posloupností znaků přístup ke znaku pomocí operátoru [] některé metody: length: vrátí délku řetězce empty: testuje, zda je řetězec prázdný substr: vytvoří podřetězec append: připojí řetězec na konec řetězce lze použít přetížený operátor += compare: porovná řetězce find: vyhledává v podřetězci c_str: vrátí data jako const char* lze použít s proudy std::cin a std::cout

Základní pravidlo dědičnosti Potomek může zastoupit předka 1 void poslizpravu(osoba o, string zprava){ 2 cout << "Posilam zpravu " << zprava << endl; 3 cout << "Prijemce: "; o.tisk(); 4 } 5 int main(){ 6 string jmeno, prijmeni; 7 cout << "Zadejte jmeno a prijmeni: " << endl; 8 cin >> jmeno >> prijmeni; 9 Student s(jmeno, prijmeni, 42, 10); 10 poslizpravu(s, "Test"); 11 return 0; 12 }

Závěr konstruktory význam inicializační část kopírovací konstruktor příklad: objektová implementace zásobníku využití pro převod do šestnáctkové soustavy nevirtuální dědění přístup ke zděděným složkám dědění a skládání potomek může zastoupit předka třída string