Programování v C++ 2, 4. cvičení statické atributy a metody, konstruktory 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019
Přehled Přístupová práva 1 Přístupová práva 2 3
Shrnutí minule procvičené látky úvod do objektově orientovaného programování třída, objekt metody, atributy základní vlastnosti zapouzdření specifikace přístupu přístupové metody dědičnost mnohotvárnost
Opakování: přístupová práva tělo třídy rozděleno do sekcí uvozených specifikací přístupu: public položky veřejné sekce přístupné odkudkoliv private položky soukromé sekce dostupné jen v rámci třídy, ve které byly deklarovány protected položky chráněné sekce dostupné jen v rámci třídy, ve které byly deklarovány, a jejích potomcích spřátelené funkce deklarace friend friend prototyp_funkce; friend definiční_deklarace_funkce spřátelené funkce nejsou metodami třídy, ale mají při přístupu ke složkám dané třídy stejná práva jako metody mohou přistupovat k soukromým i chráněným položkám
Příklad spřátelené funkce 1 class TVektor{ 2 public: 3 TVektor(); 4 TVektor(float, float); 5 void nastavx(float x0){x = x0;} 6 void nastavy(float y0){y = y0;} 7 friend float delka(tvektor v){ 8 return sqrt(v.x*v.x+v.y*v.y); 9 } 10 private: 11 float x, y; 12 };
Přehled Přístupová práva 1 Přístupová práva 2 3
Statické metody a atributy třídní metody a atributy pamět ová třída static statické atributy společné pro všechny instance dané třídy globální proměnná ukrytá v těle třídy statické atributy lze použít mimo třídu (pokud to povolí přístupová práva) kvalifikace jménem instance (.) nebo třídy (::) definiční deklarace za deklarací třídy statické metody nevztahují se k žádné konkrétní instanci nemohou používat nestatické atributy a nestatické metody
Příklad použití Přístupová práva 1 //TVektor.h 2 class TVektor{ 3 public: 4 TVektor(); 5 static int Pocet(); 6 private: 7 float x, y; 8 static int pocet; 9 }; 10 //TVektor.cpp 11 int TVektor::pocet = 0; //definicni deklarace 12 TVektor::TVektor(){ x = 0; y = 0; pocet++} 13 int TVektor::Pocet(){ return pocet; }
Přehled Přístupová práva 1 Přístupová práva 2 3
Konstruktor Přístupová práva 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
Příklady Přístupová práva 1 konstruktor bez parametrů 1 TVektor::TVektor() 2 : x(0), y(0) 3 { 4 pocet++; //zvetsi pocet instanci 5 } 2 konstruktor se dvěma parametry 1 TVektor::TVektor(float x0, float y0) 2 : x(x0), y(y0) 3 { 4 pocet++; //zvetsi pocet instanci 5 }
Zásobník Přístupová práva datová struktura typu LIFO: last in, first out data se vkládají na jedné straně (vrchol zásobníku, stack pointer) a z té stejné strany se odebírají základní operace 1 push vložení dat na vrchol zásobníku 2 top získání dat z vrcholu zásobníku 3 pop odstranění vrcholu 4 empty test prázdnosti 5 full test plnosti jako podkladová datová struktura lze použít pole nebo spojový seznam součást standardní šablonové knihovny (šablona stack) role zásobníku v přidělování paměti
Vytvoření a zrušení zásobníku definice typu 1 typedef int Data; 2 struct Stack{ 3 int size; 4 int sp; //stack pointer 5 Data *data; 6 }; v neobjektovém přístupu nejsou konstruktory a destruktory 1 void create(stack &s, int n){ 2 s.size = n; 3 s.sp = -1; 4 s.data = new Data[s.size]; 5 } 6 void destroy(stack &s){ 7 delete [] s.data; 8 s.data = nullptr; 9 } ]
Implementace základních operací 1 void push(stack &s, Data &d){ 2 s.sp++; 3 s.data[s.sp] = d; 4 } 5 6 Data top(stack &s){ 7 return s.data[s.sp]; 8 } 9 10 void pop(stack &s){ 11 s.sp--; 12 } kontroly plnosti/prázdnosti před vložením/odebráním prvku ošetření pomocí výjimek
Nevýhody neobjektové implementace funkce nejsou součástí struktury stack nutno přidávat zásobník jako parametr nutno volat funkce create a destroy chybí zapouzdření možnost přistupovat i mimo vrchol zásobníku možnost posunovat index na vrchol možnost uvolnit pole vůbec nejsou zabezpečená data snaha přistupovat k datům pouze pomocí funkcí (v objektovém přístupu pomocí metod)
Závěr Přístupová práva 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