詳細はC/C++中const限定符のまとめです。


const限定符
constは、constによって定義される変数の値が変更されてはいけない限定符である。
constの初期化
リストが作成されると、その値は変更できないので、初期化しなければなりません。

const int a;//  ,const         !
const int b=10;//  ,      
const int c=get_size();//  ,      
同じタイプの変数が互いに初期化される場合、変数がconstによって限定されるかどうかにかかわらず、任意に相互コピーができます。コピー中は右変数の右値属性だけを使うので、変更できるかどうかは気にしないでください。

int m = 5;
const int n = m;
int j = n;
constとポインタ
トップレベルのconstと最下層のconst
ポインタについては、他のメモリの特徴を指すため、3つの異なるconstの場合があります。
  • は、定数のポインタ
  • を指す。
  • 定数ポインタ(int*const)
  • は、定数の定数ポインタ
  • を指す。
    私たちは一般的に第一の状況に合致するのは下地層のconst属性を持つと言われています。
    第二の場合に該当するのはトップレベルのconst属性である。
    第三の状況を兼ね備える。
    constを伴うポインタの相互割当(または初期化)について
  • トップレベルのconstは、変数間の相互コピーに影響を及ぼさない(トップレベルのconstは、自身の値が変わらないだけであり、constは自身の変数タイプを変更せず、コピー時にはそのタイプの右値のみを使用する)。
  • 等号の右側が下のconstである場合、等号の左側は同じ下のconst(または等号の右側のタイプが等号の左のタイプに変換できる)を保証しなければなりません。
  • 最下階とトップレベルのコンサートについてのいくつかの考え
    constの最下部と最上階部のプロパティはポインタのみに存在するようです。しかし、c+primerにはこのようなコードとコメントがあります。
    
    const int ci=1,&cr=ci;
    auto b=ci;//b     (ci   const       )
    auto c=cr;//c     (cr ci   ,ci       const)
    このコードは、aut引数を説明するために、一般的にトップレベルのconstの特性を無視し、コメントにci自体がトップレベルのconstであることが明記されている。
    これも私の意見と一致しています。最下階と最上層のconstは、実際にはポインタに特有のものではなく、オブジェクト自体を変えることができないオブジェクトがトップレベルのconstを持っています。
    この角度から見ると、トップレベルのコンサートは実際に持参されています。
    下のconstの暗黙的な変換
    上に述べたように、等号の右側と等号の左側のタイプだけが同じ下層のconst属性を持っています。
    しかし、等号の右側には等号左と一致しない下部のconstがある場合があります。これは等号の右側のタイプが暗黙的に変換され、等号左のタイプと同じ底のconst属性を持つからです。
    たとえば:
    
    int i=5;
    int *p=&i;
    const int *cp=p//int*       const int*
    なぜintをconst intに変換することが合法的に設定されているのか、intをconst intに変換する過程でユーザの権限が小さくなり、この変換過程でプログラムが信頼できなくなります。
    このように、非下地のconstの指針は、暗黙的にベースのconstに変換できることを知ることができる。
    constと引用
    参照をconstの変数に結び付けることができ、constの参照と称し、定数の参照とすることができます。
    通常の参照とは異なり、定数に対する参照は、バインディングされたオブジェクトを変更するために使用されません。
    
    const int ci=5;
    const int &r=ci;
    r=6//              
    int &r2=ci//  ,                  。
    const引用の初期化
    参照に対して初期化するときは必ず一つのオブジェクトで初期化し、そのオブジェクトのタイプはこれと一致する必要があることを知っています。
    しかし、constの参照は例外です。定数参照を初期化する際には、任意の表現を初期値として使用することができます。この表式の結果は参照の種類に変換すればよく、バインディングされた非常量のオブジェクト、ワード値、または表式にも許容されます。
    
    int i=42;
    const int &r1=i;//   const int&       int   
    const int &r2=3.14;//  :r2       
    const int &r3=r1*2;//  :r3       
    int &r4 =r1*2;//  ,              
    C+primerでは、このようにすることができる理由を示しています。
    この例外の原因を理解するには、一番簡単な方法は一つの定数参照が他のタイプに結び付けられた時にいったい何が起こったかを明らかにすることです。
    
    double dval=3.14;
    const int &ri=dval;
    ここでriは一つのint型の数を引用しています。リの操作は整数演算であるべきですが、dvdは整数ではなくダブル精度の浮動小数点数です。したがって、リを整数に結合させるために、コンパイラは上記のコードを次のような形にしました。
    
    const int temp=dval;//                  
    const int &ri=temp;// ri       
    この場合,riは一時的な量のオブジェクトを結びつけた。一時量オブジェクトとは、コンパイラが表現の評価結果を一時的に保存するために空間を必要とするときに、一時的に作成した名前のないオブジェクトのことです。C++プログラマたちはしばしば臨時量の対象を臨時量と略称します。
    constとautタイプの説明符
    autタイプの引数は、C+11に新しく導入されたタイプの引数で、自動的にタイプを推論することができます。
    コンパイラから推測されるautタイプは、初期値のタイプとは異なる場合があります。コンパイラは、初期化規則に適合するように適切に結果のタイプを変更します。
    autはconstがあるオブジェクトを推定する時、コンパイラは一般的にトップレベルのconstを無視します。また、引用には真の実体がないので、1つの引用でautタイプを初期化する場合、autは実際に参照対象のタイプであり、引用ではなく引用タイプであると説明するにはaut&を用いる必要がある。
    
    const int ci=i,&cr=ci;
    auto b=ci;//b     (ci   const       )
    auto c=cr;//c     (cr ci   ,ci       const)
    auto d=&i;//d       (              )
    auto e=&ci;//e            (             const)
    推定したいautタイプがトップレベルのconstである場合、明確な指摘が必要である。
    const aut f=ci;//ciのプロモーションタイプはintであり、fはconst intである。
    締め括りをつける
    以上は小编でご绍介したC/C++中const限定の缔めくくりです。皆様のご协力をお愿いします。