Úvod do c++ 2
DESCRIPTION
ÚVOD DO C++ 2. BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod. 2. BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod 2.1. Funkce - konstruktor a destruktor 2.2. Konstruktor s parametrem 2.3. Dědičnost - základ 2.4. Ukazatel objektu 2.5. Třídy, struktury, unie, porovnání 2.6. Vložené ( in-line ) funkce - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/1.jpg)
ÚVOD DO C++ 2
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
![Page 2: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/2.jpg)
2. BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod2.1. Funkce - konstruktor a destruktor2.2. Konstruktor s parametrem2.3. Dědičnost - základ2.4. Ukazatel objektu2.5. Třídy, struktury, unie, porovnání2.6. Vložené ( in-line ) funkce2.7. Automatické vkládání funkcí
![Page 3: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/3.jpg)
Funkce KONSTRUKTOR a DESTRUKTOR.
Konstruktor třídy je volán vždy, když je vytvářen objekt dané třídy.Všechny proměnné při instanci objektových typů by měly být ihned inicializovány.Konstruktor má : stejné jméno jako třída, které je součástí nemá : návratový typ
Třída může mít více konstruktorů, které se liší seznamem parametrů.( viz přetížení funkce )Příklad konstruktoru bez parametrů:
class moje_trida { int a;public: moje_trida( ); // implicitní konstruktor, nemá parametry void ukaz(); // členská funkce} ;definice konstruktoru třídy :moje_trida:: moje_trida( ) { a=10; }
![Page 4: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/4.jpg)
DESTRUKTOR je komplementárním doplňkem konstruktoru.Tato funkce je volána vždy, když je objekt rušen.S rušením objektu bývají prováděny určité, specifickéakce, např. uvolnění paměti přidělené dynamickou alokací atd.Destruktor má : - stejné jméno jako třída, které je součástí - jméno uvozeno znakem ~ nemá : - návratový typ - nesmí mít parametry Třída může mít pouze jeden destruktor.
Konstruktor i destruktor mohou provádět jakýkoliv typ operace, avšak obvykle se této možnosti nevyužívá. Obsahují zpravidla pouze operace, které mají přímý vztah k inicializaci nebo k rušení objektu.
![Page 5: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/5.jpg)
Příklad :#include<iostream>using namespace std;//...................................................Deklarace třidy:class moje_trida { int a;public: moje_trida(); //………………… konstruktor~moje_trida(); //………………….destruktor void ukaz();};//......Definice konstruktoru :moje_trida::moje_trida(){ cout<< "Inicializace konstruktorem a = 10 "; a = 10;}
//.......Definice destruktoru :moje_trida::~moje_trida(){ cout<<"Ruseni...... \n";}
![Page 6: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/6.jpg)
KONSTRUKTOR S PARAMETRYKonstruktor lze doplnit parametry a tyto parametry použít k inicializaci privátních datových členů deklarovaného objektu.( viz OOP)Příklad:class moje_trida { int a; // implicitně privátní proměnná public: moje_trida ( int x); // deklarace konstruktoru s parametrem void zobraz( ); // členská funkce ( metoda )} ;//…………………………………. definice konstruktoru s parametremmoje_trida::moje_trida( int x ){a = x ;}// ………………………………… definice metody:void moje_trida:: zobraz(){ cout << a << "\n";}Int main (){ moje_trida objekt( 4 ); // parametr pro konstruktor
![Page 7: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/7.jpg)
Zápis konstruktoru s parametrem pomocí inicializační části konstruktoru.Syntaxe:Inicializační část se zapisuje za hlavičku konstruktoru a je od ní oddělena dvojtečkou. Potom nasleduje zápis identifikátorů datových složek, za kterými jsou v závorkách uvedeny jejich inicializační hodnoty. Příklad:class moje_trida{ int a; public: moje_trida ( int x); // deklarace konstruktoru s parametrem void zobraz();};
//definice konstruktoru s parametrem, tělo konstruktoru je prázdné: moje_trida::moje_trida( int x ) : a( x ) { }
Implicitní konstruktor.V případě, že není deklarován ve třídě žádný konstruktor, je vytvořen překladačemkonstruktor implicitní, který - nemá parametry - je vložený ( in-line ) - je veřejně přístupný
![Page 8: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/8.jpg)
DĚDIČNOST - úvod.Dědičnost umožňuje - aby jedna třída zdědila vlastnosti jiné třídy. - hierarchické vytváření tříd s trendem od obecnosti ( bázová třída, předek, rodičovské třída ) až po třídy zahrnující nové, zcela specifické vlastnosti. ( odvozené třídy )Způsob děděníje dán uvedením specifikátoru přístupového práva ( specifikátor přístupu ).Specifikuje přístupová práva odvozené třídy k děděným členům základní třídy nebo třídám.( při vícenásobném dědění ).Syntaxe dědění základní třídy:
class jméno _odvozené_Třídy :specifikátor_přístupu jméno_základní_Třídy { ............................ členové odvozené třídy; ...........................} ;Příklad jednoduchého dědění:class Odvozena : public Zakladni { členové odvozené třídy;} ;
![Page 9: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/9.jpg)
ZPŮSOBY DĚDĚNÍ.
Možnosti dědící třídy jsou jednoznačně určeny specifikátory - public - private - protectedPříklad:Dědění se specifikátorem public.public říká překladači, že třída bude děděna tak,že1) všechny veřejné členy základní třídy budou rovněž veřejnými členy odvozenétřídy2)všechny privátní členy základní třídy zůstanou jejími privátními členy a nebudou přímo dosažitelné členy odvozené třídy.Dosažitelné budou pouze pomocí metod zakladni třídy
Konstruktor, destruktor a dědění.Při vytváření instance odvozené třídy jsou nejprve vytvořeny zděděné podobjekty.Před konstruktory odvozených tříd jsou volány konstruktory předků.
![Page 10: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/10.jpg)
class A{public:{
A(){ cout<<"A";} ~A(){ cout<<"A";}};
class B:public A{ public: B(){ cout<<"B";} ~B(){ cout<<"B";}};
class C:public A{public: C(){ cout<<"C";} ~C(){ cout<<"C";}};class D: public B,public C{public:
D(){ cout<<"D"<<endl; } ~D(){ cout<<"D"; }};
int main(){
D d; system("PAUSE");
return 0;}pořadí konstruktorů AB AC Dpořadí destruktorů D CA BA
![Page 11: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/11.jpg)
UKAZATELÉ OBJEKTUZpřístupnění členů objektu lze provést dvojím způsobem, 1) pomocí tečkového operátoru ( . ) když pracujeme přímo s objektem nebo 2) pomocí šipkového operátoru ( -> )když přistupujeme k členům objektu pomocí ukazatele na objekt ( t.j. pomocí adresy objektu ).K získání adresy objektu používáme adresní operátor &. class Moje_trida { int a;public: Moje_trida( int x); //konstruktor int vypis();};int main(){Moje_trida objekt(120) ;Moje_trida *p_objekt; /* vytváří ukazatel na objekt p_objekt = & objekt ; //p_objekt nyní ukazuje na objektcout << objekt . vypis() << "\n";cout<<p_objekt -> vypis()<<"\n";
![Page 12: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/12.jpg)
TŘÍDY, STRUKTURY, UNIE - porovnání.V C++ byla definice struktury rozšířena. Může zahrnovat - členské funkce, - konstruktory, -destruktory stejně jako třída.
Rozšířená syntaxe struktury:struct jméno_typu { // veřejné funkce a datové členy private: // privátní funkce a datové členy} seznam_objektů;
Jediný rozdíl mezi třídou a strukturou :složky struktury, pro které nejsou specifikována přístupová práva, jsou implicitně věřejné ( public ), zatímcosložky tříd, pro které nejsou specifikována přístupová práva jsou implicitně soukromé ( private ).
![Page 13: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/13.jpg)
Porovnání unie ( union ) a třídy ( class ).V C++ byla definice unie rozšířena. Může obsahovat datai funkce.Pokud pro složky unie nespecifikujeme přístupová práva, budou stejně jako u struktury veřejně přístupné.Členové unie sdílejí stejnou oblast paměti jako tomu bylov jazyku C. V C++ existují speciální unie, tzv. anonymní unie.Anonymní unie nemá jméno, sděluje pouze překladači, že jejími členy bude sdílena stejná oblast paměti.Jsou dosažitelné přímo, bez tečkového operátoru.int main(){ union { //Anomymní unie - chybí jméno int i; char znak[5]; }; // end anonymní unie znak[0] = 'A'; i = 4; // přímý přístup k i v unii cout << "i = " << i << "znak[0]= " << znak[0];
![Page 14: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/14.jpg)
VKLÁDANÍ FUNKCÍ ( in-line fce ).In-line fce je obdobou makra v jazyku C.Výhoda - spočívá ve vkládání této fukce do místa jejího volání. Tím se ušetří čas spojený s voláním funkce a program je rychlejší.. Nevýhoda - jsou-li fce velké a volány příliš často, program se výrazně zvětší. Před definici vkládané funkce je nutné vložit specifikátor inline Příklad in-line členské funkce:class vzorek{int i, j;public:vzorek(int a, int b); int delitelny(); // in-line fce}; // konec tridy vzorek//Definice in-line fce, zde je specifikátor inline:inline int vzorek::delitelny(){ return !(i%j); // dělitelné,vrací negaci, tj. 1}int main(){…………..Vkládaná funkce může být i přetížená.
![Page 15: ÚVOD DO C++ 2](https://reader036.vdocuments.pub/reader036/viewer/2022072016/56813256550346895d98e155/html5/thumbnails/15.jpg)
AUTOMATICKÉ VKLÁDÁNÍ ( in-lining )
Jestliže je definice členské funkce dostatečně krátká, může být zahrnuta přímo do deklarace třídy.Tím se automaticky stane in-line funkcí, je-li to možné.Je-li fce definována uvnitř deklarace třídy, nemusí se uvádět označeníinline.Bude-li použito, není to chyba.
Příklad:class vzorek{int i, j;public://konstruktor přebirající parametry: vzorek(int a, int b);Členská funkce je zde přímo definovaná a proto se stane automaticky in-line fcí int delitelny() { return !( i%j ); }}; // konec tridy vzorekKompaktní a standardní způsob zápisu in-line fce. Kompaktní tvar je jednořádkový zápis fce.Vtlačovací styl je víceřádkový zápis fce.Nejběžnější použití pro in-line funkce definované v rámci třídy je definicekonstruktoru a destruktoru.