web-dev-qa-db-ja.com

なぜ「これ」はポインターであり、参照ではないのですか?

私はこの質問に対する答えを読んでいた C++の長所と短所 で、コメントを読んでいる間にこの疑問を抱いた。

プログラマーは、「これ」がポインターであり参照ではないことをしばしば混乱させます。もう1つの混乱は、「hello」がstd :: string型ではなく、char const *(ポインター)(配列からポインターへの変換後)に評価される理由です-Johannes Schaub-litb

これは、他の(後の)言語と同じ規則を使用していないことを示しています。 -ルドーフィエ08年12月22日3:35で

私は「これ」をかなり些細な問題と呼びます。おっと、未定義の動作の例でいくつかのエラーを見つけてくれてありがとう。 :)サイズに関する情報が最初のものと何の関係があるかはわかりませんが。ポインタは、割り当てられたメモリの外側を指すことはできません-jalf Dec 22 '08 at 4:18

これは絶え間ないポイナーですか? -yesraaj 08年12月22日6:35で

メソッドがconst int getFoo()constの場合、これは定数になります。 <-getFooのスコープでは、「this」は定数であるため、読み取り専用です。これはバグを防ぎ、オブジェクトが変更されないことを呼び出し側にある程度の保証を提供します。 –ダグT. 08年12月22日16:42

「this」を再割り当てすることはできません。つまり、これは右辺値であるため、「this =&other;」を実行できません。ただし、これはT *型であり、T const型ではありません。つまり、非定数ポインターです。 constメソッドを使用している場合は、constへのポインターです。 T constしかし、ポインター自体は非定数です-ヨハネスシャウブ-litb 08年12月22日17:53

「this」を次のように考えてください:#define this(this_ + 0)ここで、コンパイラはオブジェクトへのポインタとして「this_」を作成し、「this」をキーワードにします。 (this_ + 0)は右辺値であるため、「this」を割り当てることはできません。もちろん、それはそうではありません(そのようなマクロはありません)が、それはそれを理解するのに役立ちます-ヨハネスシャウブ-litb

私の質問は、なぜthisが参照ではなくポインタなのですか?ポインターにする特別な理由はありますか?


参照であるthisが意味をなす理由をさらに説明します。

  • Item 1 from More Effective C++:有効なオブジェクト、つまりNULLではないことが保証されている場合に参照を使用します(私の解釈)。
  • さらに、参照はポインターよりも安全であると見なされます(メモリを浮遊ポインターで台無しにすることはできないため)。
  • 第三に、参照にアクセスするための構文(.)は、ポインタにアクセスするよりも少し短くて短い(->または(*))。
177
Naveen

言語が最初に進化したとき、実際のユーザーによる初期のリリースでは、参照はなく、ポインターのみがありました。参照が一貫して機能するには参照が必要なため、演算子のオーバーロードが追加されたときに参照が追加されました。

thisの使用法の1つは、オブジェクトがそれ自体へのポインターを取得することです。参照である場合、&this。一方、代入演算子を記述するときは、return *this、これはreturn this。したがって、空白のスレートがあれば、どちらの方法でも議論できます。しかし、C++は、ユーザーコミュニティからのフィードバックに応じて徐々に進化しました(最も成功したものと同様)。下位互換性の値は、参照またはポインタであるthisに起因する小さな利点/欠点を完全に圧倒します。

169

パーティーに少し遅れて...馬の口からまっすぐに、 ここでBjarne Stroustrupが言わなければならないこと (「C++の設計と進化」の本で本質的に繰り返されているか、本から取られています):

「これ」が参照ではないのはなぜですか?

「this」は、参照が追加される前にC++に導入されたためです(実際にはクラスを使用したCに導入されたため)。また、Smalltalkの(自己)の使用(後の)ではなく、Simulaの使用法に従うために "this"を選択しました。

113
Michael Burr