C++参照に関するいくつかの注意点
5084 ワード
C++の参照はまずポインタとの最大の違いは、参照がオブジェクトではなく、ポインタがオブジェクトであることです.次に、参照は定義時に初期化され、ポインタは使用されなくてもよい.
このときrvalはvalにバインドされ、実はrvalはvalの別名である.2つのうちの1つを変更すると、値が変わります.
リファレンスは最初から初期化されているため、1つのリファレンスでは1つの変数しか参照できません.また、参照はオブジェクト、すなわちアドレスのみを参照し、定数や式ではありません.また、タイプは一致します.
References to const定数参照
非常量の参照とは異なり、定数参照で参照されるオブジェクトは変更できません.
ciは定数であるため、ciを変更できないため、ciを直接参照することはできません.
参照は正しい自身を参照するタイプについて説明しましたが、定数参照はconst以外のオブジェクト、数、または式を参照できます.
なぜか考えてみましょう
実はコンパイラは私たちにもっと手伝ってくれました
この無名の中継メモリがあるからこそ、定数参照は数、式、そして異なるタイプのオブジェクトを参照することができます.
では、なぜ非常に多くの引用ができないのでしょうか.
考えてみれば、さっき言ったコンパイラは私たちに中継対象を作ってくれたが、実は私たちはそれを引用し、修正しても修正したが、それは無名で、住所が見つからず、探すことができなかった.修正しても始まらないので、dval(上の列に)を修正します.
したがって、定数参照のみが数値、式、異なるタイプのオブジェクトを参照できます.私たちはそれを修正するつもりはありませんので、その中の遷移量は本当に値を伝達し、定数参照を初期化するだけです.(同じタイプであれば、無名の中継変数を作成する必要はありません.直接初期化に使用してもいいからです.@ Kvtisの指摘に感謝します)
最後の例
これにより、非常量参照と定数参照の両方で値を参照できます.非常に多くの参照はもちろん、オブジェクトに縛られた別名であり、参照を修正すると同時にオブジェクト自体の内容も修正されます.定数参照は、上記と同様に、コンパイラが無名の中継変数を作成して格納します.つまり、定数オブジェクトに値を初期化します.それを修正することはできません.
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
これにより、非常量参照と定数参照の両方で値を参照できます.非常に多くの参照はもちろん、オブジェクトに縛られた別名であり、参照を修正すると同時にオブジェクト自体の内容も修正されます.定数参照は、上記と同様に、コンパイラが無名の中継変数を作成して格納します.つまり、定数オブジェクトに値を初期化します.それを修正することはできません.