C++では、どのようなシナリオで関数から参照を返さなければなりませんか?関数の入力として参照を使用することを理解していますが、関数の出力ではなぜ値やポインタしか返せませんか?関数がC++で参照を返さなければならないとき
答えて
参照は、関数の戻り値への代入を提供するために使用されます。奇妙に思えますが、例として、C++の配列代入演算子は、実際にインデックスパラメータで要素への参照を返して、それに割り当てることができる関数です。
Array a;
a[4] = 192;
は永遠に役立つC++よくある質問に触発さ::次の構文を許可
class Array {
public:
int& operator[] (const int& index);
...
};
関数が呼び出される前にオブジェクトが既に存在する場合は、参照を返すことができます。 それは問題ではありません。
この投稿は十分にまとめられています。 Is the practice of returning a C++ reference variable, evil?
リンク先は、反対側の質問について説明します。参照を返す必要があるときや、参照を返すときにポインタを返すよりも優れているとは限りません。 – ahala
関数から参照を返すことは、ポインタを返すことと同じ長所と短所があります。
非const参照またはポインタを返すと、呼び出し元はメンバー変数に書き込み、非constメンバー関数を呼び出すことができます。
しかし、参照されるオブジェクトの呼び出し元が必要とするよりも寿命が長いほうが、そうでなければプログラムは未定義の動作の領域に入ります。
の件名はでなければなりません。戻り値のポインタが呼び出し側にポインタを間接参照する必要がある場合は、演算子と同様に構文砂糖に便利です。
誰かがnullptrを返す場合を除いて) –
私はそれをダウンボトムしませんが、この最初のステートメントは私にとってかなり間違っています。ポインタと参照は実際には近いですが、それらはまったく異なる獣であり、関数の戻りコンテキストでは全く同じ長所/短所を持っていません。 – ereOn
にはの参照が必要な場所はありません。
オーバーロードoperator++()
が頭に浮かんでいますが、依然として参照を返すことは必須ではありません。ただし、通常のルールが適用されます。ポインタを返すことができれば、ほとんどの場合、安全に参照を返すことができます。重要なのは、範囲外のもの(その関数にローカルな変数など)への参照を返さないことです。 *this
への参照を返すことはかなり一般的です。
戻り値を返すことは、(A)が返されたもののコピーを作成するか、(B)移動セマンティクス(C++ 11)を最大限に活用するか、および/または戻り値の最適化(RVO on wikipedia)。
コピーを必要としない場合は、ポインタ型の使い方が望ましくない場合、つまり返されたものを*
または->
。
が存在するオブジェクトへの参照を返す必要があることを覚えておいてください。の後に関数が終了します。 Val
は、(例えば)ので1
に設定する、リスト内の10番目の要素への参照を返す関数である
Val(X,10) = 1;
:たとえば、あなたはこのような何かを行うことができます。
- 1. 1つの関数からBooleanが返されなければならない
- 2. エラー:非静的メンバ関数への参照と呼ばれなければならない(2)
- 3. C - 参照されていないOmp関数
- 4. {extern "C"関数}のNDK定義されていない参照?
- 5. 関数参照を渡すときにクラス名が更新されない
- 6. C関数が値を返さない
- 7. 関連付けられていない参照クラス:System.Guid
- 8. C返されない関数
- 9. constexpr関数ではconstポインタへの参照を返すが、コピーを返さないのはなぜですか?
- 10. C++ - 定義されていない複数ファイルの関数への参照
- 11. 関数はオブジェクトを返さなければなりませんが、未定義として返されます
- 12. TBBタスクへの参照で関数を渡すときに値を返すことができない
- 13. カスタムアセンブリがビューで参照されない
- 14. C++の関数の中でオブジェクト参照を返すのはなぜですか?
- 15. シンプルな変数チェックはfalseを返す、真でなければならない
- 16. cmake:pcap関数の定義されていない参照
- 17. libpq関数の定義されていない参照
- 18. 値を返さない関数(C++)
- 19. 返されない関数を逆参照するとどうなりますか?
- 20. プリロードアセンブリ:参照されている、参照されていない、必要なまでロードされていない
- 21. スーパーを呼び出さなければならないインターフェイス関数のアノテーション
- 22. C#対話型ウィンドウでコードが参照されない
- 23. Unityがdll参照を見つけられない
- 24. 参照されていない配列 "スライス"の後に参照されない?
- 25. 参照されたプロジェクトが参照アセンブリを経由しない
- 26. 構造体を返さなければならない関数は、この構造体をC++でどのように出力できますか?
- 27. 関数からC文字列を返すと、ランダムな文字が返されるのはなぜですか?
- 28. 関数が返されない結果
- 29. Jquery関数が返されない
- 30. Mongoose: "TypeError:"リスナー "引数は関数でなければならない"接続時
は、参照ポインタではないでしょうか? –
@ Samam:もし彼らが同じもので同じ意味を持っていたら、なぜ彼らが最初に言葉で紹介されたと思いますか? – ereOn
参照を返さずに、たとえば 'vector'の添え字演算子をどのように実装するかを考えてみましょう。 – jrok