「this」はなぜポインターであり、参照ではないのでしょうか? 質問する

「this」はなぜポインターであり、参照ではないのでしょうか? 質問する

私はこの質問の答えを読んでいましたC++ の長所と短所そしてコメントを読んでいるときにこの疑問が浮かびました。

プログラマーは、"this" がポインターであって参照ではないことにしばしば混乱します。もう 1 つの混乱は、"hello" が std::string 型ではなく、char const* (ポインター) として評価される理由です (配列からポインターへの変換後) – Johannes Schaub - litb 2008 年 12 月 22 日 1:56

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

しかし、この「これ」は、かなり些細な問題だと思います。そして、おっと、私の未定義の動作の例のいくつかのエラーに気づいてくれてありがとう。:) ただし、サイズに関する情報が最初のものとどう関係するのかはわかりません。ポインターは、割り当てられたメモリの外側を指すことは許可されていません。 – jalf 2008 年 12 月 22 日 4:18

これは定数ポインタですか? – yesraaj 2008年12月22日 6:35

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

「this」を再割り当てすることはできません。つまり、「this = &other;」はできません。これは右辺値だからです。しかし、これは T* 型であり、 T const 型ではありません。つまり、非定数ポインタです。const メソッドの場合は、これは const へのポインタです。 T const です。しかし、ポインタ自体は非定数です – Johannes Schaub - litb 2008 年 12 月 22 日 17:53

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

私の質問は、なぜthisポインターは参照ではないのかということです。ポインターにする特別な理由があるのでしょうか?


this参照であることが理にかなっている理由について、さらにいくつか説明します。

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

ベストアンサー1

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

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

おすすめ記事