C++定数詳細解一(定数ポインタと定数参照の初期化)

3517 ワード

1、定数
1.1.定数の初期化:constオブジェクトが作成されると、その値は変更できないので、constオブジェクトは初期化しなければならない.ここではconst int*pやconst int&rのようにconstオブジェクトではないことに注意します.const int*pはpによってpが指すオブジェクトの値を変えることができないことを示すだけで、pの値は変えることができるので、pは初期化しなくてもよい.rについては,参照自体がオブジェクトではないので,rもconstオブジェクトではないが,rが一定に初期化されるのは,参照が初期化されなければならないからである.以上の内容については、下位constがconstオブジェクトではなく、const*const p 1のように初期化する必要があります.これはconstオブジェクトです.上位constがあるからです.
1.1.1 constオブジェクトを特定したら、まずconstオブジェクトに目を向けましょう.
constオブジェクトは、大きく3つに分類できます.

 const int m
 int *const p
 const int *const q

これらの前の2つのクラスは、非constオブジェクトまたはconstオブジェクトを初期化するために使用できます.前の2つのクラスは最上位のconstであるため、初期化時のコピーは自身の値に何の変化もありません.つまり、以下のコードは正しいです.

//   
int m1=m;//  
const int m2=m;//  
//   
int *p1=p;//  
int *const p2=p;//  
const int *p3=p;//  
const int *const p4=p;//    

3番目のクラスには、3番目のクラスには下位constがあるので注意する必要があります.const int *const q

int *q1=q;//  
int *const q2=q;//  
const int *q3=q;//  
const int *const q4=q;//  

下位constには、オブジェクトのコピー操作を実行するときに、コピーおよびコピーされたオブジェクトが同じ下位constを持つ必要があるという制限があります.const int*const qがq 1,q 2にコピーして初期化できれば、q 1,q 1でqが指すオブジェクトの値を変えることができることを意味するが、qの下位constには何の意味があるのだろうか.
以上、この3つのクラスがどのオブジェクトを初期化できるかということですが、この3つのクラスを初期化できるものを見てみましょう.
第1クラスconst int m

//          ,        。
int m1;
const int m2;
const int m=m1;//  
const int m=m2;//  

第2類int*const p

//          ,        。
int *p1;
int *const p2;
const int *p3;
const int *const p4;

int *const p=p1;//  
int *const p=p2;//  
int *const p=p3;//  
int *const p=p4;//  

ここでのエラーは、下位constにも制限があるためです.オブジェクトのコピー操作を実行する場合、コピーおよびコピーされたオブジェクトは同じ下位constを持つ必要があります.
第3類const int*const q

//          ,        。
int *q1;
int *const q2;
const int *q3;
const int *const q4;

const int *const q=q1;//  
const int *const q=q2;//  
const int *const q=q3;//  
const int *const q=q4;//  

1.1.2非constオブジェクトの初期化に目を向けましょう.ここには主に2つの種類があります.

//          ,        。
const int *p;
const int &r;

まず、どのオブジェクトに第1クラスconst int*pを初期化できるかを考慮します.

//          ,        。
int *p1=p;//  
int *const p2=p;//  
const int *p3=p;//  
const int *const p4=p;//  

ここでも同様に低層constの制限により
第2クラスconst int&r

//          ,        。
int &r1=r;//  
const int &r2=r;//  

ここで強調すると、参照はオブジェクトではないので、int*const&rやconst int*const&rのような形式はありません.
では、最初のクラスconst int*pを初期化できるものを考えてみましょう.

//          ,        。
int *p1;
int *const p2;
const int *p3;
const int *const p4;

const int *p=p1;//  
const int *p=p2;//  
const int *p=p3;//  
const int *p=p4;//  

const int*pは、pによってその指すオブジェクトの値を変更できないことを意味するため、このオブジェクトは定数ではなくてもよいが、pが指すオブジェクトはpにとって定数であるため、その指すオブジェクトがconstであるかどうかは実際には関係ない.
第2クラスconst int&r

//          ,        。
int &r1;
const int &r2;
const int &r=r1;//  
const int &r=r2;//  

ここでconstとは、rによって参照されるオブジェクトを変更することはできないので、参照されるオブジェクト自体がconstであるかどうかは関係ありません.以上のエラーを見渡すと,下位constコピーを下位constのないオブジェクトに初期化しようとした.以上,定数に関わるポインタと参照の初期化について説明した.