2012-02-03 7 views
5

は何この引数はこの関数に渡して、このコードはC++プライマーにfine.according作品C++機能:

int func(const int &i) 
{ 
    /* */ 
} 

int main() 
{ 
    int j = 1; 
    func(j); // pass non const argument to const reference 
    j=2; // reassign j 
} 

、私はconst参照引数のパスを受け入れる機能を持っていると仮定const参照パラメータに非constの引数を渡しますで、次のように、私は、jの同義語(エイリアス)である

int j=1; 
const int &i = j; 

私の質問です:私は、jの同義語であり、私はconstのように定義されている場合、I Sコード:

のconst int型は& I = J

は、変数をconstのために非constの変数をredelcare?なぜこの式がC++で合法であるのですか?

答えて

12

参照はオブジェクトではなくconstです。オブジェクトが変更可能であるという事実は変更されませんが、変更可能なオブジェクトの名前(j)とそうでないもの(i)があります。 const参照パラメータの場合には、これは(それはそれのためにその名前を使用するので、j)をmainオブジェクトを修正することができることを意味

funcは、それが唯一のために、その名前を使用するようにオブジェクトを変更することができないのに対しそれは、iです。 funcは原則としてconst_castでもう1つのリファレンスまたはそれへのポインタを作成してオブジェクトを修正することはできますが、修正することはできません。

+0

あなたは参照がオブジェクト自体ではないことを意味します。どのように私はjの同義語を理解するのですか? iとjの両方が同じ物理アドレスを持つので、iとjが同じオブジェクトであることを意味しますか? – fuyi

+0

iはオブジェクトjの代替参照です。だから同義語。あなたは、それが参照しているオブジェクトを変更するために '私'を使用することはできないと言ってきました。私が言及しているオブジェクトを変更する他の方法を使用することはできません。 あなたは、その宣言を使ってiを拡張しようとしているのではなく、その機能を制限しています。 –

+1

@ xiaopang:「i」と「j」は名前です。それらは両方とも同じオブジェクトを参照します。しばしば、何かがその名前であること、またはその名前がオブジェクトであると言うことです。たとえば、私は「私はスティーブです」と言うかもしれません。しかし、これは不正確な用語であり、2つは同じではありません。また、「スティーヴは首都Sで始まる」と言うこともできます。それは* I *が資本 'S'で始まることを意味するものではありません。 「スティーブ」の周りの引用符は、それが指しているオブジェクトではなく名前について話していることを示すためにそこにあります。 'i'と' j'は同じオブジェクトの両方の名前であるため同義語ですが、名前としてのプロパティは異なります。 –

3
const int &i = j; 

これは、定数の参照を宣言します。 この参照を使用すると、参照する整数の値を変更することはできません。

元の変数名jを使用して値を変更することはできますが、定数参照iを使用しないだけです。