Professional Documents
Culture Documents
2013
Osnova
Podpora nap pekladai Klov slova Konstrukce jazyka STL Knihovna Bonus
znaen
detail technick detail, pro zajmavost navc nebudeme probrat dopodrobna
PB161 -- C++11 Standard -- 9. 12. 2013 2
Motivace
standardn knihovny
Pekladae
GCC
verze 4.7.2 nebo 4.7.3 tm cel standard
verze 4.8.1 ve (pouze ohleno)
clang
verze 3.2 nebo 3.3 tm ve
MSVC
verze 2012 nedostatky v jazyku verze 2013 tm ve
Klov slova
nov pidan (decltype, constexpr, ) zmna vznamu (auto) rozen vznamu (using, delete, ) nov pidan v kontextu (final, override)
problm 1:
pouijete ve sv td std::vector
ten je parametrizovn ablonovm typem
problm 2
mte ablonovanou funkci
nad ablonovm parametrem volte metodu neznte datov typ vsledku voln me se netriviln mnit
een v C++03
pout typedef ze ablonov tdy
typename Type::return_t ret = t.call();
nepehledn, sloit
double foo() { return 3.14; } int main() { auto a = 0;// int std::vector< long > v; auto i = v.begin();// std::vector< long >::iterator auto pi = foo();// double return 0; }
constexpr int factorial( int f ) { return f <= 1 ? 1 : f * factorial( f-1 ); } template< int N > void testPrint() { std::cout << N << std::endl; } testPrint< factorial( 4 ) >();// 4! == 24
PB161 -- C++11 Standard -- 9. 12. 2013 10
11
pozor na reference
problm
v C++03 nen mon ovit, zda pekrvme
pepsn v psmenu
viditelnost
13
takto poznaen virtuln metody peklada zkontroluje metoda poznaen jako final nesm bt pekryta metoda poznaen jako override mus pekrvat metodu z ddn tdy
struct A { virtual void foo() {} }; struct B : A { virtual void foo() override {} }; struct C : B { virtual void foo() final override {}; }
//struct D : C { virtual void foo() {}; } error
14
NULL je typu int problm pi petovn, aplikaci ablonovch parametr nullptr m nedefinovan typ (zle na
17
Konstrukce jazyka
R-value reference variadick ablony range-for cyklus inicializan seznam nov zpis funkce lambda
19
dojde k vytvoen doasnho etzce (2x) 2. dojde ke spojen doasnch etzc 3. zavol se koprovac konstruktor 4. etzec se zkopruje 5. doasn etzec se zahod
1.
20
L-hodnota
to, co me bt na lev stran piazen
promnn, reference, bitfield,
dereferencovan ukazatel
R-hodnota
to ostatn doasn objekty, sla, etzce,
21
vkonnostn optimalizace
reference na doasn objekt
vykrst
pouit oklikou
funkce std::move pesune (nejen) STL
texts.push_back( std::move( t ) );
// t je v tomto okamziku prazdne // a jiz by se nemelo pouzivat
std::string tt( "dloooooouuuuuhyyyyyy teeeeext" ); std::string o1 = tt;// kopirovaci konstruktor std::string o2 = std::move( tt );// presouvaci konstruktor
// funkce s parametrem vynucujicim presunuti
problm
chci volat funkci/metodu s neomezen
mnoho parametry
printf
een v C++03:
nen nutnost pouit extern C problm s typovou kontrolou
een v C++11:
variadick ablony
PB161 -- C++11 Standard -- 9. 12. 2013 24
VS2012 een
ablonov parametry a do cca 20 parametr
26
navc je pomalej) prochzen pomoc itertor m krkolomn zpis std::for_each nem nic jako pkaz break v cyklech
eit pomoc vyhazovn vjimky je kared
27
{ auto &&__c = container; auto __i = beginExpr, __e = endExpr; for ( ;__i != __e; ++__i ) { expr = *__i; body } }
PB161 -- C++11 Standard -- 9. 12. 2013 28
29
std::vector< int > primes{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 };
v souvislosti s tm dolo k monosti pout syntaxi sloench zvorek i k voln bnch konstruktor
lze tak explicitn volat bezparametrick
30
realizace
std::initializer_list< type >
chov se jako datov kontejner metody begin, end, size
31
32
vhody? viditelnost jmen parametr pi definici nvratov hodnoty template< typename T, typename U > auto foo( T &t, U &u ) -> decltype( t + u ) lep pehlednost {
33
34
situace
pouvme algoritmy z STL
mnoh z nich potebuj funktor jako parametr funktor = vytvoit tdu
problm
kostrbat syntaxe nutnost vymlet nzvy vc funktor ztrta pehlednosti kdu
35
syntaxe:
[ capture ] ( parametres ) -> return_t { body }
capture
monost zachycen promnnch okolo lambdy
jak m typ?
pokud nechyt kontext, je typem funkce
pokud zachytv kontext, nen mon vdt typ tda generovan pekladaem
38
39
STL Knihovna
statick pole automatick pointry vlkna
mutex
40
problm
chci zvtovac pole pouiji std::vector chci nezvtovac statick pole musm pout pole z jazyka C
een C++11
std::array< typ, velikost > chov se jako pole m metody jako kontejner
begin, end, size, operator[]
41
std::array< std::string, 3 > textArray = { "text", "texz2", "text3" }; for ( const auto &t : textArray ) std::cout << t << std::endl; std::cout << intArray.size() << std::endl; return 0; }
42
problm
v C a C++ je poteba alokovanou pam
een C++
princip RAII dynamicky alokovan zdroje spravuje tda v destruktoru tda dealokuje zdroje
43
44
if (auto spt = gw.lock()) std::cout << *spt << "\n"; else std::cout << "gw is expired\n"; } void main() { { auto sp = std::make_shared<int>(42); gw = sp; f();// 42 } f();// gw is expired }
Variadick ablona funkce. Bere pesn takov argumenty, jak potebuje konstruktor alokovanho objektu.
45
C# a Java ho maj zaveden ji dlouho operan systmy umouj pracovat s vlkny problm s rozdlnm API pthread API nefunguje vude standardizovno rozhran
46
void main() { std::vector< std::thread > threads( 12 ); int i{}; for ( auto &t : threads ) { t = std::thread( foo, i++ ); } Variadick ablona konstruktoru. for ( auto &t : threads ) { t.join();// wait for thread t Bere pesn takov argumenty, jak potebuje opertor voln } spoutnho objektu/funkce. }
PB161 -- C++11 Standard -- 9. 12. 2013 47
problm
vpis nebude atomick me se stt (a stvat se bude), e budou proloen elementrn jednotky vstupu mezi vlkny
een
pout kritickou sekci st kdu, kde je zaruen, e bude provdt pouze jedno vlkno souasn
48
49
problm
validace emailov adresy
C++03
nutn volat systmov knihovny
C++11
soust STL knihovny pozor, nefunguje v libstdc++ (gcc)
pedpokld se, e bude korektn implementovno s
50
if (base_match.size() == 2) { std::ssub_match base_sub_match = base_match[1]; std::string base = base_sub_match.str(); std::cout << name << " has a base of " << base << std::endl; } } } }
51
problm
poteba vrtit z funkce vc hodnot
C++03
pro dv hodnoty lze pout
std::pair< T1, T2 >
C++11
std::tuple
52
std::tuple< int, std::string, double > foo() { return std::make_tuple( 0, std::string( "text" ), 3.14 ); } int main() { Variadick ablona auto result = foo(); std::get< 1 >( result ) += "ik"; std::cout << std::get< 0 >( result ) << std::endl;// 0 std::cout << std::get< 1 >( result ) << std::endl;// textik std::cout << std::get< 2 >( result ) << std::endl;// 3.14 int intValue; std::string strValue; double dValue; std::tie( intValue, strValue, dValue ) = foo(); std:: cout << intValue << " " << strValue << " " << dValue << std::endl;
// 0 text 3.14
funkce
}
PB161 -- C++11 Standard -- 9. 12. 2013 53
Pokud chcete implementovat jednu z tchto metod, pravdpodobn chcete implementovat vechny
koprovac konstruktor
piazovac opertor
destruktor (swap metodu + peten std::swap)
54
piazovac opertor
destruktor (swap metodu + peten std::swap)
55
56