196

私はこの質問C++ の長所と短所への回答を読んでいて、コメントを読んでいるときにこの疑問を抱きました。

プログラマは、"this" が参照ではなくポインタであることに混乱を覚えることがよくあります。別の混乱は、「hello」が std::string 型ではなく、char const* (ポインター) に評価される理由です (配列からポインターへの変換後)

それは、他の(後の)言語と同じ規則を使用していないことを示しているだけです。— ルドルフィエ

ただし、「これ」のことはかなり些細な問題と言えます。おっと、未定義の動作の例でいくつかのエラーを見つけてくれてありがとう。:)サイズに関する情報が最初のものと関係があるかどうかはわかりませんが。ポインターは、割り当てられたメモリの外側を指すことは単に許可されていません

これは一定のポインターですか?– yesraaj 22 12月. 082008-12-22 06:35

メソッドが const int getFoo() const の場合、これは定数になります。<- getFoo のスコープでは、「this」は定数であるため、読み取り専用です。これにより、バグが防止され、オブジェクトが変更されないという一定レベルの保証が呼び出し元に提供されます。— ダグ T. 22 12 月 2008 〜で 16:42 に

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

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

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


this参照であることが理にかなっている理由について、さらにいくつかの議論があります。

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

3 に答える 3

191

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

の用途の 1 つはthis、オブジェクトがそれ自体へのポインターを取得することです。参考になれば、と書かざるを得ない&this。一方、代入演算子を書くときは、 にする必要がreturn *thisあり、 のように単純に見えますreturn this。したがって、白紙の状態であれば、どちらの方法でも議論できます。しかし、C++ は、ユーザー コミュニティからのフィードバックに応じて徐々に進化しました (最も成功したものと同様)。下位互換性の価値はthis、参照またはポインターであることから生じる小さな長所/短所を完全に圧倒します。

于 2009-03-14T14:41:27.303 に答える
124

パーティーに少し遅れて... Bjarne Stroustrup の口からの一言です (これは基本的に、「C++ の設計と進化」の本で繰り返されているか、そこから引用されています)。

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

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

于 2009-03-15T19:52:22.367 に答える