5

クラス X の非 const メンバ関数の場合、このポインタは X* const 型です。

次に、メンバー関数のこのポインターは常に const です。

次に、次のように常に const キャストする必要がありますか。

void foo::p() {                        
      const_cast <int&> (member) = 1;    
}

ここで何か不足していますか?

4

3 に答える 3

13

クラス X の非 const メンバ関数の場合、このポインタは X* const 型です。

いいえ、this非 const メンバ関数内のポインタの型はただですX*(そしてそれは右辺値です)。しかし、だったとしてもthisX* constデータ メンバーの変更を妨げることはありません。

あなたのコード例はあなたの質問と一致しません。const メンバー関数を示します。const メンバー関数内では、の型thisconst X*. const メンバー関数内のデータ メンバーを変更することはできません ( として宣言されたデータ メンバーを除くmutable)。constデータ メンバーを変更することが目的であるかのようにメンバー関数を宣言するのは矛盾しています。決心してください。

于 2013-04-19T10:09:16.417 に答える
2

クラス X の非 const メンバ関数の場合、このポインタは X* const 型です。

次に、メンバー関数のこのポインターは常に const です。

多かれ少なかれ、これは右辺値ですが、const ポインターと見なすこともできますが、注意:ポインターは const ですが、pointee ではありません。つまり、これが指すオブジェクトを変更することはできませんが、オブジェクトの内容は変更できます。

あなたの例では、関数は const として宣言されています。

void foo::p() const { 
              // ^---- here!

したがって、この場合thisは型ですX const * const(正確には型の右辺値ですX const*が、ここでは問題ではありません)。つまり、ポインターポインティーは const です。本当に重要なのは後者です。

したがって、メンバーを変更する場合は、メソッドに const を使用しないでください。

void foo::p() {    
           //^------ no const!
      member = 1;       // perfectly legal, because *this is not const
      this->member = 1; // the same
      this = new foo;   // still illegal, this cannot be assigned to
}
于 2013-04-19T10:16:39.037 に答える
0

const は星印の後にあり、「X* const」を意味し、「const X* または X const*」(同じもの) ではありません。したがって、「これ」を彼が指しているオブジェクトとは異なるオブジェクトを指すようにすることはできませんが、指しているオブジェクトを変更することはできます。これは理にかなっています。「const X* または X const*」は、現在指しているオブジェクトを変更できないことを意味しますが、ポインタを別のオブジェクトに向けることはできます。それが役に立てば幸い(:

于 2016-06-26T07:50:36.403 に答える