码迷,mamicode.com
首页 > 其他好文 > 详细

const与指针修改const对象

时间:2014-07-31 23:42:20      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   os   io   数据   问题   

我们都知道const对象作用是声明变量为常量,在程序中除非显示转换,否则无法修改。

本文针对显示修改的情况,提醒了一种隐式的错误,以及解决办法。

考虑下面的代码:

#include<iostream>
int main(){
  const int a=0;
  int         *p=const_cast<int*>(&a);//&a返回int *,const_cast<int*>显示转换为int*.
  *p            =1;  
  int           b=*p;
  int           c=a;
 std::cout<<“b: "<<b<<std::endl<<"c: "<<c<<std::endl;
 std::cout<<&a<<" "<<p<<std::endl;
return 0;     
}

 

输出的结果是:

b: 1

c: 2

0x7fffe27cd63c 0x7fffe27cd63c

问题就在这里!我们明明改变了a的值,并且指针指向的地址和变量的地址一致。

这是多么的恐怖,我们通过*p改变了a的值,但是在下一次用a的时候,得到的结果仍然没有改变。这再一次提醒了我们,不要轻易使用强制类型转换,这往往会导致一些我们难以察觉的错误。

解决这个问题很简单,利用volatile修饰符:让变量a每次访问都强制到内存中读取最新的数据。

#include<iostream>
int main(){
  const volatile int a=0;
  int         *p=const_cast<int*>(&a);//&a返回int *,const_cast<int*>显示转换为int*.
  *p            =1;  
  int           b=*p;
  int           c=a;
 std::cout<<“b: "<<b<<std::endl<<"c: "<<c<<std::endl;
return 0;     
}

输出结果是:

b: 1

c: 1

想来读者已经想到了原因:const修饰的对象,编译器进行了符号替换。下文中用到了const 对象,就进行替换,而不是从内存中提取最新的值。

 





 

const与指针修改const对象,布布扣,bubuko.com

const与指针修改const对象

标签:style   blog   color   使用   os   io   数据   问题   

原文地址:http://www.cnblogs.com/wangpei0522/p/3883750.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!