C ++这个指针总是const

时间:2013-04-19 10:05:48

标签: c++ const

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

然后,成员函数的这个指针总是const。

然后,我们总是需要像以下那样进行const转换:

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

我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:8)

  

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

不,非const成员函数中this指针的类型只是X*(它是一个右值)。但即使thisX* 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 *”表示您无法更改此刻指向的对象,但可以使指针指向不同的对象。 希望它有所帮助(: