“this”指针总是const吗?

时间:2013-04-19 11:20:37

标签: c++ const member const-correctness member-functions

X成为具有成员函数f()的类。

thisf()的隐含参数,类型为X* const

然后,如果f() const是const成员函数,this指针的类型现在是const X* const

在这两种情况下,this指针的类型似乎都是const。那么为什么在函数f()定义中允许修改类X的任何数据成员?我们不应该总是诉诸{/ 1}},而不是

const_cast

如果void X::f() { const_cast <int&> (member) = 1; } 是const,那么就可以这样做:

f() const

(或者你也可以让成员变得可变)

但为什么会这样?

void X::f() const{        
       const_cast <int&> (member) = 1;    
}

2 个答案:

答案 0 :(得分:3)

  

thisf()的隐含参数,类型为X* const

不完全(它实际上是X*类型的 rvalue ),但为了这个问题,它足够接近。

  

在这两种情况下,这个指针的类型似乎都是const。那么为什么在函数f()定义中允许修改类X的任何数据成员?

因为如果指针const(如X* const中所述),则无法更改指针。你可以改变它指向的任何东西。如果它是指向const的指针(如const X*中所示),那么你就无法改变指向它的内容。

所以你永远不能修改this本身;你不能写this = &some_other_object。在const成员函数中,如果没有狡猾的*this,您也无法修改const_cast的(不可变的)成员。

答案 1 :(得分:0)

这个指针是一个右值。它不能被赋值,所以这个指针是一个const指针并不重要。

如果f()是非const成员函数,则此指针指向非const X,因此可以修改X的数据成员。

但如果f() const是const成员函数,则此指针指向const const X,因此无法修改X的数据成员。然后,如果想要在f() const定义中修改它,则需要数据成员是可变的或const_cast。

我们可以为const_cast做

void X::f() const{        
       const_cast <int&> (member) = 1;    
} 

如果member是对非const int的引用,那么编译器会接受赋值并且需要行为。如果member是对const int的引用,则行为是不可预测的。比较这些:

const int a = 10;
const int* b = &a;
int* c = const_cast<int*>(b);
// *c = 20; 

c是const int *的const_cast,其指针a为const。行为未定义。

int a1 = 10;
const int* b1 = &a1;
int* c1 = const_cast<int*>(b1);
*c1 = 20;  

c1是const int *的const_cast,其指针a为const。这是有效的,您可以自由地将新值赋给c1指向的int。

众所周知,const成员函数不能改变数据成员的值。我们说她是因为这是因为这个指针的指针是const。