5

对于类 X 的非 const 成员函数,此指针的类型为 X* const。

然后,成员函数的 this 指针始终为 const。

那么,我们是否总是需要像这样进行 const 转换:

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

我在这里错过了什么吗?

4

3 回答 3

13

对于类 X 的非 const 成员函数,此指针的类型为 X* const。

不,this非常量成员函数内的指针类型只是X*(而且它是一个右值)。但即使thisX* const,这仍然不会阻止您更改数据成员。

您的代码示例与您的问题不匹配。它显示了一个 const 成员函数。在 const 成员函数内部,类型thisconst X*。您不能更改 const 成员函数内的任何数据成员(声明为 的数据成员除外mutable)。声明一个成员函数就像const你的目标是改变数据成员是矛盾的。下定决心。

于 2013-04-19T10:09:16.417 回答
2

对于类 X 的非 const 成员函数,此指针的类型为 X* const。

然后,成员函数的 this 指针始终为 const。

或多或少,它是一个右值,但可以看作是一个 const 指针,但请注意:指针是 const,而不是指针。这意味着,您无法更改 this 指向的对象,但可以更改对象的内容。

在您的示例中,该函数被声明为 const:

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

所以在这种情况下,thisis 是类型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*”(它们是相同的)。因此,这意味着您不能使“this”指向与他指向的对象不同的对象,但是您可以更改所指向的对象,这是有道理的。“const X* 或 X const*”表示您不能更改当前指向的对象,但可以使指针指向不同的对象。希望能帮助到你(:

于 2016-06-26T07:50:36.403 回答