1

让我们X成为一个具有成员函数的类f()

this是 的隐含参数f(),它的类型是X* const

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

this在这两种情况下,指针的类型似乎都是const. 那么为什么允许在函数f()定义中修改类的任何数据成员X?我们不应该总是const_cast求助于

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

如果f() const是 const,那么这是这样做的方法:

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

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

但是为什么这有效

void X::f() {  
       member = 1;    
}
4

2 回答 2

3

this是 的隐含参数f(),它的类型是X* const

不完全(它实际上是type的右值X*),但对于这个问题来说已经足够接近了。

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

因为如果指针const(如X* const),则无法更改指针。您可以更改它指向的任何内容。如果它是一个指向 const 的指针(如 中const X*),那么您无法更改它所指向的内容。

所以你永远不能修改this自己;你不能写this = &some_other_object。在成员函数中,您也不能修改没有 dodgyconst的(非可变)成员。*thisconst_cast

于 2013-04-19T11:25:09.330 回答
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 是指针 a 为 const 的 const int* 的 const_cast。行为未定义。

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

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

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

于 2013-04-19T11:24:56.867 回答