让X
成为具有成员函数f()
的类。
this
是f()
的隐含参数,类型为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;
}
答案 0 :(得分:3)
this
是f()
的隐含参数,类型为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。