2013-08-05 12 views
5

C++では、どのようなシナリオで関数から参照を返さなければなりませんか?関数の入力として参照を使用することを理解していますが、関数の出力ではなぜ値やポインタしか返せませんか?関数がC++で参照を返さなければならないとき

+0

は、参照ポインタではないでしょうか? –

+0

@ Samam:もし彼らが同じもので同じ意味を持っていたら、なぜ彼らが最初に言葉で紹介されたと思いますか? – ereOn

+1

参照を返さずに、たとえば 'vector'の添え字演算子をどのように実装するかを考えてみましょう。 – jrok

答えて

8

参照は、関数の戻り値への代入を提供するために使用されます。奇妙に思えますが、例として、C++の配列代入演算子は、実際にインデックスパラメータで要素への参照を返して、それに割り当てることができる関数です。

Array a; 
a[4] = 192; 

は永遠に役立つC++よくある質問に触発さ::次の構文を許可

class Array { 
public: 
    int& operator[] (const int& index); 
    ... 
}; 

https://isocpp.org/wiki/faq/references#returning-refs

+3

+1のC++ FAQへの参照 – SteveLove

+0

ありがとうございます。これは説得力のある例です。 – ahala

+0

@ahalaあなたの質問に完全に回答したと感じたら、あなたは答えとしてマークすることができますか? – jrs

1

関数が呼び出される前にオブジェクトが既に存在する場合は、参照を返すことができます。 それは問題ではありません。

この投稿は十分にまとめられています。 Is the practice of returning a C++ reference variable, evil?

+1

リンク先は、反対側の質問について説明します。参照を返す必要があるときや、参照を返すときにポインタを返すよりも優れているとは限りません。 – ahala

0

関数から参照を返すことは、ポインタを返すことと同じ長所と短所があります。

非const参照またはポインタを返すと、呼び出し元はメンバー変数に書き込み、非constメンバー関数を呼び出すことができます。

しかし、参照されるオブジェクトの呼び出し元が必要とするよりも寿命が長いほうが、そうでなければプログラムは未定義の動作の領域に入ります。

の件名はでなければなりません。戻り値のポインタが呼び出し側にポインタを間接参照する必要がある場合は、演算子と同様に構文砂糖に便利です。

+2

誰かがnullptrを返す場合を除いて) –

+3

私はそれをダウンボトムしませんが、この最初のステートメントは私にとってかなり間違っています。ポインタと参照は実際には近いですが、それらはまったく異なる獣であり、関数の戻りコンテキストでは全く同じ長所/短所を持っていません。 – ereOn

4

にはの参照が必要な場所はありません。

オーバーロードoperator++()が頭に浮かんでいますが、依然として参照を返すことは必須ではありません。ただし、通常のルールが適用されます。ポインタを返すことができれば、ほとんどの場合、安全に参照を返すことができます。重要なのは、範囲外のもの(その関数にローカルな変数など)への参照を返さないことです。 *thisへの参照を返すことはかなり一般的です。

戻り値を返すことは、(A)が返されたもののコピーを作成するか、(B)移動セマンティクス(C++ 11)を最大限に活用するか、および/または戻り値の最適化(RVO on wikipedia)。

コピーを必要としない場合は、ポインタ型の使い方が望ましくない場合、つまり返されたものを*または->

0

が存在するオブジェクトへの参照を返す必要があることを覚えておいてください。の後に関数が終了します。 Valは、(例えば)ので1に設定する、リスト内の10番目の要素への参照を返す関数である

Val(X,10) = 1; 

:たとえば、あなたはこのような何かを行うことができます。

関連する問題