рдФрд░ рднреА рдЖрдзреБрдирд┐рдХ рд╕реА ++

"рд╕реА ++ 11 рдПрдХ рдирдИ рднрд╛рд╖рд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред" - рдмреНрд░реЗрдЬрд╝рди рд╕реНрдЯреНрд░реЙрд╕реНрдЯреНрд░реБрдк

рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рд╣рд░реНрдм рд╕рдЯрд░ рдиреЗ рдЕрдкрдиреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдПрдХ рдирдпрд╛ рдкреЗрдЬ рдЦреЛрд▓рд╛ - рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдСрдлрд╝ рдореЙрдбрд░реНрди C ++ рд╕реНрдЯрд╛рдЗрд▓ , рдЬрд╣рд╛рдБ рдЙрдиреНрд╣реЛрдВрдиреЗ рдирдП рдорд╛рдирдХ рдХреЗ рдлрд╛рдпрджреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╡реЗ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдВрдЧреЗред

C ++ 11 рдорд╛рдирдХ рдХрдИ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рдирдХреЗ рдХрд╛рд░рдг C ++ 11 рдХреЛ C ++ 98 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдирдИ рднрд╛рд╖рд╛ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН:

C ++ 11 рдХреА рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рд▓реЛрдЧреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдирдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рд╣реИ рдХрд┐ C ++ 11 рдореЗрдВ рд╕реНрд╡рдЪреНрдЫ, рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рддреЗрдЬ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ - рдЕрдиреНрдп рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд┐рддрдирд╛ рд╕рд╛рдл рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдЦреИрд░, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ C ++ рдХрд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкреНрд░рджрд░реНрд╢рди рд╢реАрд░реНрд╖ рдкрд░ рд╣реИред

рдСрдЯреЛ


рдЬрд╣рд╛рдБ рднреА рд╕рдВрднрд╡ рд╣реЛ, рдСрдЯреЛ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХреЛ рди рджреЛрд╣рд░рд╛рдПрдВ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдФрд░ рд╕рдВрдХрд▓рдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ:
// C++98
map<int,string>::iterator i = m.begin();
 
// C++11
auto i = begin(m);


-, , , .
// C++98
binder2nd< greater<int> > x = bind2nd( greater<int>(), 42 );
 
// C++11
auto x = [](int i) { return i > 42; };


, auto . - , - . , .

- auto, , , . , тАФ . auto: , ( , , , ).

: delete


. delete ( , ).

тАФ shared_ptr, .

// C++98
widget* pw = new widget();
:::
delete pw;
 
// C++11
auto pw = make_shared<widget>();


(, ), weak_ptr.
// C++11
class gadget;
 
class widget {
private:
    shared_ptr<gadget> g;
};
 
class gadget {
private:
    weak_ptr<widget> w;
};


, , unique_ptr, . тАЬnew TтАЭ , . unique_ptr.
// C++11 Pimpl Idiom
class widget {
    :::
private:
    class impl;
    unique_ptr<impl> pimpl;
};
 
//  .cpp 
class impl {
    :::
};
 
widget::widget()
    : pimpl( new impl() )
{
}


, , .
// C++11
class node {
 vector< unique_ptr<node> > children;
 node* parent;
public:
 :::
};


nullptr


nullptr 0 NULL, , .
// C++98
int* p = 0;
 
// C++11
int* p = nullptr;


for range


for', range, .
// C++98
for( vector<double>::iterator i = v.begin(); i != v.end(); ++i ) {
    total += *i;
}
 
// C++11
for( auto d : v ) {
    total += d;
}


begin end


begin end , , , STL .begin() .end().

-STL , , .begin() .end(), begin end , , STL. , , C.
vector<int> v;
int a[100];
 
// C++98
sort( v.begin(), v.end() );
sort( &a[0], &a[0] + sizeof(a)/sizeof(a[0]) );
 
// C++11
sort( begin(v), end(v) );
sort( begin(a), end(a) );



. STL 100. - (PPL), (C++ AMP).

: v, x y.
// C++98:    ( std::find_if   )
vector<int>::iterator i = v.begin(); // i   
for( ; i != v.end(); ++i ) {
    if( *i > x && *i < y ) break;
}
 
// C++11:  std::find_if
auto i = find_if( begin(v), end(v), [=](int i) { return i > x && i < y; } );
</
source>

    - ,    ?   тАФ      ,  ,       ,       ,     , ..      .
<source>// C#
lock( mut_x ) {
    ... use x ...
}

// C++11 without lambdas: already nice, and more flexible (e.g., can use timeouts, other options)
{
    lock_guard<mutex> hold { mut_x };
    ... use x ...
}

// C++11 with lambdas, and a helper algorithm: C# syntax in C++
// Algorithm: template<typename T> void lock( T& t, F f ) { lock_guard hold(t); f(); }
lock( mut_x, [&]{
    ... use x ...
});


. . Lambdas, Lambdas Everywhere PDC 2010.

Move / &&


API. .
// C++98:   
vector<int>* make_big_vector(); //  1:  :  ,     delete
:::
vector<int>* result = make_big_vector();
void make_big_vector( vector<int>& out ); //  2:   :  ,     
:::
vector<int> result;
make_big_vector( result );
 
// C++11: 
vector<int> make_big_vector();
:::
vector<int> result = make_big_vector();


- , , .


: , POD auto, { } .
// C++98 or C++11
int a = 42;        //  , 

// C++ 11
auto x = begin(v); //   


, ( ) , . : ( float int), POD . C++98: , -
// C++98
rectangle       w( origin(), extents() );   // oops, declares a function, if origin and extents are types
complex<double> c( 2.71828, 3.14159 );
int             a[] = { 1, 2, 3, 4 };
vector<int>     v;
for( int i = 1; i <= 4; ++i ) v.push_back(i);

// C++11
rectangle       w = { origin(), extent() }; // = is optional but I personally prefer it
complex<double> c = { 2.71828, 3.14159 };   // = is optional but I personally prefer it
int             a[] = { 1, 2, 3, 4 };
vector<int>     v = { 1, 2, 3, 4 };


{ } :
// C++98
X::X( /*...*/ ) : mem1(init1), mem2(init2, init3) { /*...*/ }

// C++11
X::X( /*...*/ ) : mem1{init1}, mem2{init2, init3} { /*...*/ }


, :
void draw_rect( rectangle );


// C++98
draw_rect( rectangle( myobj.origin, selection.extents ) );

// C++11
draw_rect( { myobj.origin, selection.extents } );



C++ . . .

, тАФ must-know. C++, . C++ . C++ , тАФ , .

Source: https://habr.com/ru/post/In131478/


All Articles