c++ 参照 const intとintにバインドするのはなぜですか?




const 意味 (7)

C ++の入門書では、 const int & intオブジェクトとバインドできることがわかりました。const const int &intオブジェクトではなくintオブジェクトとバインドする必要があるため、理解できません。 const int & objectがintバインドされているときにこの質問を説明してください。 この2つの間に一時オブジェクトがあります。たとえば、次のようになります。

int a=0;
const int &r=a;

bを一時的な値として使うことができるので、上記は次のようになります。

const int b=a;
const int &r=b;

しかし、私は本が正しくないと思うrr間に存在するbような一時的なものがaと、 rの値は変更できないが、ビジュアルスタジオで次のコーディングをデバッグすると、 :

int a=0;
const int &r=a;
a=3;
cout<<r<<endl;

出力はr=3; rの値を変更することができます、なぜですか? 私はそれを理解していない。


Answer #1

ConstとReferenceの2つのことがあります。

リファレンスは、同じメモリユニットの別の名前です。 任意の名前を使用して、そのメモリに保持されている値を変更できます。

const参照はC ++で以下のようなコードで表されます。

int j =2; 
int const &i = j; //or Alternatively
const int &i = j;

参照されるオブジェクトを一定にする制限はありません。

ここでは、 iを使ってjの値を変更することはできません。 しかし、これはメモリ位置jを一定にしません.jの値を平和的に変更することはできます。

j =3
//but i = 3 will raise an error saying 
//assignment of read-only reference ‘i’

Answer #2

私はconst int &と思うので、理解していないとconst int & intオブジェクトでバインドする必要があります

あなたは間違っています。 constへの参照(つまり、const参照)は、constオブジェクトだけがバインドできるという意味ではありません。 つまり、参照によってオブジェクトを変更することはできません。

許可されていないのは、非const参照をconstオブジェクトにバインドすることです。そのような参照は、そのconstを破るオブジェクトを変更するために使用できるためです。

rの値を変更することができます、なぜですか?

r参照するオブジェクトは変更されました。オブジェクトはconstではないので問題ありません。 r引き続き同じオブジェクトを参照し、オブジェクトはrを使用して変更されませんでした。

const参照を持つことは、参照されるオブジェクトが変更できないことを意味しません。 つまり、その参照を使用してオブジェクトを変更することはできません。

あなたが変更できないオブジェクトを持つことを望むなら、そのオブジェクト自体はconstでなければなりません。 const参照は、参照されるオブジェクトをconstにしません。 本書では、constオブジェクトを作成する方法を示しました。

const int b=a;

私は参照が誤ってpoisterとして、彼らはいくつかの時間が類似していると考えている。

実際、参照はポインタと非常によく似ています。 この質問の文脈に関して、彼らは同様に行動する。 デモ:

int a=0;
const int *r=&a;
a=3;
cout<<*r<<endl;

Answer #3

この例のconstは、 rが使われる場所ではaが変更できないことを保証するだけです。 通常、次のような入力パラメータを変更しない関数に使用されます。

int doNotModifyFoo(const int &foo);

Answer #4

最初に0である変数aの値がメモリに保持されます。

後で書き出す場合: a=5 、その値をメモリに5設定します。

あなたがリファレンスを書くときには、 const int & r = a; あなたは、 r5が保持されているメモリ内の同じ場所にアクセスする必要があるということだけを言います。

aconstではないため、値を変更できます。

これは基本的にどのように動作するのですか?


Answer #5

基本的には、 const int & rはそれが参照している値を変更しないことを約束します。 これはint &よりも強い保証です。 したがって、 const int & referenceを使用してintを参照することは可能です。 しかし、あなたはそれを変更することはできません。 これは、値に対して可能な操作のサブセットです。 しかし、逆の場合はtrueではありませんconst int値へのint & referenceを取得しようとすると、値自体が不変で、コンパイラエラーが発生し、可変参照を取得しようとしています。この不変の値。 int & referenceで可能な操作は、 const int valueで可能な操作のスーパーセットです。


Answer #6

オブジェクトは、 const参照またはconstのポインタを介して "変更"することはできません。 しかし、 const参照またはconstへのポインタは、基になるオブジェクトに実行時ロックを与えません( constと宣言されていないと仮定して)元の宣言または非const参照または非constへのポインタは、それを変更するために使用されます。

実際にオブジェクトが本来constと宣言されていなかった場合、 const -nessをキャストして、元のオブジェクトを変更するために使用することができます。

実際にオブジェクトが元々 const宣言されていたとしても、これは可能かもしれません(ただし実装に依存します)。

constは、関数(または複数の関数)が(戻り値outまたは宣言の引数として)オブジェクトを変更すべきでないことを示す方法です。

(一般的には)そのオブジェクトや他の参照/ポインタを通してオブジェクトを変更することはできません。

また、参照が参照するものを変更することもできません。 少なくとも、有効な方法はありません。 いくつかの状況では、実際には、参照が保持されている場所のアドレスを取得し、それをポインタのように変更するというジッゲリーポケリーによって可能です。 参照はしばしば存在しないように最適化され、コンパイラは「変更できません」ということを知っているため、このような違反は部分的にしか成功しない場合があるため、通常は状況によっては失敗します。


Answer #7

C ++では、constおよび/またはconstへのポインタを使って非constオブジェクトを参照することができます。

int x = 10;
const int& r = x; //OK
const int* p = &x; //OK

もちろん、xは一定ではないので変更することができます。 しかし、非constオブジェクトへのconst参照を持つことによって基本的に言っていることは、 この参照/ポインタを介してこのオブジェクト変更しないことです。 オブジェクトを直接変更することも、他の参照またはポインタを使用して変更することもできます。

それを読み取り専用ハンドルと考えてください。 はい、オブジェクト自体は変更可能かもしれませんが、多くの場合、変更可能な変数への読み取り専用アクセスを取得したり、提供したりする可能性があります。





reference