1. ホーム
  2. c++

[解決済み] なぜ 'this' はポインターで、参照ではないのですか?

2022-04-20 18:09:49

質問

この質問に対する答えを読んでいた C++の長所と短所 と、コメントを読んでいて疑問に思いました。

<ブロッククオート

もう一つの混乱は、なぜ "hello" が std::string 型ではなく char const* (ポインタ)に評価されるのか(配列からポインタへの変換後) - Johannes Schaub - litb Dec 22 '08 at 1:56

それは、他の(後発の)言語と同じ規約を使用していないことを示すだけです。- le dorfier Dec 22 '08 at 3:35

でも、quot;this"の件は、かなり些細な問題だと思うのですが。それと、おっと、未定義の動作の例でいくつか間違いを見つけてくれてありがとうございます :) しかし、私はサイズに関する情報が最初のものと何の関係があるのか理解できません。ポインタは単に割り当てられたメモリの外を指してはいけないということです - jalf Dec 22 '08 at 4:18

これは定数ポインターですか?- yesraaj Dec 22 '08 at 6:35

メソッドが const int getFoo() const; <- getFoo のスコープでは "this" は定数であり、したがって読み取り専用になります。これはバグを防止し、オブジェクトが変更されないことを呼び出し側である程度保証するものです。- Doug T. Dec 22 '08 at 16:42

つまり、this = &other;" とすることはできないのです。T const 。しかし、ポインタ自体はnonconstである - Johannes Schaub - litb Dec 22 '08 at 17:53

this"は、このように考えてください。#もちろん、そのようなマクロはありません)しかし、理解の助けになります - Johannes Schaub - litb Dec 22 '08 at 17:55

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


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

  • 検討する Item 1 から More Effective C++ : 参照は、有効なオブジェクトがあること、すなわちNULLでないことが保証されている場合に使用します(私の解釈です)。
  • さらに、参照はポインタよりも安全だと考えられています(ストレー・ポインタでメモリを破壊することができないからです)。
  • 第三に、リファレンスにアクセスするための構文( . ) は、ポインタにアクセスするよりも少しすっきりしていて短いです ( -> または (*) ).

解決方法は?

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

の使い方のひとつは this は、オブジェクトが自分自身へのポインタを取得するためのものです。もしそれが参照であったなら、私たちは &this . 一方、代入演算子を書くときは、次のようになります。 return *this というように、よりシンプルに見えます。 return this . ですから、白紙の状態であれば、どちらにも反論できるわけです。しかし、C++はユーザーのコミュニティからのフィードバックに応えて、徐々に進化してきたのです(成功した物事のほとんどがそうであるように)。後方互換性という価値は、以下のような小さなメリットやデメリットを完全に凌駕しています。 this が参照であるかポインタであるかということです。