クラス X の非 const メンバ関数の場合、このポインタは X* const 型です。
次に、メンバー関数のこのポインターは常に const です。
次に、次のように常に const キャストする必要がありますか。
void foo::p() {
const_cast <int&> (member) = 1;
}
ここで何か不足していますか?
クラス X の非 const メンバ関数の場合、このポインタは X* const 型です。
いいえ、this
非 const メンバ関数内のポインタの型はただですX*
(そしてそれは右辺値です)。しかし、だったとしてもthis
、X* const
データ メンバーの変更を妨げることはありません。
あなたのコード例はあなたの質問と一致しません。const メンバー関数を示します。const メンバー関数内では、の型this
はconst X*
. const メンバー関数内のデータ メンバーを変更することはできません ( として宣言されたデータ メンバーを除くmutable
)。const
データ メンバーを変更することが目的であるかのようにメンバー関数を宣言するのは矛盾しています。決心してください。
クラス 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
}
const は星印の後にあり、「X* const」を意味し、「const X* または X const*」(同じもの) ではありません。したがって、「これ」を彼が指しているオブジェクトとは異なるオブジェクトを指すようにすることはできませんが、指しているオブジェクトを変更することはできます。これは理にかなっています。「const X* または X const*」は、現在指しているオブジェクトを変更できないことを意味しますが、ポインタを別のオブジェクトに向けることはできます。それが役に立てば幸い(: