C++ this 指针始终为 const

Posted

技术标签:

【中文标题】C++ this 指针始终为 const【英文标题】:C++ the this pointer is always const 【发布时间】:2013-04-19 10:05:48 【问题描述】:

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

那么,成员函数的这个指针总是常量。

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

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

我在这里错过了什么吗?

【问题讨论】:

您将p() 声明为 const,因此您无法修改该类的成员。 @Koushik,可以,但需要将这些成员标记为mutable @izogfif 是的,但他有吗?我指的是这个上下文。 【参考方案1】:

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

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

您的代码示例与您的问题不符。它显示了一个 const 成员函数。在 const 成员函数中,this 的类型是 const X*。您不能更改 const 成员函数内的任何数据成员(声明为 mutable 的数据成员除外)。如果您的目标是更改数据成员,则将成员函数声明为 const 是矛盾的。下定决心。

【讨论】:

this pointer is of type X* const,那么这是一个指向 X 类型指针的 const 指针,对吧?那么它是一个 const 指针? this 不是 const 指针,但它是一个右值,因此将 this 视为 const 指针也无妨;无论哪种方式,您都不能重新分配this @FredOverflow 如果它是一个右值,我们如何通过它访问成员?我很困惑。 您可能对术语右值的含义感到困惑。 this 是一个右值仅仅意味着你不能获取this 的地址。也就是说,你不能写&amp;this。作为右值与赋值的右侧无关(这可能是您的想法;99% 的 C++ 文本完全错误)。 没有。有文字左值。【参考方案2】:

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

那么,成员函数的这个指针总是常量。

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

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

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

所以在这种情况下,thisX 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

【讨论】:

this 本身绝不是 const,但我想假装它是没有害处的。【参考方案3】:

const 在星号之后,意思是“X* const”,而不是“const X* 或 X const*”(它们是相同的)。 因此,这意味着您不能使“this”指向与他所指向的对象不同的对象,但您可以更改所指向的对象,这是有道理的。 “const X* 或 X const*”表示您不能更改当前指向的对象,但可以使指针指向不同的对象。 希望对你有帮助(:

【讨论】:

以上是关于C++ this 指针始终为 const的主要内容,如果未能解决你的问题,请参考以下文章

C++类和对象(this指针6个默认成员函数const成员)

在 const 时返回指向自身的指针的类函数。 C++

C++ _ const的用法,特别是用在函数前面与后面的区别!

C++ const常量成员函数

C++面向对象-static、const

void Test::printxy(void)' : 不能在 const 类中将 'this' 指针从 'const Test' 转换为 'Test &'