Úvod do c++ 2

15
ÚVOD DO C++ 2 BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod

Upload: kevin-donovan

Post on 01-Jan-2016

38 views

Category:

Documents


1 download

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 Presentation

TRANSCRIPT

Page 1: ÚVOD DO C++ 2

ÚVOD DO C++ 2

BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod

Page 2: ÚVOD DO C++ 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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.