2011-12-26 8 views
6

私はC++を学ぼうとしています。私は、コード、C++での参照の明確化

int x = 0; 
int &y = x; 
cout << &x<< " " << x << " " << &y << " " <<y<< endl; 

これは罰金コンパイルした結果であります:

0 003AFA08 0 003AFA08 

私はトラブル& Y、参照へのx、int型の変換は、しない理由を理解している何エラーが発生します。最初はそれが何らかの変換だと思っていましたが、

int &y = &x; 

エラーが発生します。

誰でもこのように動作する理由を説明できますか?前もって感謝します。

+0

なぜストリーム挿入演算子 '<<'が変数のアドレスを数値の16進数文字列にすることができるのか知りたいのですが、 'int'(int型の型)のアドレスを代入することはできません'int 'に? – bobbymcr

+3

私はそれが '003AFA08 0 003AFA08 0' – onemach

答えて

11

int&は、アドレスではありません。 参照です。

int& y = x;は、xへの参照としてyと宣言しています。効果的には、yxの別の名前になることを意味します。 yを使用するたびに、それはxと同じです。

アドレスを格納するためにポインタ(参照ではない)が使用されます。 &xのアドレスがxint*)のため、int& y = &x;は無効です。 yは、intへの参照であり、int*への参照ではありません。

+1

だと思っています。ちょうどC++をもっと意味を成すようにしてくれてありがとう... – jozefg

+0

厳密に言うと、'&x'は* 'x'の*アドレスではなく* "&'演算子は* address-of *と呼ばれますが、x: – fredoverflow

+1

@FredOverflow: "オブジェクトポインタ型の有効な値は、メモリ内のバイトのアドレスかヌルポインタのどちらかを表します。私のために十分に近い。 :) – GManNickG

5

これは変換ではありません。変数タイプがT &の場合、Tはランダムなタイプですが、基本的には "私は別の名前のエイリアスまたはおそらく匿名の値を宣言しています。"ポインタよりもtypedefに似ています。

参考文献はしばしばアドレスとして実装されることがありますが、それはそれらが何であるかを考える良いモデルではありません。あなたは当惑しているあなたの例では

int * const &y = &x; 

はうまく動作します。次に、yは、xというアドレスをとった一時的な結果のエイリアスになります。ポインターへの参照であることに注意してください。これは一時的な値への参照であるため、定数ポインタへの参照でなければなりません。

1

あなたの問題は、&yは単なるアドレスではなく、参照です。つまり、xのコピーのように動作します。それは変換されず、実際にはxの別の名前になっています。

2

&yは単なるアドレスではなく、参考になります。これは

int &y = x; 

yの名前でxのクローンを作ることを意味します。