2012-04-13 16 views
0

することは、私たちは、ポインタを再割り当てすることができますまたはクラスが内部で変更することができるかどうかを制御し、このように、なぜcant const参照はポインタと同じ方法で返されますか?私たちは関数からポインタを返す場合

const X* f(); 

または

X* const f(); 

のいずれかを書き込むことができます。しかし、参照を返すときに、これらの2つが同じ意味を持っているようだ:あなたがそれを再割り当てXを変更することはできませんが、参照を返すことは不可能と思われる

const X& f(); 
X& const f(); 

を?実際には不可能な場合は、ポインタがこの領域で有効に見えるときに参照を返すのはなぜですか?

更新:指摘されているように、参照を再割り当てすることはできません。しかし、これは、私が予想したように、次のコードが33 55ではなく33 33を出力するので、私はさらに困惑します。その参照との一致はどのようにして再割り当てできませんか?

struct X 
{ 
    X(int i_) { i = i_;} 
    int i; 
}; 

struct Y 
{ 
    X& get2() {tmp2 = new X(55); return *tmp2;} 
    X& get() {tmp = new X(33); return *tmp;}  
    void print() {cout << tmp->i << endl;} 
    X* tmp; 
    X* tmp2; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Y y;  
    X& tmp2 = y.get2(); 
    X& tmp = y.get();  
    y.print(); 
    tmp = tmp2; 
    y.print(); 
    return 0; 
} 
+0

'X&constのfは();'ナンセンス参照です:http://www.parashift.com/c++-faq-lite/const-correctness.html – EdChum

+0

は、なぜあなたは期待しています"33 33"、あなたはtmp2に 'tmp2'を割り当てましたか? –

答えて

10

あなたがそれを再割り当てXを変更することはできませんが、参照を返すことは不可能と思われますか?

参照を再割り当てすることはできません。彼らは初期化時に同じ参照先を参照し続けます。

なぜポインタがこの領域で強力に見えるときに参照を返すべきですか?

リファレンスの使用量は、より直感的で、機能の呼び出し元は、単にユーザーが参照解除などで

+4

ポインタを介して参照を返すもう一つの理由は、null参照が許可されていないため(有効なC++で)有効なオブジェクト/関数を指すことです。したがって、呼び出しコードはNULLの場合を処理する必要はなく、NULLポインタを逆参照するなどの問題を回避できます。もちろん、あなたの呼び出しコードが関数がNULLポインタを返すことはないことを事前に知っているならば、NULLの場合を心配する必要はありませんが、代わりに参照を使ってこの保証を明示的に「文書化」します。 –

+0

@PreetKukreti:はい、それは確かに真実です。 –

+0

[OK]を、私は私の質問を更新しましたが、参照が再割り当て不可であった場合に私は気にしませんでした – Frank

2

最初の2つの例は同じではありません。おそらく

const X* f(); 
X const* f(); 

を意味し、あなたが実際に参照して同じことを書くことができます。

const X& f(); 
X const& f(); 

宣言X* const f();は多くの意味がありません。いずれにしても、返されたポインタを変更することはできません。それはただの価値です。値(つまりf()->foo())を使用するか、値を保存します(例:X* copy = f();)。値を格納すると、const値は値自体ではなく値を格納した変数にのみ依存します。 4が定数なので、int x = 4; - xをconstにしないでください。

0

を対処する必要があるのポインタとは異なり、変数のように参照を使用することができますどこのことができます参照を返すことは不可能と思われますXを変更しますが、再割り当てしませんか?

実際。参照は変数のエイリアスであり、再配置することはできません(つまり、別の変数のエイリアスに変更する)。

実際には不可能な場合は、ポインタがこの領域で有効に見えるときに参照を返すのはなぜですか?

意味の問題ではなく、意味と責任の問題です。

ポインタ:

  • がかもしれヌル
  • は、あなたがオブジェクト(すなわち、それはあなたがそれを処分する必要がnewによって作成された)の所有権を取得する必要があることを意味するかもしれ

参考資料には該当しないので、簡略です。 シンプルさは良いです。だから、あなたがポインタの力を必要としないときは、自分自身の悲しみを忘れて、リファレンスを使用してください。

2

更新の質問を再度: tmp = tmp2; main関数に がある場合、tmp2への参照をtmpに割り当てていません。むしろ、オブジェクト全体をコピーしています。

これを見るには、何かを印刷するXコピーコンストラクタを与えます。このような何か動作するはずです:

X(X& that) 
{ 
    std::cout << "X is being copied" << std::endl; 
    *this = that; 
} 
+0

私は最終的に何が起こっているかを得た。私は代わりにポインタ値を印刷しておく必要があります、それは明らかだったでしょう:) – Frank

関連する問題