针对const_cast,太多人在用同一个示例问同一个问题:
void
main(){
const int a = 3;
const
int *pc = &a;
int *p = const_cast<int
*>(&a);
*p =
5;
printf("%d,%d,%d",*p,*pc,a); //结果是
5,5,3
}
最终输出的a,为何是3而不是5?
C++对用const定义的常数变量,不是靠地址空间中的内容来取数的,而是靠保存在符号表中的索引来取数的,因此常数变量a无论什么情况下使用都是常数3。
事实上,变量a地址空间中的内容确实是5,但即使你*(&a)来取数仍是3。你可以这样来取变量a地址空间中的内容:
const
int *d = &a;
printf("%d\n",
*d);
或
int d =
const_cast<int>(&a);
printf("%d\n", *(int
*)d);
此时输出的结果是5。
上述问题都是针对单变量常数而言的,对于结构或类,const_cast的使用与你的直观理解是无出入的。
C++提供了去除const或volatile属性的const_cast类型转换,使你可以对一常数变量进行修改,问题是你的设计为什么会导致非要对一常数变量进行修改呢?
C++的编程准则:const或volatile属性,禁止在指针或引用的类型转换中移除。