对于类X的非const成员函数,此指针的类型为X * const。
然后,成员函数的这个指针总是const。
然后,我们总是需要像以下那样进行const转换:
void foo::p() {
const_cast <int&> (member) = 1;
}
我在这里错过了什么吗?
答案 0 :(得分:8)
对于类X的非const成员函数,此指针的类型为X * const。
不,非const成员函数中this
指针的类型只是X*
(它是一个右值)。但即使this
为X* const
,仍然无法阻止您更改数据成员。
您的代码示例与您的问题不符。它显示了一个const成员函数。在const成员函数内部,this
的类型为const X*
。您不能更改const成员函数内的任何数据成员(声明为mutable
的数据成员除外)。如果您的目标是更改数据成员,则将成员函数声明为const
是矛盾的。下定决心。
答案 1 :(得分:2)
对于类X的非const成员函数,此指针的类型为X * const。
然后,成员函数的这个指针总是const。
或多或少,它是一个rvalue,但可以看作是一个const指针,但请注意:指针是const,但不是指针。这意味着,您无法更改此指向的对象,但您可以更改对象的内容。
在您的示例中,函数声明为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
}
答案 2 :(得分:0)
const在星号后面,意思是“X * const”,而不是“const X *或X const *”(它们是相同的)。 因此,这意味着你不能将“this”指向不同于他指向的对象,但你可以改变被指向的对象,这是有道理的。 “const X *或X const *”表示您无法更改此刻指向的对象,但可以使指针指向不同的对象。 希望它有所帮助(: