PB161 Programování v jazyce C++ Přednáška 9



Podobné dokumenty
PB161 Programování v jazyce C++ Přednáška 6

PB161 Programování v jazyce C++ Přednáška 6

PB161 Programování v jazyce C++ Přednáška 4

Jazyk C++ I. Polymorfismus

PŘETĚŽOVÁNÍ OPERÁTORŮ

Přetěžování operátorů

PB161 Programování v jazyce C++ Přednáška 10

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

Úvod do programovacích jazyků (Java)

přetížení operátorů (o)

Funkční objekty v C++.

PB161 Programování v jazyce C++ Přednáška 10

PB161 Programování v jazyce C++ Přednáška 4

Mělká a hluboká kopie

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Dědění, polymorfismus

Přetěžování operátorů

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

přetížení operátorů (o)

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

Zpracoval:

Přetěžování operátorů, dynamika objektů 2

Programování v C++ 2, 4. cvičení

Programování v C++ 1, 5. cvičení

PB přednáška (23. listopadu 2015)

PB161 Programování v jazyce C++ Přednáška 2

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

Jazyk C++ I. Šablony 2

Programování v C++ 1, 6. cvičení

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod do programovacích jazyků (Java)

Více o konstruktorech a destruktorech

Ukazka knihy z internetoveho knihkupectvi

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

5 Přehled operátorů, příkazy, přetypování

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

SYSTÉMOVÉ PROGRAMOVÁNÍ Cvičení č.1

PB161 Programování v jazyce C++ Přednáška 3

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Programování v C++ 2, 7. cvičení

PB161 Programování v jazyce C++ Přednáška 3

PREPROCESOR POKRAČOVÁNÍ

1. Programování proti rozhraní

Programování v C++ 1, 1. cvičení

konstruktory a destruktory (o)

Programování v C++ 2, 8. cvičení

Operátory. Základy programování 1 Tomáš Kühr

Konstruktory a destruktory

Základy objektové orientace I. Únor 2010

8 Třídy, objekty, metody, předávání argumentů metod

PB161 Programování v jazyce C++ Přednáška 2

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Operátory. Základy programování 1 Martin Kauer (Tomáš Kühr)

Generické programování

Programování v C++ 3, 3. cvičení

Jazyk C# (seminář 6)

Zápis programu v jazyce C#

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Jazyk C++ I. Šablony

PB161 Programování v jazyce C++ Přednáška 1

Algoritmizace a programování

Seminář Java II p.1/43

Objektově orientované programování

Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.

24. listopadu 2013, Brno Připravil: David Procházka

PB161 Programování v jazyce C++ Přednáška 1

Jazyky C a C++ kompletní průvodce 2., aktualizované vydání. Miroslav Virius

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

PB161 Programování v jazyce C++ Přednáška 8

Objektově orientované programování. Úvod

Jazyk C++, některá rozšíření oproti C

Programování II. Dědičnost změna chování 2018/19

Programování v C++ 1, 14. cvičení

PB161 Programování v jazyce C++ Přednáška 1

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Programovací jazyk C++ Hodina 1

Jazyk C++ II. Šablony a implementace

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

PB161 Programování v jazyce C++ Přednáška 3

Jazyk C# a platforma.net

Základy programování (IZP)

Standardní algoritmy vyhledávací.

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

Programování II. Polymorfismus

Vector datový kontejner v C++.

map, multimap - Asociativní pole v C++.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

IRAE 07/08 Přednáška č. 1

PB161 Programování v jazyce C++ Přednáška 5

PROGRAMOVÁNÍ V C++ CVIČENÍ

PB161 Základy OOP. Tomáš Brukner

NPRG031 Programování II 1 / :25:46

Dynamická identifikace typů v C++.

Transkript:

PB161 Programování v jazyce C++ Přednáška 9 Právo friend Přetěžování operátorů Nikola Beneš 16. listopadu 2015 PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 1 / 30

Reklama PB173 Tematicky zaměřený vývoj aplikací v jazyce C/C++ různé tématické skupiny možný opakovaný zápis v semestru jaro 2016: jedna nebo dvě skupiny zaměřené na C++11/C++14 chytré ukazatele paralelní programování metaprogramování, použití šablon podrobně funkcionální prvky, lambdy informace z minulého běhu: http://cecko.eu/public/pb173 PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 2 / 30

Poznámky na úvod Parametry: brát hodnotou nebo referencí? co s parametrem hodláme dělat? jde o primitivní typ nebo objekt? parametr budeme měnit referencí parametr nebudeme měnit primitivní datové typy hodnotou objekty konstantní referencí jednoduché objekty? parametr nebudeme měnit, ale budeme určitě vytvářet jeho kopii hodnotou void f(const Type & x) { Type y = x; //... } void f(type y) { //... //... } PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 3 / 30

Poznámky na úvod (pokr.) Kdy použít inline? původní záměr inline: nápověda pro překladač moderní překladače umí posoudit lépe než programátor inline při linkování: více stejných funkcí ve více překladových jednotkách Doporučení funkce v hlavičkových souborech: inline funkce ve zdrojových souborech: bez inline metody definované uvnitř deklarace třídy jsou automaticky inline PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 4 / 30

Spřátelené třídy a funkce PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 5 / 30

Motivace Princip zapouzdření přístupová práva (private, protected) Přístup k soukromým atributům a metodám z venku operátory vstupu a výstupu >>, << iterátory Přístup k soukromým atributům jen pro určité třídy multiple dispatch (viz vzorové řešení 5. cvičení) PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 6 / 30

Deklarace přátel Klíčové slovo friend způsob jak obejít přístupová práva deklarace spřátelených funkcí a třídy přístup k libovolným členům třídy porušení principu zapouzdření? záleží na použití nevhodné použití porušuje zapouzdření vhodné použití jej naopak může posilovat PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 7 / 30

Deklarace přátel (pokr.) Použití friend přístup povoluje ten, k jehož soukromým členům má být přistupováno uvnitř deklarace třídy (kdekoliv) friend class JmenoTridy; friend typ jmenofunkce(parametry); funkci je možno zároveň i definovat [ukázka použití friend] PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 8 / 30

Deklarace přátel (pokr.) Vlastnosti friend třída si určuje, kdo je její přítel, ne naopak přátelství není reciproční přátelství není tranzitivní přátelství není dědičné pokud třída A označí funkci/třídu X jako přítele, X má částečný přístup i k potomkům A (ke zděděným částem) proč? [ukázka] PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 9 / 30

Deklarace přátel (pokr.) Kdy a jak používat friend? typické využití: operátory přístup k atributům jen pro někoho (bez getterů/setterů) používejte opatrně a kromě operátorů spíše výjimečně PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 10 / 30

Přetěžování operátorů PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 11 / 30

Motivace Přetížené operátory téměř v každém jazyce (aritmetické operátory pro int vs. float) C++ umožňuje přetížit operátory pro vlastní datové typy už jsme viděli: operator= pro kopírovací přiřazení operator() pro funkční objekty operator>> a operator<< pro vstup a výstup operator+ pro řetězce Proč přetěžovat operátory? zlepšit čitelnost kódu usnadnit používání třídy snížit chyby při použití třídy PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 12 / 30

Přetížené operátory Syntax Zdroje volná funkce nebo metoda třídy operator a označení operátoru konkrétní syntaxe závisí na počtu parametrů https://en.wikipedia.org/wiki/operators_in_c_and_c++ http://en.cppreference.com/w/cpp/language/operators PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 13 / 30

Přetížené operátory (pokr.) Operátor jako funkce typicky friend unární operátory jeden parametr binární operátory dva parametry už jsme viděli: operátory vstupu a výstupu a + b = operator+(a, b) [ukázka použití] PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 14 / 30

Přetížené operátory (pokr.) Operátor jako metoda levý operand je *this počet parametrů: o jeden méně než implementace funkcí a + b = a.operator+(b) [ukázka použití] PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 15 / 30

Přetížené operátory (pokr.) Jak přetěžovat operátory? některé operátory není možno přetěžovat., ::,? : některé operátory musí být implementovány jako metody =, [], ->, () ostatní je možno implementovat jako metody nebo jako funkce Doporučení pokud nemáme jak zasáhnout do třídy levého objektu: funkce unární operátor: metoda binární operátor, který se chová ke svým operandům stejně: funkce binární operátor, který se chová k levému operandu jinak: metoda nezapomínejte na const PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 16 / 30

Přetížené operátory (pokr.) Omezení přetěžování operátorů nelze definovat nové operátory nelze měnit počet parametrů (kromě operátoru ()) nelze definovat nové operátory pro primitivní typy alespoň jeden z paramterů musí být uživatelsky definovaného typu nelze měnit prioritu ani asociativitu operátorů PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 17 / 30

Přetěžování operátorů Přiřazení operator= musí být metoda už jsme viděli v části o kopírování nezapomeňte na idiom copy and swap X & X::operator=(X other) { swap(other); return *this; } PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 18 / 30

Přetěžování operátorů Vstup a výstup operator>>, operator<< operátory bitového posunu s jiným významem musí být funkce už jsme viděli v části o vstupně-výstupních proudech nezapomeňte, že vrací referenci na zadaný proud std::istream & operator>>(std::istream & in, X & x) { // read data from in and update x return in; } std::ostream & operator<<(std::ostream & out, const X & x) { // write x to out return out; } PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 19 / 30

Přetěžování operátorů Funkční volání operator() musí být metoda může brát libovolný počet parametrů už jsme viděli v části o algoritmech a funkčních objektech doporučení: funkční objekty by měly být snadno kopírovatelné class Adder { // not the snake int val; public: Adder(int v) : val(v) {} int operator()(int x) { return x + val; } }; PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 20 / 30

Přetěžování operátorů Porovnávání operator==, operator!=, operator<, operator<=, operator>, operator>= měly by vracet bool neměly by měnit své parametry typicky jako funkce pokud přetížíte jeden, je vhodné přetížit i všechny ostatní PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 21 / 30

Přetěžování operátorů porovnávání bool operator<(const X & l, const X & r) { // do the actual comparison return...; } bool operator>(const X & l, const X & r) { return r < l; } bool operator>=(const X & l, const X & r) { return!(l < r); } bool operator<=(const X & l, const X & r) { return!(r < l); } bool operator==(const X & l, const X & r) { // do the actual comparison return...; } bool operator!=(const X & l, const X & r) { return!(l == r); PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 22 / 30

Přetěžování operátorů Aritmetické operátory operator+, operator+= apod. silně doporučené: ke každému operátoru přetížit i kombinaci s přiřazením + apod. by měly být funkce a měly by vracet hodnotu += apod. by měly být metody a měly by vracet referenci pokud chceme dělat kopii: jeden z operandů (levý) hodnotou pokud chceme interakci i s jinými typy: pamatujte na symetrii [ukázka] PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 23 / 30

Přetěžování operátorů Indexování operator[] * musí být metoda * typicky chceme konstantní a nekonstantní přetížení class X { //... public: value_type & operator[](index_type ix); const value_type & operator[](index_type ix) const; }; PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 24 / 30

Přetěžování operátorů Inkrement a dekrement operator++, operator-- typicky jako metody dvě varianty: postfixová varianta má (nepoužívaný) parametr int prefixová varianta by měla vracet referenci postfixová varianta by měla vracet hodnotu (kopii) [ukázka] PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 25 / 30

Přetěžování operátorů Dereference operator*, operator-> pro typy, které se chovají jako ukazatele (iterátory, chytré ukazatele) typicky jako metody operator* vrací referenci operator-> vrací ukazatel nebo něco jako ukazatel (řetězení ->) a->b = a.operator->()->b class MyIterator { value_type * ptr; public: value_type & operator*() { return *ptr; } const value_type & operator*() const { return *ptr; } value_type * operator->() { return ptr; } const value_type * operator->() const { return ptr; } }; PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 26 / 30

Přetěžování operátorů Přetypování operator novytyp speciální operátor pro implicitní přetypování musí být metoda (bez parametrů) nepíše se návratová hodnota class X { int val; public: X(int v) : val(v) {} operator int() const { return val; } }; int main() { X x(3); int a = x; return x; } PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 27 / 30

Přetěžování operátorů přetypování Problémy s implicitním přetypováním // která funkce se zavolá? void f(int a); void f(x & x); int main() { f( X(3) ); } C++11: klíčové slovo explicit class X { //... public: //... explicit operator int() const { return val; } }; PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 28 / 30

Přetěžování operátorů přetypování Použití explicit pro bool překladač smí použít explicitní operátor bool pro přetypování, ale jen na bool, ne dál použití pro objekty, na jejichž stav se můžeme dotazovat pomocí if class X { //... bool is_ok; public: //... explicit operator bool() const { return is_ok; } }; int main() { X x; if (x) { /*... */ } // OK int a = x; // CHYBA } PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 29 / 30

Shrnutí Klíčové slovo friend umožňuje obejít přístupová práva přátelství není reciproční, transitivní, ani dědičné Přetěžování operátorů můžeme přetěžovat většinu operátorů v C++ význam operátorů by měl být intuitivně jasný držte se doporučení PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 30 / 30