1

From the discussion that has happened in my recent question (Why is a c++ reference considered safer than a pointer?), it raises another question in my mind: What exactly was the rationale behind introducing references in c++?

4

5 に答える 5

13

Stroustrup のDesign and Evolution of C++のセクション 3.7 では、言語への参照の導入について説明しています。C++ の機能の背後にある理論的根拠に興味がある場合は、この本を強くお勧めします。

参照は、主に演算子のオーバーロードをサポートするために導入されました。Doug McIlroy は、私が現在の演算子オーバーロード スキームの前身であるいくつかの問題を彼に説明していたことを思い出します。彼は、私が「ありがとう」とつぶやいたという驚くべき効果を伴う言葉の参照を使用し、現在の計画が本質的に完了した翌日に再び現れるために彼のオフィスを去りました. Doug は私に Algol68 を思い出させました。

C はすべての関数引数を値で渡します。オブジェクトを値で渡すことが非効率的または不適切な場合、ユーザーはポインターを渡すことができます。この戦略は、演算子のオーバーロードが使用されている場合には機能しません。その場合、オブジェクトが大きい場合、ユーザーがアドレスの演算子を挿入することを期待できないため、表記上の利便性が不可欠です。例えば:

a = b - c;

許容される (つまり、従来の) 表記ですが、

a = &b - &c;

ではありません。とにかく、&b - &cC では既に意味があり、それを変更したくありませんでした。

初期化後に参照が参照するものを変更することはできません。つまり、C++ 参照が初期化されると、再度バインドすることはできません。私は過去に Algol68 参照に悩まされていました。ここでは、 のタイプに応じて、参照されるオブジェクトr1 = r2にスルーr1を割り当てるか、新しい参照値をr1(re-bindingに) 割り当てることができます。C++ でこのような問題を回避したかったのです。r1r2

于 2011-01-17T18:26:08.650 に答える
2

演算子のオーバーロードにはそれらが必要です (もちろん、「演算子のオーバーロードを導入した理由は何ですか?」というウサギの穴を掘り下げることができます)。

参照なしでどのように入力std::auto_ptr::operator*()しますか? それともstd::vector::operator[]

于 2011-01-17T18:26:15.387 に答える
2

参照は暗黙的にオブジェクトにバインドされます。一時変数へのバインドや演算子のオーバーロードなどを考慮すると、これには大きな利点があります。C++ プログラムは & と * でいっぱいになります。考えてみると、ポインターの基本的な使用例は、実際には参照の動作です。さらに、参照を台無しにするのははるかに困難です-自分でポインター演算を実行しない、配列から自動的に変換できない (ひどいこと) などです。

参照は、ポインターよりもクリーンで、簡単で、安全です。

興味深いのは、他のほとんどの言語には、C++ にあるような参照 (エイリアス) がなく、ポインター スタイルの参照があるだけだからです。

于 2011-01-17T18:27:27.027 に答える
0

オペレーターのオーバーロードを許可します。彼らは、オブジェクトとポインターの両方に対して演算子をオーバーロード可能にすることを望んでいたため、ポインター以外でオブジェクトを参照する方法が必要でした。したがって、参照が導入されました。「C++ の設計と進化」にあります。

于 2011-01-17T18:49:35.687 に答える
0

コードが変数のアドレスを取得してルーチンに渡す場合、コンパイラは、そのアドレスがどこかに格納され、呼び出されたルーチンが終了した後も、おそらく変数が存在しなくなった後も使用される可能性があるかどうかを知る方法がありません。対照的に、コード パスがルーチンに変数への参照を与える場合、参照がそのルーチンの実行中にのみ使用されるという保証がいくらかあります。そのルーチンが戻ると、参照は使用されなくなります。

C++ ではコードが参照のアドレスを取得できるという事実によって、物事は少し「壊れた」状態になります。この機能は、参照ではなくポインターを想定していた古いルーチンとの互換性を確保するために提供されました。アドレスを取得してどこかに保存するルーチンに参照が渡された場合、すべての賭けは無効になります。一方、ポリシーの問題として、永続化される可能性のある方法で参照のアドレスを使用することを禁止する場合、参照が提供する保証を十分に得ることができます。

于 2011-01-17T18:31:48.177 に答える