[GeekBand][C++オブジェクト向け高度プログラミング(下)]4週目ノート

3768 ワード

第四週目の内容は比較的にばらばらで、大綱は以下の通りである.
  • Conversion Function
  • non-explicit one argument constructor
  • pointer-like classes
  • Function-like classes
  • namespace経験談
  • class template
  • Function Template
  • Member Template
  • specialization
  • テンプレート偏特化
  • テンプレートパラメータ
  • C++標準ライブラリについて
  • 三つのテーマ
  • Reference
  • 複合&継承関係における構造と析構
  • 4週目の内容も相対的にばらばらで,虚関数ポインタvptr,虚関数テーブルvtbl,thisポインタ,動的バインドDynamic Bindingがある.メンバー関数についても後述する.いくらでも書けるでしょう.
  • Conversion Function
  • Operator    (){    }
    

    例えば、この例では、
    #include
    using namespace std;
    class Fraction
    {
    public:
        Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den) { }
        operator double( ) const 
        { 
            cout<

    変換関数は、関数名の前に関数タイプを指定することはできません.関数にもパラメータはありません.constを付けるかどうかは、変換後の結果から判断し、constを付けるのが一般的です.使用中は、タイプ変換関数を表示する必要がなく、自動的に呼び出される、すなわち暗黙的に呼び出されることが多い.
    23変換コンストラクション関数:1つのパラメータのコンストラクション関数(または、最初のパラメータを除く残りのパラメータにデフォルト値のマルチパラメトリックコンストラクション関数).
    コンストラクタとデフォルトで暗黙的なタイプ変換オペレータの2つの役割があります.
  • キーワードexplicit:
  • Explicitは暗黙的な変換を防止するために使用され、通常のコンストラクション関数は暗黙的に呼び出されることができますが、explicitコンストラクション関数は呼び出しを表示するしかありません.
    non-explicit-one-argument ctorは、次のように、単一のパラメトリック構造関数を暗黙的に変換できます.
    #include
    using namespace std;
    class Fraction
    {
    public:
        Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den)
        { 
            cout<m_numerator+f.m_numerator, this->m_denominator+f.m_denominator);
        }
    
        int getNumerator() const {return m_numerator;}
        int getDenominator() const {return m_denominator;}
    
    private:
        int m_numerator;    //  
        int m_denominator;  //  
    };
    
    ostream& operator<
  • shared_ptrはスマートポインタ(smart point)で、shared_ptrが1つのオブジェクトを共有する回数を記録します.最後のオブジェクトを指すポインタが破棄されると、そのオブジェクトは自動的に削除されます.
  • **shared_ptr sp(new int(10));                //       shared_ptr    
    assert(sp.unique());                            //  shared_ptr              
    shared_ptr sp2 = sp;                       //   shared_ptr,           
    assert(sp == sp2 && sp.use_count() == 2);       //  shared_ptr  ,       ,     2    
    *sp2 = 100;                                     //                  
    assert(*sp == 100);                             //   shared_ptr           
    sp.reset();                                     //  shared_ptr       
    assert(!sp);                                    //sp        (   ) 
    **
    

    ネット上の例.
  • 反復器(iterator)
  • 反復器は、コンテナ内のオブジェクトへのアクセス方法を提供し、コンテナ内のオブジェクトの範囲を定義します.反復器はポインタのようなものです.
  • typename今週の授業では、汎用プログラミングでtypenameとclassの違いが具体的に説明されました.侯先生も言ったが、テンプレート声明にはまったく違いがない.侯先生もテンプレートの中での使用には少し違いがあると言いました.しかし、紙面と時間の制限に限られ、侯先生は深く議論していないので、このノートではtypenameとclassの違いについて議論します.たとえば、コンテナ内のすべての要素を印刷できるテンプレート関数があります.下図のようにtypenameがなくても関数は実行できます.

  • しかし、自分の容器類を書くとconstだけでなくiteratorという反復器タイプで、constという静的変数もあります.iterator.このときコンパイラに解析エラーが発生します.静的変数はクラス名::変数名を使用して呼び出すことができることを知っています.だからT::const_iteratorはタイプ名だけでなく変数名でもあり、typenameを追加します.
  • 範囲for文
  • C++11は、コンテナまたは他のシーケンスのすべての要素を遍歴するためのより簡単なfor文を新たに導入した.
    構文:
    for(declaration : expression){
    
             ……
    
    }
    

    expressionは遍歴する容器です
    declarationは変数タイプで、コンテナ内の要素を格納するために使用されます.コンテナ内の要素タイプが不明な場合はautoタイプ説明子を使用します.
    例:
    vector v={0,1,2,3,4,5,6,7,8,9};
    
    for(auto r:v)
    
    {
    
             cout<

    上記のコードではautoについて言及しています.これはタイプ説明子です.
    プログラミングでは、表現の値を変数に割り当てることがしばしば必要であり、変数を宣言する際に式のタイプを明確に知る必要があるが、それができないことが多いため、autoタイプ説明子を導入し、コンパイラに初期値で変数のタイプを推定させる.したがって、auto定義の変数には必ず初期値が必要です.
    6.[GeekBand][C++オブジェクト向けの高度なプログラミング(下)]第4週目のジョブ解答はこちら