C ++ 11とC ++ 14個の新機能

https://www.jianshu.com/p/b8a36ff7ac27

1.nullptr

目的はnullptrを交換することであるNULL、同じもののような伝統的なC ++意志NULL、0が表示されます。空のポインタ、0を区別するために設計されたnullptrキーワード、。型nullptr_tのnullptr。

2.auto

変数の型について、コンパイラの心配を聞かせて、型推論を達成するために2つのキーワードを自動およびdecltype。

  • 自動機能は、大量の参加のために使用され、私たちは、テンプレートを使用する必要があるの過負荷の問題を検討することはできません。
  • 自動配列型を導出するために使用することはできません

3. decltype

戻り値の型を宣言します

 

template<typename T1,typename T2>
auto add(T1 x,T2 y) ->decltype(x+y);

式のコンパイラが分析し、そのタイプを取得し、式の実際の値が算出されていません。

 

auto x = 1;
auto y = 2;
decltype(x+y) z;

4.foreach

ループのためのオリジナル

 

std::vector<int> arr(5, 100);
for(std::vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
{
             std::cout << *i << std::endl;
}

 

for(auto &i:arr)
{
    std::cout << i << std::endl;
}

初期化リスト

 

struct A
{
     int a;
     float b;
};
A a {1,1.0};
A b{};  //初始化为0,指针初始化为nullptr

initializer_list

 

#include <initializer_list>
class Magic {
public:
    Magic(std::initializer_list<int> list) {
        for(auto &i:list){

        }
    }
};

Magic magic = {1,2,3,4,5};
std::vector<int> v = {1, 2, 3, 4};
max({1,2,3,4});

6.テンプレート

テンプレート変数パラメータ

 

void print()
{

}

template<typename T,typename... Types>
void print(const T&  firstArgs,const Types&... args){
    cout<<firstArgs<<endk;
    print(args...);
}

タイプエイリアステンプレート

 

template< typename T, typename U, int value>
class SuckType {
public:
    T a;
    U b;
    SuckType():a(value),b(value){}
};

template <typename T>
using NewType = SuckType<int, T, 1>;    // 合法

デフォルトのテンプレート引数

 

template<typename T = int, typename U = int>
auto add(T x, U y) -> decltype(x+y) {
    return x+y;
}

7.コンストラクタ

欧州委員会の構造

そのようなコンストラクタコンストラクタはとても簡素化オブジェクトコードのように、同じクラスの別のコンストラクタを呼び出すことができ

 

class Base {
public:
    int value1;
    int value2;
    Base() {
        value1 = 1;
    }
    Base(int value) : Base() {  // 委托 Base() 构造函数
        value2 = 2;
    }
};

継承構造

親クラスがあり、次の

 

class A
{
    A(int i) {}
    A(double d,int i){}
    A(float f,int i,const char* c){}
    //...等等系列的构造函数版本
}

次のようにサブクラスは、元の親、明示的に親クラスのコンストラクタを呼び出すための必要性を継承します。

 

class  B:A
{
    B(int i):A(i){}
    B(double d,int i):A(d,i){}
    B(folat f,int i,const char* c):A(f,i,e){}
    //......等等好多个和基类构造函数对应的构造函数
}

今、この:

 

class  B:A
{
    using A::A;
    //关于基类各构造函数的继承一句话搞定
}

8λの

ラムダ式は、実際には、申し出無名関数の同様の機能、および匿名関数が必要としている機能ですが、トラブルが使用する機能の命名に行きたくありません。

次のようにラムダ式の基本的な構文は次のとおりです。

 

[ caputrue ] ( params ) opt -> ret { body; };

1) capture是捕获列表; 
2) params是参数表;(选填) 
3) opt是函数选项;可以填mutable,exception,attribute(选填) 
mutable说明lambda表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获的对象的non-const方法。 
exception说明lambda表达式是否抛出异常以及何种异常。 
attribute用来声明属性。 
4) ret是返回值类型(拖尾返回类型)。(选填) 
5) body是函数体。
  • キャプチャリスト:ラムダ式をアクセスし、そしてどのようにこれらの変数にアクセスすることができ、外部変数のラムダ式をキャプチャ細かいコントロールのリスト。

    1. []変数のいずれかをキャプチャしません。
    2. [b]キャプチャ外部スコープすべての変数、及び(参照により捕捉)関数の本体内の基準として使用されます。
    3. [=]外部スコープに(値取り込みによって)コピーとして体内で使用されるすべての変数と関数をキャプチャします。値は、変数をコピーすることができ、およびラムダ式が作成されたときに呼び出すときに変数のコピーはコピーではなく、撮影していることを前提に撮影していることに注意してください。あなたが外部変数への即時アクセスを呼び出すときは、ラムダ式にしたい場合は、我々は、参照キャプチャを使用する必要があります。
    4. [=、&fooは】外部スコーププレス捕捉FOO参照変数によってすべての変数の値をキャプチャします。
    5. 値キャプチャバー変数によって[バー]は、同時に他の変数をキャプチャしません。
    6. 【これは】現在のクラスにこのポインタをキャプチャし、ラムダ式は、現在のクラスのメンバ関数への同じアクセス権を持っている可能にします。あなたが使用したり、&=した場合は、デフォルトでは、このオプションを追加します。この目的は、ラムダにおける現在のクラスのメンバ関数とメンバ変数を使用して捕捉されます。

9.容器

  • アレイ

スタックメモリに記憶されたSTD ::アレイ、STDに比べヒープメモリ::ベクトルは、我々は、より高い性能が得られ、内部これらの要素にアクセスするための柔軟性を持っています。固定サイズの配列のコンパイル時間を作成し、STD ::配列は、配列は、その種類やサイズの缶を指定:: STDを使用して、ポインタに暗黙的に変換することはできませんが、定数式のサイズを指定するために使用する必要があります。

 

std::array<int, 4> arr= {1,2,3,4};
int len = 4;
std::array<int, len> arr = {1,2,3,4}; // 非法, 数组大小参数必须是常量表达式
  • forward_list

std :: forward_listリストは、容器、方法及び使用実質的に同様のstd ::リストです。
そして、std ::二重にリンクされたリストの異なる実装のリスト、はstd ::片方向リンクリストを使用して達成することがforward_list、高速なランダムアクセスをサポートしていない、複雑さの要素を挿入し(1)Oを提供しても、標準(これは、機能のリストです)ライブラリは、コンテナのユニークな容器サイズ()メソッドを提供していません。何の双方向反復::リストはSTDより良い空間利用がない場合。

  • 順序なしコンテナ

    std :: unordered_map / STD :: unordered_multimap和のstd :: unordered_set / STD :: unordered_multiset。

    順序付けられていないコンテナ要素は、内部ハッシュテーブルによって達成され、挿入及び検索要素O(定数)の平均複雑度をソートされていません。

  • タプル

std :: make_tuple:建設タプル

 

auto student=std::make_tuple(3.8, 'A', "张三");

std ::ネクタイ:タプルアンパック

 

std::tie(gpa, grade, name) = student;

std :: GET:タプルの場所の値を取得

 

auto gpa=std::get<0>(student);

コピーコンストラクタと遷移構造10

 

string a(x);                                         // line 1
string b(x + y);                                    // line 2
string c(some_function_returning_a_string());       // line 3

次のように左、xの最初の行(行1)は、ディープコピーコンストラクタを使用して値(左辺値)です。

 

string(const string& that)
{
    size_t size = strlen(that.data) + 1;
    data = new char[size];
    memcpy(data, that.data, size);
}

次のように2番目のパラメータは、転送コンストラクタを使用して、三行の正しい値です。

 

string(string&& that)   // string&& is an rvalue reference to a string
{
data = that.data;
that.data = 0;
}

奥行きデータは、ヒープメモリが、唯一のコピーポインタ、およびソース・オブジェクト・ブランキングへのポインタをコピーされないからです。実際には、我々は、ソースオブジェクトに属するメモリデータを「盗みます」。ソースオブジェクトが右辺値であるので、使用されないので、顧客が変更されたソースオブジェクトを認識できません。ここで、私たちは本当に私たちは、このコンストラクタは、「移動コンストラクタ」(移動コンストラクタ)と呼ばれて置くので、彼の仕事ではなく、それらをコピーする、あるオブジェクトから別のオブジェクトのリソースをシフトすることである、複製されませんでした。コンパイラはコピーコンストラクタと移動コンストラクタの間の値を選択するために、左または右のパラメータ値に基づいています。

ソースオブジェクト自体は変更してはならないので、コピーコンストラクタディープコピーが行われます。これは、コピーコンストラクタポインタ、ソースオブジェクトのブランキングへのポインタ、ユーザーはもはやオブジェクトを使用することができるため、安全ではありませんこのフォームに転送することができます。

11.move左シフト値

標準ライブラリのヘッダファイルには、テンプレート関数はstd ::を提供に移動<ユーティリティ>。実際には、stdが::移動は、単に自身が何を転送しなかった、左と右の値に値を変換しています。それはちょうどオブジェクトを転送できるようにすることです。

次のようにunique_ptrをのみ、コンストラクタを移動します。

 

unique_ptr(unique_ptr&& source)   // note the rvalue reference
{
    ptr = source.ptr;
    source.ptr = nullptr;
}

割り当てのunique_ptrを対象:

 

unique_ptr<Shape> a(new Triangle);
unique_ptr<Shape> b(a);              // still an error
unique_ptr<Shape> c(std::move(a));   // okay

値が残っているので、2行目は、コンパイルすることができないが、ソース&& unique_ptrをパラメータのみ正しい値を受け入れることができます。第三ラインコンパイラは、3行目は、もはや値に右に移動することにより、目標を持って、問題ありません。

12.explicit

フロントコンストラクタは、明示的な変更を追加し、このコンストラクタは、明示的に型変換演算子は、暗黙的に使用されないよう、/使用を呼び出して指定することができます。一般的なコンストラクタが暗黙的に呼び出すことができます。明示的なコンストラクタは、明示的に呼び出すことができます。

13. =デフォルト/ =削除

デフォルトコンストラクタ、デストラクタ、コピーコンストラクタとコピー代入演算子:C ++クラスは、4つの特別なメンバ関数を持っています。

  • 関数は「=デフォルト」機能は、コンパイラは明示的に宣言されますと宣言された「=デフォルト」機能は、自動的にその関数を生成します。
  • 機能の後のステートメント「=削除;」、機能が無効になることができます。

14.using

  • 名前空間

      using namespace std;
    
  • 声明

      using _basic::_M_allocate;
    
  • テンプレート

      template<typename T>
      using mystring=basic_string<T,char_traits<T>>;
    
  • 関数ポインタ

      using func=void(*)(int,int);
    

15.noexcept

条件が真であるnothrow

 

void foo() noexcept(true){

}

16.override

 

class base{
    virtual void func(float){

    }
}

class Devied:Base{
    virtual void func(float) override{
        //显示的声明为重写函数
    }
}

17.final

クラスに作用し、クラスを表し継承することはできません

 

class Base final{

}

そして、仮想関数の役割は、仮想関数を書き換えることができないことを示しています

 

class Base{
    virtual void f() final;
}

18.スマートポインタ

C ++ 11には、手動でメモリを解放するために、その後不要になったことから、スマートポインタを導入しました。スマートポインタ実際ポインタ通常のパッケージ(すなわち、クラスとしてパッケージ化)、および*オーバーロードによって - 、> 2つの演算子ように通常ポインタ性能等スマートポインタ。shared_ptrの/ unique_ptrを/ weak_ptrを

unique_ptrを

独占ポインタは、コピーすることはできませんか、別のスマートポインタへの代入は、転送所有権を移動することができます

 

unique_ptr<Monster> monster1(new Monster());    //monster1 指向 一个怪物   
unique_ptr<Monster> monster2 = monster1;        //Error!编译期出错,不允许复制指针指向同一个资源。
unique_ptr<Monster> monster3 = move(monster1);  //转移所有权给monster3.   
monster1->doSomething();                    //Oops!monster1指向nullptr,运行期崩溃

shared_ptrの

shared_ptrのは、リソースが解放されていないすべてのshared_ptrがすべて解除され、同じ場所より多くのリソース、を指します。あなたはコピーして代入することができます。

 

{
    shared_ptr<Monster> monster1(new Monster());   //计数加到1
    do{std::shared_ptr<Monster> monster2 = monster1;    //计数加到2
    }while(0);          
  //该栈退出后,计数减为1,monster1指向的堆对象仍存在
    shared_ptr<Monster> monster3 = monster1; //计数加到2
    shared_ptr<Monster> monster4 = monster1; //计数加到3
}
//该栈退出后,shared_ptr都释放了,计数减为0,它们指向的堆对象也能跟着释放.

weak_ptrを

shared_ptrのは、それが唯一のオブジェクトが生き残るために指さかどうかを知るために、リアルタイムで動的に管理するオブジェクトへのアクセス手段を提供するだけでなく、存在を支援することです。弱いポインタを作成するには、すでにリソースを持っていますが、共有のポインタである必要があります。weak_ptrは、共有リソースを追跡するために使用することができますが、実際に自分の、それはリソースの解放を妨げないものではありません。あなたがロックを実行する必要が共有リソースを読む前に、shared_ptrのを取得した後にアクセスすることができます。

 

shared_ptr<Monster> monster1(new Monster());
weak_ptr<Monster> r_monster1 = monster1;
r_monster1->doSomething();  //Error! 编译器出错!weak_ptr没有重载* 和 -> ,无法直接当指针用
shared_ptr<Monster> s_monster1 = r_monster1.lock();//OK!可以通过weak_ptr的lock方法获得shared_ptr。

19.cast型変換

static_cast

内蔵物の種類に関連する基本データ型、列挙型、構造体、INT、チャー、フロート、等、の間の変換、static_castをのみ相互接続されたタイプに変換することが、必ずしも仮想関数が含まれていません。

 

int c=static_cast<int>(7.987);

class A
{};
class B:public A
{};
class C
{};
 
int main()
{
    A* a=new A;
    B* b;
    C* c;
    b=static_cast<B>(a);  // 编译不会报错, B类继承A类
    c=static_cast<B>(a);  // 编译报错, C类与A类没有任何关系
    return 1;
}

const_cast

定数式としての役割の一つのみを変換します。これは、constのconst型または属性の削除のconstへのデータの種類をすることはないだろう。

 

  int a = 10;
  const int *p = &a;    // 被const修饰,不能使用该指针修改其指向内容的值  
  int *q;
  q = const_cast<int *>(p);     // 去除p的常量性给q,如果不去除直接赋值会报错 
  *q = 20; 

reinterpret_castは

任意の2つの無関係なポインタまたは参照変換することができる非常に強力なキャスト、鋳造

dynamic_castを

static_castは、コンパイル時に安全確認を実施する、とのdynamic_castは、操作の過程でセキュリティチェックを行います。どちらも、偏差につながる間違った型変換プログラムを防止するためのセキュリティチェックです。

要約
はstatic_castは、静的セキュリティチェックは、一般的に切り替えるために使用されるであろう組み込み一般データ型と変換クラス。
const_castをとは、主に、ポインタCONST及び参照の揮発性タイプを除去するために使用されます。
変換又はポインタ文字ポインタターン整形として参照ポインタ間には何の関係についてreinterpret_castは。
dynamic_castを一般的にベースと派生クラスの間で変換するために使用されます。



著者:huifeiyuの
リンクします。https://www.jianshu.com/p/b8a36ff7ac27
出典:ジェーンの本は
、著者が著作権を保有しています。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。

公開された101元の記事 ウォン称賛73 ビュー120 000 +

おすすめ

転載: blog.csdn.net/usstmiracle/article/details/104059760