BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod Ú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 2.7. Automatické vkládání funkcí
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; }
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.
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";
KONSTRUKTOR S PARAMETRY Konstruktor 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 parametrem moje_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
Implicitní konstruktor. 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čem konstruktor implicitní, který - nemá parametry - je vložený ( in-line ) - je veřejně přístupný
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 {
Konstruktor, destruktor a dědění. ZPŮSOBY DĚDĚNÍ. Možnosti dědící třídy jsou jednoznačně určeny specifikátory - public - private - protected Příklad: Dědění se specifikátorem public. public říká překladači, že třída bude děděna tak,že 1) všechny veřejné členy základní třídy budou rovněž veřejnými členy odvozené třídy 2)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ů.
class A{ public: { A(){ cout<<"A";} ~A(){ cout<<"A";} }; class B:public A{ B(){ cout<<"B";} ~B(){ cout<<"B";} class C:public A{ C(){ cout<<"C";} ~C(){ cout<<"C";} class D: public B,public C{ D(){ cout<<"D"<<endl; } ~D(){ cout<<"D"; } int main() { D d; system("PAUSE"); return 0; } pořadí konstruktorů AB AC D pořadí destruktorů D CA BA
UKAZATELÉ OBJEKTU Zpří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 objekt cout << objekt . vypis() << "\n"; cout<<p_objekt -> vypis()<<"\n";
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ímco složky tříd, pro které nejsou specifikována přístupová práva jsou implicitně soukromé ( private ).
Porovnání unie ( union ) a třídy ( class ). V C++ byla definice unie rozšířena. Může obsahovat data i 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 bylo v 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];
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á.
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 vzorek Kompaktní 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 definice konstruktoru a destruktoru.