現代C++学習ノートの二入門編1

5699 ワード

現代C++強調:
  • スタックまたは静的グローバル範囲ではなくスタックベースの範囲.
  • 明示的なタイプ名ではなく自動タイプ推論.
  • 元のポインタではなくスマートポインタ.
  • std::stringおよびstd::wstringタイプ(元のchar[]配列ではなく<string>を参照).
  • 標準テンプレートライブラリ(STL)元の配列やカスタムコンテナではなくvector、list、mapなどのコンテナ.<vector><list>・および<map>を参照.
  • STLアルゴリズム手動符号化のアルゴリズムではない.
  • 異常、エラー条件の報告・処理が可能.
  • STL std::atomic<>(参照<atomic>)を使用し、他のスレッド間通信機構のロックレススレッド間通信ではない.
  • インラインLambda関数単独で実現される小関数ではない.
  • 範囲のforループに基づいて、配列、STLコンテナ、Windowsランタイムセットをfor(for-range-declaration:expression)形式で使用するより信頼性の高いループを記述する.これはコア言語サポートの一部です.詳細については、範囲ベースfor文(C++)を参照してください.

  • 従来のC+:
     1 // circle and shape are user-defined types
    
     2 circle* p = new circle( 42 ); 
    
     3 vector<shape*> v = load_shapes();
    
     4 
    
     5 for( vector<circle*>::iterator i = v.begin(); i != v.end(); ++i ) {
    
     6     if( *i && **i == *p )
    
     7         cout << **i << “ is a match
    ”;
    8 } 9 10 for( vector<circle*>::iterator i = v.begin(); 11 i != v.end(); ++i ) { 12 delete *i; // not exception safe 13 } 14 15 delete p;

     
    現代C+:
    #include <memory>
    
    #include <vector>
    
    // ...
    
    // circle and shape are user-defined types
    
    auto p = make_shared<circle>( 42 );
    
    vector<shared_ptr<shape>> v = load_shapes();
    
    
    
    for_each( begin(v), end(v), [&]( const shared_ptr<shape>& s ) {
    
        if( s && *s == *p )
    
            cout << *s << " is a match
    "; } );

     
    現代のC++では、new/deleteや明示的な異常処理を使用する必要はありません.スマートポインタを使用して置き換えることができるからです.オートタイプ導出とLambda関数を使用すると、コードをより速く記述し、コードを強化し、コードをよりよく理解することができます. for_eachはforサイクルよりも清潔で使いやすく、予期せぬエラーが発生しにくい.サンプルと最小行数のコードを使用してアプリケーションを記述できます.コードが異常に安全で、メモリが安全で、処理する割り当て/割り当て解除またはエラーコードがないことを確認できます.
    現代C++統合の2つの多態性:コンパイル時(テンプレート経由)と実行時(継承と仮想化により).この2つのマルチステートを混在させて効果を高めることができます.STLテンプレートshared_ptrは内部仮想メソッドを使用してタイプ消去を極めて簡単に行います.ただし、テンプレートがより良い選択である場合は、マルチステートの仮想化を過度に使用しないでください.テンプレートは非常に強力です.
    他の言語から(特にマネージド言語では、ほとんどのタイプが参照タイプで、ほとんどのタイプが値タイプ)がC++に変換されます.C++クラスはデフォルトでは値タイプであることに注意してください.ただし、これらのC++クラスを参照タイプとして指定することで、オブジェクト向けのプログラミングをサポートするためのマルチステート動作を実現できます.値タイプはメモリおよびレイアウト制御に関連し、参照タイプは、マルチステート性をサポートするベースクラスと仮想関数に関連しています.デフォルトでは、値タイプはコピーできます.各値タイプには、コピーコンストラクタとコピー付与演算子があります.参照タイプを指定する場合は、クラスを複製不可に設定し(複製コンストラクタと複製付与演算子を無効にします)、多態性をサポートする仮想解析関数を使用します.値タイプはコンテンツにも関係し、複製すると、個別に変更できる2つの独立した値が提供されます.ただし、参照タイプはID(オブジェクトタイプ)に関係するため、マルチステートタイプと呼ばれる場合があります.
    C++は再び機能が最も重要な位置を占めているため、再び興った.プログラマーの生産性が重要な場合、JavaやC#などの言語は良い選択ですが、機能やパフォーマンスが重要な場合、このような言語は自分の制限を露呈します.高効率で強力な機能を実現するには、特にハードウェアが限られているデバイスでは、現代のC++に匹敵しません.
     
    PS:個人的にはC++が再び興ることができると思います.携帯電話などの端末の発展のおかげです.結局、端末装置がデスクトップのようにプログラミングすることはできません.ハードウェアのプログラミングを考慮する必要はありません.