C++参照に関するいくつかの注意点

5084 ワード

C++の参照はまずポインタとの最大の違いは、参照がオブジェクトではなく、ポインタがオブジェクトであることです.次に、参照は定義時に初期化され、ポインタは使用されなくてもよい.
int    val = 42;

int    &rval = val;

このときrvalはvalにバインドされ、実はrvalはvalの別名である.2つのうちの1つを変更すると、値が変わります.
リファレンスは最初から初期化されているため、1つのリファレンスでは1つの変数しか参照できません.また、参照はオブジェクト、すなわちアドレスのみを参照し、定数や式ではありません.また、タイプは一致します.
int    &rval = 10;    //error: initializer must be an object

double    dval = 3.14;

int    &rdval = dval;    //error: initializer must be an int object

References to const定数参照
非常量の参照とは異なり、定数参照で参照されるオブジェクトは変更できません.
const    int    ci = 1024;

const    int    &r1 = ci;

r1 = 42;    //error: r1 is a reference to const

int    &r2 = ci;    //error: nonconst reference to a const object

ciは定数であるため、ciを変更できないため、ciを直接参照することはできません.
参照は正しい自身を参照するタイプについて説明しましたが、定数参照はconst以外のオブジェクト、数、または式を参照できます.
int    i = 42;

const    int    &r1 = i;       //ok

const    int    &r2 = 42;    //ok 

const    int    &r3 = r1 * 2;  //ok

int    &r4 = r * 2;    //error:               

なぜか考えてみましょう
double    dval = 3014;

const    int    &ri = dval;    //ok

実はコンパイラは私たちにもっと手伝ってくれました
double    dval = 3014;

const    int    temp = dval;    //              dval             

const    int    &ri = temp;      //           

この無名の中継メモリがあるからこそ、定数参照は数、式、そして異なるタイプのオブジェクトを参照することができます.
では、なぜ非常に多くの引用ができないのでしょうか.
考えてみれば、さっき言ったコンパイラは私たちに中継対象を作ってくれたが、実は私たちはそれを引用し、修正しても修正したが、それは無名で、住所が見つからず、探すことができなかった.修正しても始まらないので、dval(上の列に)を修正します.
したがって、定数参照のみが数値、式、異なるタイプのオブジェクトを参照できます.私たちはそれを修正するつもりはありませんので、その中の遷移量は本当に値を伝達し、定数参照を初期化するだけです.(同じタイプであれば、無名の中継変数を作成する必要はありません.直接初期化に使用してもいいからです.@ Kvtisの指摘に感謝します)
最後の例
int    i = 42;

int    &r1 = i;

const    int    &r2 = i;

r1 = 0;    //ok

r2 = 0;    //error

 
これにより、非常量参照と定数参照の両方で値を参照できます.非常に多くの参照はもちろん、オブジェクトに縛られた別名であり、参照を修正すると同時にオブジェクト自体の内容も修正されます.定数参照は、上記と同様に、コンパイラが無名の中継変数を作成して格納します.つまり、定数オブジェクトに値を初期化します.それを修正することはできません.