C++メモ:参照、ポインタ、const制限子

11868 ワード

参照
  • 参照は初期化する必要があります.すなわち、参照は「生」から別のオブジェクトにバインドする必要があり、「一から終わる」
  • でなければなりません.
  • 参照はオブジェクトにバインドする必要があり、フォント値または式計算結果
  • にバインドすることはできません.
  • 参照のタイプは、バインドされたオブジェクトと厳密に一致しますが、2つの例外があります.
  • 定数参照は、タイプが
  • に一致する限り、非常量、式、またはフォント値にバインドすることができる.
  • は、ベースクラスの参照を派生クラスオブジェクト上の
  • にバインドすることができる.
  • 参照自体はオブジェクトではないため、参照に対する参照
  • は存在しない.
    double value = 3.14159;
    double &ref_value = value;
    double &ref1;                       // error: 'ref1' declared as reference but not initialized
    double &ref2 = 3.14159;             // error: cannot bind non-const lvalue reference of type 
                                        // 'double&' to an rvalue of type 'double'
    double &ref3 = 3.14159 * value;     // error: cannot bind non-const lvalue reference of type 
                                        // 'double&' to an rvalue of type 'double'
    int ival = 1;
    double &iref = ival;                // error: invalid initialization of reference of type 
                                        // 'double&' from expression of type 'int'
    double &ref_ref_value = ref_value;
    

    ししん
  • ポインタのタイプは、そのポインタが指すオブジェクトと厳密に一致しますが、2つの例外があります.
  • は、タイプが
  • に一致する限り、定数を指すポインタを非常量を指すことができる.
  • は、ベースクラスのポインタを派生クラスオブジェクト
  • に向けることができる.
  • 参照はオブジェクトではないため、参照を指すポインタ
  • は存在しない.
  • 字面値nullptrを用いる空ポインタ
  • を得る.
  • は、すべてのポインタを初期化し、オブジェクトを定義してからポインタを定義することを推奨します.ポインタがどこを指すべきか分からない場合は、nullptrまたは0
  • に初期化します.const修飾子
  • constオブジェクトは初期化する必要があり、一度作成するとその値は変更できないため、constオブジェクト上でのみその内容を変更する操作
  • を実行することができる.
  • あるオブジェクトを利用して別のオブジェクトを初期化する場合、それらがconstであるかどうかは重要ではない
  • である.
    const int buffer_size = 1024;
    int buffer1 = buffer_size;
    const int buffer2 = buffer1;
    const double value2;    // error: uninitialized const 'value2'
    
  • のデフォルトでは、constオブジェクトはファイル内でのみ有効に設定されています.複数のファイルに同じ名前のconst変数が表示される場合、異なるファイルで独立した変数がそれぞれ定義されていることに等しい.constオブジェクトを複数のファイル間で共有するには、externキーワード
  • を変数の宣言および定義の前に追加する必要があります.
    // file1.cpp
    extern const int buffer_size = 512;
    // file2.cpp
    extern const int buffer_size;
    
    constへの参照
  • 定数参照を定数にバインドできます.両方とも変更できません.
  • const int buffer_size = 1024;
    const int &ref_buffer_size = buffer_size;
    
  • はまた、タイプが一致する限り、定数参照を非常量にバインドすることもできる.ただし、参照によって非常量の値を変更することは許されないが、非常量の値は他の方法で変更することができる:
  • double value = 3.14159;
    const double &ref_value = value;
    value = 1.0;      // ref_value = 1.0
    ref_value = 3.0;  // error: assignment of read-only reference 'ref_value'
    
  • はまた、定数参照をタイプマッチング式またはフォント値:
  • にバインドすることもできる.
    const int &ref1 = 1024;
    const int &ref2 = ref1 * 2;
    
  • では、非常量参照を定数オブジェクトにバインドすることはできません.これは、非常量参照によって定数オブジェクトを変更するリスクがあるためです.
  • const int buffer_size = 1024;
    int &ref_buffer_size = buffer_size;   // error: invalid initialization of reference of 
                                          // type 'int&' from expression of type 'const int'
    
    constへのポインタ
    const double value = 3.14159;
    const double *p_value = &value;
    double *p_value2 = &value; // error: invalid conversion from 'const double*' to 'double*' 
    
  • valueは定数であるため、ポインタによってその値を変更することはできないので、通常のポインタを定数
  • に向けることは許されない.
  • constを指すポインタは、非常量を指すことができるが、そのポインタによってその指すオブジェクトの値を変更することは許されない:
  • .
    double sqrt2 = 1.414;
    const double *p_sqrt2 = &sqrt2;
    *p_sqrt2 = 1.732; // error: assignment of read-only location '* p_sqrt2'
                      //    sqrt2     ,   p_sqrt2       sqrt2     
                      //      sqrt2           
    

    非常量のconstポインタを指す
  • のポインタ自体はconstであるため、その値は変更することができず、つまりconstのポインタを他のオブジェクトに向けることができないため、constのポインタは
  • を初期化する必要がある.
    double value = 3.14159;
    double *const p_value = &value;
    value = 1.0;        // value     ,     
    *p_value = 2.0;     // value = 2.0,p_value      const    ,       value   
    double sqrt2 = 1.414;
    p_value = &sqrt2;   // error: assignment of read-only variable 'p_value'
    
  • ポインタ自体がconstであるにもかかわらず、そのポインタが指す値が非常に多い場合、ポインタ自体の値
  • を変更することなく、ポインタによってそのポインタが指すオブジェクトを修正することができる.constへのconstポインタ
    const double value = 3.14159const double *const p_value = &value;
    
  • このときのポインタおよびそのポインタの値は、
  • を変更することはできない.
    最上階const
  • 最上階const:ポインタ自体がconst
  • である.
  • 下位const:ポインタが指すオブジェクトがconst、または参照バインドされたオブジェクトがconst
  • である.
  • オブジェクトのコピー操作を実行する場合、コピーおよびコピーされたオブジェクトは、同じ下位const資格
  • を有する必要がある.