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*
(它是一个右值)。但是即使this
是X* 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
的地址。也就是说,你不能写&this
。作为右值与赋值的右侧无关(这可能是您的想法;99% 的 C++ 文本完全错误)。
没有。有文字左值。【参考方案2】:
对于类 X 的非 const 成员函数,此指针的类型为 X* const。
那么,成员函数的这个指针总是常量。
或多或少,它是一个右值,但可以看作是一个const指针,但注意:指针是const,而不是pointee。这意味着,您无法更改 this 指向的对象,但可以更改对象的内容。
在您的示例中,该函数被声明为 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
【讨论】:
this
本身绝不是 const,但我想假装它是没有害处的。【参考方案3】:
const 在星号之后,意思是“X* const”,而不是“const X* 或 X const*”(它们是相同的)。 因此,这意味着您不能使“this”指向与他所指向的对象不同的对象,但您可以更改所指向的对象,这是有道理的。 “const X* 或 X const*”表示您不能更改当前指向的对象,但可以使指针指向不同的对象。 希望对你有帮助(:
【讨论】:
以上是关于C++ this 指针始终为 const的主要内容,如果未能解决你的问题,请参考以下文章
C++类和对象(this指针6个默认成员函数const成员)
C++ _ const的用法,特别是用在函数前面与后面的区别!
void Test::printxy(void)' : 不能在 const 类中将 'this' 指针从 'const Test' 转换为 'Test &'