「C ++ 11は新しい言語のように感じます。」-Bjarne Stroustrup
少し前に、
Herb Sutterは彼のWebサイトに新しいページを開きました
。Elementsof Modern C ++ Styleで、新しい標準の利点とコードへの影響について説明しています。
C ++ 11標準には、多くの新機能が導入されています。 さらに、C ++ 11はC ++ 98と比較して新しい言語と見なすことができるため、それらを検討します:
- コードのスタイルを変更し、新しいイディオムを導入します。 これらは、C ++ライブラリのアーキテクチャに影響します。 たとえば、スマートポインターはより一般的になり(関数とその戻り値の両方の引数として)、値ごとに大きなオブジェクトを返す関数になります。
- これらは非常に頻繁かつ集中的に使用されるため、2つ目のコード例でそれらに出会う可能性があります。 例:5行以上のコードの例では、autoキーワードに言及せずにほとんど実行できません。
C ++ 11の他の機能を自由に使用してください。 しかし、まず第一に、以下のリストに注意してください。C++ 11でクリーンで安全で高速なコードを書くことができるのは彼らのおかげです-他の現代言語の場合と同様にクリーンで安全です。 さて、C ++の従来のパフォーマンスは、いつものように最高です。
オート
可能な限りautoキーワードを使用してください。
まず、私たちとコンパイラーがすでに知っている型名を繰り返さないでください:
map<int,string>::iterator i = m.begin();
auto i = begin(m);
-, , , .
binder2nd< greater<int> > x = bind2nd( greater<int>(), 42 );
auto x = [](int i) { return i > 42; };
, auto . - , - . , .
- auto, , , . , — . auto: , ( , , , ).
: delete
. delete ( , ).
— shared_ptr, .
widget* pw = new widget();
:::
delete pw;
auto pw = make_shared<widget>();
(, ), weak_ptr.
class gadget;
class widget {
private:
shared_ptr<gadget> g;
};
class gadget {
private:
weak_ptr<widget> w;
};
, , unique_ptr, . “new T” , . unique_ptr.
class widget {
:::
private:
class impl;
unique_ptr<impl> pimpl;
};
class impl {
:::
};
widget::widget()
: pimpl( new impl() )
{
}
, , .
class node {
vector< unique_ptr<node> > children;
node* parent;
public:
:::
};
nullptr
nullptr 0 NULL, , .
int* p = 0;
int* p = nullptr;
for range
for', range, .
for( vector<double>::iterator i = v.begin(); i != v.end(); ++i ) {
total += *i;
}
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];
sort( v.begin(), v.end() );
sort( &a[0], &a[0] + sizeof(a)/sizeof(a[0]) );
sort( begin(v), end(v) );
sort( begin(a), end(a) );
. STL 100. - (
PPL), (
C++ AMP).
: v, x y.
vector<int>::iterator i = v.begin();
for( ; i != v.end(); ++i ) {
if( *i > x && *i < y ) break;
}
auto i = find_if( begin(v), end(v), [=](int i) { return i > x && i < y; } );
</
source>
- , ? — , , , , , .. .
<source>
lock( mut_x ) {
... use x ...
}
{
lock_guard<mutex> hold { mut_x };
... use x ...
}
lock( mut_x, [&]{
... use x ...
});
. .
Lambdas, Lambdas Everywhere PDC 2010.
Move / &&
API. .
vector<int>* make_big_vector();
:::
vector<int>* result = make_big_vector();
void make_big_vector( vector<int>& out );
:::
vector<int> result;
make_big_vector( result );
vector<int> make_big_vector();
:::
vector<int> result = make_big_vector();
- , , .
: , POD auto, { } .
int a = 42;
auto x = begin(v);
, ( ) , . : ( float int), POD . C++98: , -
rectangle w( origin(), extents() );
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);
rectangle w = { origin(), extent() };
complex<double> c = { 2.71828, 3.14159 };
int a[] = { 1, 2, 3, 4 };
vector<int> v = { 1, 2, 3, 4 };
{ } :
X::X( ) : mem1(init1), mem2(init2, init3) { }
X::X( ) : mem1{init1}, mem2{init2, init3} { }
, :
void draw_rect( rectangle );
draw_rect( rectangle( myobj.origin, selection.extents ) );
draw_rect( { myobj.origin, selection.extents } );
C++ . . .
, — must-know. C++, . C++ . C++ , — , .