C++:const_cast类型转换

针对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属性,禁止在指针或引用的类型转换中移除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值