Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Programování v jazyce C++
Přetěžování operátorů
2
Opakování princip dědičnosti, nastavení přístupových práv,
konstruktory a destruktory odvozených tříd, virtuální dědičnost, polymorfismus, časná vs. pozdní vazba, virtuální metody,
3
Abstraktní třídy slouží pro implementaci obecného předka dalších tříd,
některé metody takovéhoto předka nemá smysl definovat: takováto metoda je označena jako virtuální a místo těla má řetězec "=0;", takováto metoda se nazývá čistě virtuální, nesmí být vytvořena instance abstraktní třídy, pointer nebo reference však ano.
4
Třídní ukazatele v C++ je možno získat adresu na libovolnou složku i metodu, k tomu slouží třídní ukazatele, int trida::*slozka; int (trida::*metoda)(parametry); dereference je možná vzhledem ke konkrétní instanci, k přístupu ke složkám a metodám se pak používají operátory .* a ->*.
5
Statické datové položky třídy
je-li datová položka statická, pak je společná pro všechny instance třídy, existuje i před vznikem první a zánikem poslední instance, mimo třídu je lze kvantifikovat názvem třídy nebo názvem libovolné instance, pro třídu používáme operátor ::, pro instance operátor . nebo ->,
6
Statické metody mohou být volány bez odkazu na konkrétní instanci,
možnost jejich použití opět není vázána na existenci instance, obecně smí použít pouze statická data: chci-li používat nestatická, musím danou instanci předat jako parametr, neexistuje v nich identifikátor this.
7
Možnosti přetěžování operátorů
nelze změnit prioritu, asociativitu, počet operátorů a způsob zápisu, nelze definovat nové operátory, nelze definovat implicitní hodnoty parametrů, nelze změnit význam pro standardní typy, není předepsán typ vrácené hodnoty ani parametrů, jednotlivé verze musí být rozlišitelné podle operandů.
8
Co lze či nelze přetížit
., .*, ::, ?:, sizeof, #, ##, static_cast, dynamic_cast, reinterpret_cast, const_cast =, (), [], -> a (typ) lze přetěžovat pouze jako nestatické, new a delete lze přetěžovat podle zvláštních pravidel, ostatní operátory je možné přetěžovat libovolně.
9
Principy přetěžování operátorů
přetížení operátoru + spočívá v definici funkce či metody operator+(), podobně pro ostatní operátory, operátory lze přetěžovat jako metody nebo jako funkce s minimálně jedním operandem, přetížený binární operátor + můžeme volat zápisy: c = a + b; c = operator+ (a, b);
10
Polymorfismus definujeme-li operátor jako metodu, pak je polymorfní vzhledem k levému operandu, polymorfismus dle pravého operandu se dá zařídit pomocí přetížení: někdy příliš komplikované, druhou možností je vytvořit operátor pro společného předka tak, aby volal virtuální metodu pravého operátoru, která zařídí, co se od parametru očekává.
11
Přetěžování unárních operátorů
definujeme-li unární operátor jako metodu, nesmí mít parametry, definujeme-li jej jako funkci, musí mít jeden parametr, postfixové operátory ++ a -- se deklarují s jedním parametrem typu int navíc: při výpočtu se nepoužívá, slouží pouze k odlišení těchto operátorů od prefixových verzí.
12
Přetěžování binárních operátorů
je-li operátor definován jako metoda, levý operand představuje volající instanci, pokud chceme, aby byl binární operátor komutativní v případě, že má každý parametr jiného typu, musíme definovat dva operátory, operátory je možné předávat hodnotou nebo odkazem: pokud předáváme odkazem, musíme předat proměnnou, ne konstantu.
13
Přetěžování operátoru =
možno definovat pouze jako nestatickou metodu, využívá se pro vytváření hluboké kopie, neexistují podmínky, co musí vracet, pokud však chceme, aby se choval standardně, měl by vracet referenci na objekt, definujeme jej vždy, když definujeme kopírovací konstruktor, nedědí se, operátory +=, -=, atd. nutno přetížit zvlášť.
14
Přetěžování operátoru ()
lze přetížit pouze jako nestatickou metodu, bývá řazen mezi binární operátory: prvním parametrem je objekt, druhým parametrem seznam formálních parametrů, deklaruje se takto: trida operator()(); jeho aplikace na instanci a vypadá takto: a(1, 2);
15
Přetěžování operátoru []
levým operandem je instance, pravým index, chceme-li jej používat na levé straně přiřazení, musí vracet referenci, lze změnit indexování např. od 1 do n, deklaruje se takto: trida operator[](); jeho aplikace na instanci a vypadá takto: a[1];
16
Přetěžování operátoru ->
lze jej využít ke zpřístupnění položek vnořeného objektu, zápis a->x odpovídá tomuto volání: (a.operator->())->x, musí tedy vracet objekt nebo ukazatel na objekt, vytváří l-hodnotu, dá se využít pro automatizaci práce s pamětí.
17
Přetěžování operátoru přetypování
lze definovat pouze jako nestatická metoda, umožňuje převést objekt jednoho typu na instanci jiného typu (ne nutně objekt), lze jej např. využít pro převod předka na potomka, má tvar operator typ (), takovýto operátor může překladač používat implicitně, je-li to třeba.
18
Operátory new a delete každý má dva možné tvary:
void *operator new(size_t s); void *operator new [] (size _t s); void operator delete (void * p); void operator delete [] (void * p); typ size_t udává velikost paměti, lze je nejen přetěžovat, ale i předefinovat, jejich předefinování platí až do konce programu.
19
Přetěžování new a delete
u delete nutno zachovat typ návratové hodnoty a typ prvního parametru, u new nutno zachovat typ prvního parametru, možno též přetížit jako statické metody, je-li definován operátor new nebo delete jako metoda jisté třídy a zároveň je stejný operátor předefinován jako globální, mají přednost metody.
20
Volání new a delete podobně jako u ostatních operátorů i zde máme dvě možnosti volání: p = new zlomek; operator new(sizeof(zlomek)); podobně pro delete, na rozdíl od ostatních operátorů je zde mezi oběma možnostmi rozdíl: při volání prvním způsobem se spouští konstruktor, při druhém nikoliv.
21
Na viděnou za týden… Děkuji za pozornost
22
Použitá literatura Pavel Herout – Učebnice jazyka C,
Miroslav Virius – Od C k C++, Slajdy na předmět X36PJC z akademického roku 2008/2009 (Ladislav Vágner, Karel Müller), FEL ČVUT, Slajdy na předmět 36PJC z akademického roku 2004/2005 (Petr Matyáš), FEL ČVUT, Server
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.