+ All Categories
Home > Documents > PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 ·...

PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 ·...

Date post: 24-Jul-2020
Category:
Upload: others
View: 0 times
Download: 0 times
Share this document with a friend
70
PB161 Programování v jazyce C++ Přednáška 12 C++11 podrobněji Jiří Weiser 7. prosince 2015 PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 1 / 41
Transcript
Page 1: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

PB161 Programování v jazyce C++Přednáška 12C++11 podrobněji

Jiří Weiser

7. prosince 2015

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 1 / 41

Page 2: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Reklama

Vypněte, prosím, Ad-Block a podobná rozšíření.

Pohodlně se usaďte.

Z dnešní přednášky vás skoro nikdo nebude zkoušet.

(Ale může se vám to hodit.)

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 2 / 41

Page 3: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Reklama

Vypněte, prosím, Ad-Block a podobná rozšíření.

Pohodlně se usaďte.

Z dnešní přednášky vás skoro nikdo nebude zkoušet.

(Ale může se vám to hodit.)

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 2 / 41

Page 4: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Reklama

Vypněte, prosím, Ad-Block a podobná rozšíření.

Pohodlně se usaďte.

Z dnešní přednášky vás skoro nikdo nebude zkoušet.

(Ale může se vám to hodit.)

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 2 / 41

Page 5: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Novinky z C++11 zařazené do PB161

nullptrusingnoexceptdefault, deletefinal, overrideautorange-for(lambdy)

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 3 / 41

Page 6: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: nullptr

Proč se hodí namísto NULL?

jednoznačný typnení to makroimplicitně konvertibilní na

ukazatelebool

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 4 / 41

Page 7: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: nullptr

Proč se hodí namísto NULL?

jednoznačný typnení to makroimplicitně konvertibilní na

ukazatelebool

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 4 / 41

Page 8: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: using

„Hezčí” typedef

typedef int (*funcPtr)(int, const char*);using func = int(int, const char*);

funcPtr p1 = foo;func *p2 = foo;

Umožňuje brát šablonové parametry.

template< typename T >using Matrix = std::vector< std::vector< T > >;

template< typename N >using IntArray = int[N];

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 5 / 41

Page 9: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: using

„Hezčí” typedef

typedef int (*funcPtr)(int, const char*);using func = int(int, const char*);

funcPtr p1 = foo;func *p2 = foo;

Umožňuje brát šablonové parametry.

template< typename T >using Matrix = std::vector< std::vector< T > >;

template< typename N >using IntArray = int[N];

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 5 / 41

Page 10: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: noexcept

operátor i specifikátoroznačuje metodu/funkci, že nebude vyhazovat výjimky

pokud ano, zavolá se std::terminate()nepříliš podařená implementace

“šita horkou jehlou”přidáno kvůli move sémantice (později)

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 6 / 41

Page 11: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: default, delete

default

explicitní vynucení automaticky generovaných metodkonstruktorydestruktorypřiřazovací operátor

delete

explicitní zabránění vytvoření metod/funkcíkonstruktorydestruktorypřiřazovací operátorlibovolná funkce

[ukázka – delete.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 7 / 41

Page 12: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: default, delete

default

explicitní vynucení automaticky generovaných metodkonstruktorydestruktorypřiřazovací operátor

delete

explicitní zabránění vytvoření metod/funkcíkonstruktorydestruktorypřiřazovací operátorlibovolná funkce

[ukázka – delete.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 7 / 41

Page 13: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: default, delete

default

explicitní vynucení automaticky generovaných metodkonstruktorydestruktorypřiřazovací operátor

delete

explicitní zabránění vytvoření metod/funkcíkonstruktorydestruktorypřiřazovací operátorlibovolná funkce

[ukázka – delete.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 7 / 41

Page 14: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: final, override

final

ochrana proti překrytí a proti nedodržení signaturyplatí pro metody i třídy

[ukázka – finalClass.cpp finalMethod.cpp]

override

ochrana pouze proti nedodržení signatury

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 8 / 41

Page 15: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: final, override

final

ochrana proti překrytí a proti nedodržení signaturyplatí pro metody i třídy

[ukázka – finalClass.cpp finalMethod.cpp]

override

ochrana pouze proti nedodržení signatury

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 8 / 41

Page 16: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: auto

klíčové slovo žádající překladač o automagické odovození typustejná pravidla jako pro odvozování šablonových parametrů. . . s malou výjimkou pro std::initializer_list

více později

Kdy byste mohli auto použít?

jednoznačně víte, jaký bude výsledný typiterátoryv hlavičce range-foru

nebo naopak nevíte, co bude výsledný typpouze v situacích, kdy není možné typ vědět

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 9 / 41

Page 17: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: auto

klíčové slovo žádající překladač o automagické odovození typustejná pravidla jako pro odvozování šablonových parametrů. . . s malou výjimkou pro std::initializer_list

více později

Kdy byste mohli auto použít?

jednoznačně víte, jaký bude výsledný typiterátoryv hlavičce range-foru

nebo naopak nevíte, co bude výsledný typpouze v situacích, kdy není možné typ vědět

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 9 / 41

Page 18: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: range-for

Co se skrývá za následujícím cyklem?

std::vector< std::string > words;...for ( const auto &word : words )

std::cout << word << std::endl;

{auto &&__l = words;auto __i = std::begin(__l),

__e = std::end(__l);for ( ; __i != __e; ++__i ) {

const auto &word = *__i;std::cout << word << std::endl;

}}

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 10 / 41

Page 19: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: range-for

Co se skrývá za následujícím cyklem?

std::vector< std::string > words;...for ( const auto &word : words )

std::cout << word << std::endl;

{auto &&__l = words;auto __i = std::begin(__l),

__e = std::end(__l);for ( ; __i != __e; ++__i ) {

const auto &word = *__i;std::cout << word << std::endl;

}}

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 10 / 41

Page 20: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Rekapitulace: range-for

Požadavky na vaši třídu:

1. implementovat iterátor2. implementovat metodu begin3. implementovat metodu end

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 11 / 41

Page 21: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Lambdy: představení (C++11)

anonymní funkcesyntaktická zkratka za funkční objekt

std::vector< int > l;...int sum = 0;std::for_each( l.begin(), l.end(), [&] ( int i ) {

sum += i;} );

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 12 / 41

Page 22: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Lambdy: syntax (C++11)

[capture] (parameters) -> return_type { body }[capture] (parameters) { body }[capture] { body }

ne všechny části jsou povinnélze vynechat návratový typlze vynechat seznam parametrů

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 13 / 41

Page 23: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Lambdy: zachytávání (C++11)

Co a jak zachytávat?

[] – nic[a] – a hodnotou[&b] – b referencí (teoreticky)[=] – vše hodnotou (konstantní)[&] – vše referencí (teoreticky)[this] – this hodnotou[&,this] – vše referencí, ale this hodnotou

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 14 / 41

Page 24: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Lambdy: ukládání (C++11)

Co je lambda?

Lambda je třída.

pokud nic nechytá, lze přetypovat na ukazatel na funkcilze uložit do

autostd::function< signatura >šablonového parametru

[ukázka – lambda.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 15 / 41

Page 25: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Lambdy: ukládání (C++11)

Co je lambda?

Lambda je třída.

pokud nic nechytá, lze přetypovat na ukazatel na funkcilze uložit do

autostd::function< signatura >šablonového parametru

[ukázka – lambda.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 15 / 41

Page 26: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Lambdy: ukládání (C++11)

Co je lambda?

Lambda je třída.

pokud nic nechytá, lze přetypovat na ukazatel na funkcilze uložit do

autostd::function< signatura >šablonového parametru

[ukázka – lambda.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 15 / 41

Page 27: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Lambdy (C++14)

Zavedení šablonových parametrů

[] ( auto x ) { return ++x; }

Rozšíření o možnost inicializace v capture sekci.

int x = 4;int y = [&r = x, x = x + 1] {

r += 2;return x + 2;

}();

Jaká bude hodnota proměnných x a y?

[ukázka – lambdaTest.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41

Page 28: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Lambdy (C++14)

Zavedení šablonových parametrů

[] ( auto x ) { return ++x; }

Rozšíření o možnost inicializace v capture sekci.

int x = 4;int y = [&r = x, x = x + 1] {

r += 2;return x + 2;

}();

Jaká bude hodnota proměnných x a y?

[ukázka – lambdaTest.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41

Page 29: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Lambdy (C++14)

Zavedení šablonových parametrů

[] ( auto x ) { return ++x; }

Rozšíření o možnost inicializace v capture sekci.

int x = 4;int y = [&r = x, x = x + 1] {

r += 2;return x + 2;

}();

Jaká bude hodnota proměnných x a y?

[ukázka – lambdaTest.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41

Page 30: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Neprobádané vody C++11/C++14

static_assertuniformní inicializacezobecněné konstantní výrazymove sémantikavariadické šablonypráce s pamětí à la C++14SFINAEasynchronní zpracování

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 17 / 41

Page 31: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Statický assert

kontrola předpokladů během překladuvyhodnocení výrazupřípadně zahlášení chyby

static_assert(sizeof( bool ) > 1,"bool is greater than one byte" );

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 18 / 41

Page 32: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Uniformní inicializace

Co se stane?

std::string line();

Deklarace funkce line, která vrací std::string.

známé jako most-vexing-parsebez parametrů → bez závorekjeden parametr

→ závorky→ rovnítko

více parametrů → závorky

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 19 / 41

Page 33: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Uniformní inicializace

Co se stane?

std::string line();

Deklarace funkce line, která vrací std::string.

známé jako most-vexing-parsebez parametrů → bez závorekjeden parametr

→ závorky→ rovnítko

více parametrů → závorky

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 19 / 41

Page 34: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Uniformní inicializace

Snaha o sjednocení syntaxe vytváření instancí.

lze použít složené závorkylimitace pro přetypování

pouze neomezující přetypování

std::string line{};std::string name{ "Yoda" };

Použitím složených závorek se problém vyřeší.

Mezitím v paralelním vesmíru. . .

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 20 / 41

Page 35: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Uniformní inicializace

Snaha o sjednocení syntaxe vytváření instancí.

lze použít složené závorkylimitace pro přetypování

pouze neomezující přetypování

std::string line{};std::string name{ "Yoda" };

Použitím složených závorek se problém vyřeší.

Mezitím v paralelním vesmíru. . .

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 20 / 41

Page 36: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Inicializační seznam

Umíme staticky inicializovat pole.

int array[] = { 1, 2, 3, 4, 5 };

Chceme umět obdobně inicializovat vektor.

std::vector< int > data{ 1, 2, 3, 4, 5 };

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 21 / 41

Page 37: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Inicializační seznam

Umíme staticky inicializovat pole.

int array[] = { 1, 2, 3, 4, 5 };

Chceme umět obdobně inicializovat vektor.

std::vector< int > data{ 1, 2, 3, 4, 5 };

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 21 / 41

Page 38: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Inicializační seznam

složené závorky mají svůj typ(lži dětem)std::initializer_list< T >lze tak použít v konstruktoru vlastní třídy

Jak je možné, že funguje toto?

for ( int i : { 1, 2, 3 } )std::cout << i;

Dříve deklarovaná výjimka pro auto.

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 22 / 41

Page 39: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Inicializační seznam

složené závorky mají svůj typ(lži dětem)std::initializer_list< T >lze tak použít v konstruktoru vlastní třídy

Jak je možné, že funguje toto?

for ( int i : { 1, 2, 3 } )std::cout << i;

Dříve deklarovaná výjimka pro auto.

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 22 / 41

Page 40: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Uniformní inicializace vs Inicializační seznam

std::string s1( "text" );std::string s2( { 't', 'e', 'x', 't' } );std::string s3( 65, 't' );

std::string s4{ "text" };std::string s5{ 't', 'e', 'x', 't' };std::string s6{ 65, 't' };

Co bude obsahem řetězců?

[ukázka – uniformInitialization.cpp]

Inicializační seznam má přednost.

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 23 / 41

Page 41: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Uniformní inicializace vs Inicializační seznam

std::string s1( "text" );std::string s2( { 't', 'e', 'x', 't' } );std::string s3( 65, 't' );

std::string s4{ "text" };std::string s5{ 't', 'e', 'x', 't' };std::string s6{ 65, 't' };

Co bude obsahem řetězců?

[ukázka – uniformInitialization.cpp]

Inicializační seznam má přednost.

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 23 / 41

Page 42: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Uniformní inicializace vs Inicializační seznam

std::string s1( "text" );std::string s2( { 't', 'e', 'x', 't' } );std::string s3( 65, 't' );

std::string s4{ "text" };std::string s5{ 't', 'e', 'x', 't' };std::string s6{ 65, 't' };

Co bude obsahem řetězců?

[ukázka – uniformInitialization.cpp]

Inicializační seznam má přednost.

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 23 / 41

Page 43: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Zobecněné konstantní výrazyMožnost nechat si vyhodnotit funkci během překladu.

constexpr specifikátorfunkci lze volat i v době provádění programuv C++11 poněkud bezzubé

pouze jeden return příkazpodmínka řešena pomocí ternárního operátoru

v C++14 rozšířena paleta nástrojůfunkce nesmí obsahovat

gotovýjimky (try-catch bloky)inline assemblera ještě pár dalších. . .

celý strom výpočtu musí být konstantně vyhodnotitelný

[ukázka – constexpr.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 24 / 41

Page 44: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Zobecněné konstantní výrazyMožnost nechat si vyhodnotit funkci během překladu.

constexpr specifikátorfunkci lze volat i v době provádění programuv C++11 poněkud bezzubé

pouze jeden return příkazpodmínka řešena pomocí ternárního operátoru

v C++14 rozšířena paleta nástrojůfunkce nesmí obsahovat

gotovýjimky (try-catch bloky)inline assemblera ještě pár dalších. . .

celý strom výpočtu musí být konstantně vyhodnotitelný

[ukázka – constexpr.cpp]PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 24 / 41

Page 45: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Move sémantika

L-hodnota“To, co může být na levé straně od rovnítka.”proměnná, reference, bitfield, dereferencovaný ukazatel

R-hodnota“To ostatní.”dočasné objekty, konstanty

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 25 / 41

Page 46: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Move sémantika

Příklad použití:

void grabber( std::string &&text ) {std::cout << text << std::endl;text.clear(); //

}std::string s = "text";

grabber( "blaabol" ); // "blaabol"grabber( std::string( "kecy v kleci" ) ); // "kecy v kleci"

//grabber( s );// error

grabber( std::move( s ) ); // "text"std::cout << '[' << s << ']'; // "[]"

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 26 / 41

Page 47: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Move sémantika: The Rule of Three and Half

Běžná třída A s implementovaným pravidlem 3,5.

struct A {A( const A & other ) { ... }

~A() { ... }A &operator=( A other ) {

swap( other );return *this;

}void swap( A &other ) {

using std::swap;...

}};

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 27 / 41

Page 48: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Move sémantika: The Rule of Four and Half

Stačí přidat konstruktor, zbytek se vyřeší sám.

struct A {A( const A & other ) { ... }A( A &&other ) { ... }~A() { ... }A &operator=( A other ) {

swap( other );return *this;

}void swap( A &other ) {

using std::swap;...

}};

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 28 / 41

Page 49: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Move sémantika: ukázka

výkonnostní optimalizacepřepojení ukazatelů namísto kopírování

přímo se moc nesetkátevnitřně používají kontejnery z STDmove konstruktorstd::move

[ukázka – move.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 29 / 41

Page 50: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Variadické šablony

Problém: v době psaní funkce nevím, kolik dostane parametrů.

řešení C/C++void foo( int, ... );uvnitř použít va_args

řešení C++11variadické šablonypoměrně mnoho uplatnění ve standardní knihovně

Ukázka využití za malý moment.

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 30 / 41

Page 51: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Variadické šablony

Problém: v době psaní funkce nevím, kolik dostane parametrů.řešení C/C++

void foo( int, ... );uvnitř použít va_args

řešení C++11variadické šablonypoměrně mnoho uplatnění ve standardní knihovně

Ukázka využití za malý moment.

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 30 / 41

Page 52: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Práce s pamětí à la C++11

Přístupy práce s pamětí v programovacích jazycích.

Cruční kontrola práce s pamětí

Java, PHP, Javascript, Python, C#, . . .garbage collector

Haskellpaměť se nějak děje. . . se stim smiř

C++RAIIlze využít pro chytré ukazatelemoderní C++14 nepoužívá new ani delete(C++11 dovoluje přilinkovat GC)

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 31 / 41

Page 53: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Práce s pamětí à la C++11

Přístupy práce s pamětí v programovacích jazycích.

Cruční kontrola práce s pamětí

Java, PHP, Javascript, Python, C#, . . .garbage collector

Haskellpaměť se nějak děje. . . se stim smiř

C++RAIIlze využít pro chytré ukazatelemoderní C++14 nepoužívá new ani delete(C++11 dovoluje přilinkovat GC)

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 31 / 41

Page 54: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Práce s pamětí à la C++11

Chytré ukazatele.

std::unique_ptr< T >symbolizuje unikátní vlastnictví pamětilze pouze přesouvatdealokuje v destruktorujako doplněk slouží běžný ukazatel

std::shared_ptr< T >symbolizuje vlastnictví pamětipočítá referenceposlední destruktor dealokuje

std::weak_ptr< T >doplněk k std::shared_ptr< T >před použitím nutné konvertovat na std::shared_ptr< T >

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 32 / 41

Page 55: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Práce s pamětí à la C++11

Chytré ukazatele.

std::unique_ptr< T >symbolizuje unikátní vlastnictví pamětilze pouze přesouvatdealokuje v destruktorujako doplněk slouží běžný ukazatel

std::shared_ptr< T >symbolizuje vlastnictví pamětipočítá referenceposlední destruktor dealokuje

std::weak_ptr< T >doplněk k std::shared_ptr< T >před použitím nutné konvertovat na std::shared_ptr< T >

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 32 / 41

Page 56: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Práce s pamětí à la C++11

Chytré ukazatele.

std::unique_ptr< T >symbolizuje unikátní vlastnictví pamětilze pouze přesouvatdealokuje v destruktorujako doplněk slouží běžný ukazatel

std::shared_ptr< T >symbolizuje vlastnictví pamětipočítá referenceposlední destruktor dealokuje

std::weak_ptr< T >doplněk k std::shared_ptr< T >před použitím nutné konvertovat na std::shared_ptr< T >

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 32 / 41

Page 57: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Práce s pamětí à la C++11

std::weak_ptr< int > wp;void foo() {

// auto == std::shared_ptr< int >if ( auto spt = wp.lock() )

std::cout << *spt << std::endl;else

std::cout << "wp expired" << std::endl;}int main() {

{auto sp = std::make_shared< int >( 42 );wp = sp;foo(); // 42

}foo(); // wp expired

}PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 33 / 41

Page 58: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Práce s pamětí à la C++11

template< typename T, typename... Args >std::unique_ptr< T > make_unique( Args &&... args ) {

return { new T( std::forward< Args >( args )... ) };}void foo( int *ptr ) {

*ptr = 42;throw std::runtime_error( "whatever" );

}int main() {

try {auto handle = make_unique< int >();*handle = 10;foo( handle.get() );// zpřístupni ukazatel

} catch( const std::exception &ex ) {std::cout << ex.what() << std::endl;

}}

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 34 / 41

Page 59: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

SFINAE (popsáno už v roce 2002)Substitution Failure Is Not An Error.

void foo( double f ) {std::cout << "double: " << f << std::endl;

}void foo( int i ) {

std::cout << "int: " << i << std::endl;}int main() {

foo( 3.14 );foo( 1 );unsigned u = 42;foo( u );

}

Co se vypíše?

[ukázka – numbers.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 35 / 41

Page 60: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

SFINAE (popsáno už v roce 2002)Substitution Failure Is Not An Error.

void foo( double f ) {std::cout << "double: " << f << std::endl;

}void foo( int i ) {

std::cout << "int: " << i << std::endl;}int main() {

foo( 3.14 );foo( 1 );unsigned u = 42;foo( u );

}

Co se vypíše?[ukázka – numbers.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 35 / 41

Page 61: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

SFINAE

template< typename F >typename std::enable_if<

std::is_floating_point< F >::value>::type foo( F f ) {

std::cout << "double: " << f << std::endl;}void foo( int i ) {

std::cout << "int: " << i << std::endl;}int main() {

foo( 3.14 );foo( 1 );unsigned u = 42;foo( u );

}

Nepřehledný zápis návratového typu.PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 36 / 41

Page 62: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

SFINAE

template< typename F >auto foo( F f )

-> typename std::enable_if<std::is_floating_point< F >::value

>::type{

std::cout << "double: " << f << std::endl;}void foo( int i ) {

std::cout << "int: " << i << std::endl;}int main() {

foo( 3.14 );foo( 1 );unsigned u = 42;foo( u );

}PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 37 / 41

Page 63: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

SFINAE

Složitější příklad.

chcete pracovat s libovolným kontejnerem

pro efektivnější práci chcete volat metodu reserve

metodu reserve mají pouze tyto kontejnery:std::stringstd::vectorstd::unordered_set, std::unordered_multisetstd::unordered_map, std::unordered_multimap

[ukázka – sfinae.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 38 / 41

Page 64: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

SFINAE

Složitější příklad.

chcete pracovat s libovolným kontejnerempro efektivnější práci chcete volat metodu reserve

metodu reserve mají pouze tyto kontejnery:std::stringstd::vectorstd::unordered_set, std::unordered_multisetstd::unordered_map, std::unordered_multimap

[ukázka – sfinae.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 38 / 41

Page 65: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

SFINAE

Složitější příklad.

chcete pracovat s libovolným kontejnerempro efektivnější práci chcete volat metodu reserve

metodu reserve mají pouze tyto kontejnery:std::stringstd::vectorstd::unordered_set, std::unordered_multisetstd::unordered_map, std::unordered_multimap

[ukázka – sfinae.cpp]

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 38 / 41

Page 66: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Vlákna

podpora vlákenvláknamutexypodmínkové proměnnéasynchronní volání

zabalení vlákna do zadám-práci & vyzvednu-výsledekmůže být potřeba přilinkovat pthread knihovnuo paralelním programování více v

IB109 Návrh a implementace paralelních systémůPV192 Paralelní technické systémyIV112 Projekt z paralelních aplikací

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 39 / 41

Page 67: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Asynchronní volání

auto handle = std::async(std::launch::async,fibonacci,100

);...int result = handle.get();

možné strategie zpracováníasynchronní (samostatné vlákno)odložené (líné vyhodnocení)implementace STD si může přidávat další strategie

vrací std::futurepomocí metody get lze počkat na výsledek

vyhozená výjimka se propaguje

[ukázka – async.cpp]PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 40 / 41

Page 68: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Reklama

Líbilo se vám to?

Zaujalo vás to?

Příští semestr se v předmětu PB173 Tematické programování vC/C++ otevírají skupiny pro pokročilé C++.

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 41 / 41

Page 69: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Reklama

Líbilo se vám to?

Zaujalo vás to?

Příští semestr se v předmětu PB173 Tematické programování vC/C++ otevírají skupiny pro pokročilé C++.

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 41 / 41

Page 70: PB161 Programování v jazyce C++ Predná ka 12 - C++11 podrobneji · 2018-02-24 · [ukázka–lambdaTest.cpp] PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 16 / 41.

Reklama

Líbilo se vám to?

Zaujalo vás to?

Příští semestr se v předmětu PB173 Tematické programování vC/C++ otevírají skupiny pro pokročilé C++.

PB161 přednáška 12: C++11 podrobněji 7. prosince 2015 41 / 41


Recommended