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


183

私はこの質問C ++の賛否両論の回答を読んでいて、コメントを読んでいるときにこの疑問を感じました。

プログラマは、「これ」がポインタであり、参照ではないことを混乱させることがよくあります。"hello"がstd :: string型ではないが、char const *(ポインター)に評価される理由は別の混乱です(配列からポインターへの変換後)– Johannes Schaub-litb Dec 22 '08 at 22:56

これは、他の(後の)言語と同じ規則を使用していないことを示しています。– le dorfier 2008年12月22日3:35

私は「これ」のものをかなり些細な問題と呼びます。そして、おっと、私の未定義の動作の例でいくつかのエラーをキャッチしてくれてありがとう。:)私はサイズに関する情報が最初のもので何と関係があるのか​​理解していませんが。ポインターは、割り当てられたメモリの外を指すことは許可されていません。

これは絶え間ないpoinerですか?– yesraaj 2008年12月22日6:35

メソッドがconst int getFoo()constの場合、これは定数にすることができます。<-getFooのスコープでは、「this」は定数なので、読み取り専用です。これにより、バグが防止され、オブジェクトが変更されないことがある程度保証されます。– Doug T. Dec 22 '08 at 16:42

「これ」を再割り当てすることはできません。つまり、これは右辺値であるため、「this =&other;」を実行できません。これはタイプT *であり、タイプT constではありません。つまり、それは非定数ポインターです。constメソッドを使用している場合は、constへのポインタです。T const。しかし、ポインタ自体は非定数です– Johannes Schaub-litb '08 / 12/22 17:53

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

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


this参照であることはなぜ意味があるのか、いくつかのさらなる議論:

  • Item 1から検討するMore Effective C++ :有効なオブジェクト、つまりNULLではないことが保証されているときに参照を使用してください(私の解釈)
  • さらに、参照はポインタよりも安全であると見なされます(メモリを誤ったポインタでねじ込むことができないため)。
  • 第3に、参照(.)にアクセスするための構文は、ポインタ(->または(*))にアクセスするよりも少し優れており、短くなっています。

5
@paulmこの「ハック」は実際に何を達成するでしょうか?this常に評価されるとは限りませんtrueか?
iFreilicht 2014年

6
@paulmこれは実際には有効なC ++ではないと思います。オブジェクトへのnullptrでメソッドを呼び出すと、未定義の動作が発生します。
2014

5
@paulm場合によってはうまくいくかもしれませんが、その方法が仮想的であったかどうか想像してみてください。オブジェクトなしでv-tableルックアップを実行するにはどうすればよいですか?
Jason Creighton、

3
@paulmプロダクションコードで見た場合は、出荷を中止してください!それがUBです。
アリス

6
私はこれをここに残すつもりです...(MFCのafxwin2.inlから):_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
Christopher Oicles

回答:


176

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

の使用方法の1つは、thisオブジェクトがそれ自体へのポインタを取得することです。それが参照であった場合、を記述する必要があります&this。一方、代入演算子を作成する場合はreturn *this、にする必要がありますreturn this。したがって、白紙の状態である場合は、どちらの方法でも議論できます。しかし、C ++は、ユーザーコミュニティからのフィードバック(ほとんどの成功したものなど)に応じて徐々に進化しました。後方互換性の価値はthis、参照またはポインタであることから生じる小さな利点/欠点を完全に克服します。


4
まあ、オブジェクトがそれ自体への参照を取得することもしばしば役に立ちます。それはより一般的な使用法だと思います。とにかく、主な理由はあなたが言ったようです、「this」ポインターを作成したときに参照が存在しませんでした。
jalf

20
また、これが参照である場合、operator &有用な何かを実行するためにオーバーロードすることは困難です。このアドレスを取得できない特別な構文が必要operator &です。
10

10
@conio-次回C ++コンパイラの近くにいるときに確認することをお勧めします。:)次のようなものint n = 5; int &r = n; int *p = &r; std::cout << *p;
ダニエル・イアウィッカー2010

14
@Omnifarious &reinterpret_cast<char&>(this);オーバーロード用の実際のアドレスを取得するために書くことができますoperator&(実際、これは一種のことですboost::addressof)。
ヨハネスシャウブ-litb 2010

9
thisnullであることは実際には意味がないので、参照の方が実際に適しているように見えます。
Ponkadoodle

114

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

なぜですかthis」が参照ではないのですか?

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


2
ええ、自己は他の言語との一貫性のために素晴らしかったでしょう。
ピルチ2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.