注册 登录
编程论坛 C++教室

由const_cast引发的疑惑...

wfpb 发布于 2007-06-05 23:08, 903 次点击
void main()
{
const int a=1;
int &b=const_cast<int&>(a);
cout<<a<<endl;
b=2;
cout<<&b<<":"<<*(&b)<<endl;
cout<<&a<<":"<<*(&a)<<endl;
}
输出:
1
0012FF28:2
0012FF28:1
为什么相同的地址里的取值会不同,到底const_cast有什么魔力?
8 回复
#2
yuyunliuhen2007-06-05 23:28
const_cast在进行常量转换的时候他可以取得const对象的地址,生成一个指向const的指针,转换后地址就一样了吧
#3
wfpb2007-06-06 00:04

ls请看清楚我的问题,我是说,相同地址0012FF28,取值会不同???

#4
yuyunliuhen2007-06-06 13:34
不好意思,看错题了。
楼主也是用的DEV C++测试的吧,DEV编译器先把“*(&a)”优化成了a,然后看到a是个const int,又接着给优化成了5。
但这种优化不一定每种编译器都灵的,(DEV有点特别哈)因为通过编程技巧偷偷修改一个const量,其后果是未定义的。
我把int 换成double,

#include<iostream>
using namespace std;
int main()
{
const int a=1;
int &b=const_cast<int&>(a);
cout<<a<<endl;
b=2;
cout<<&b<<":"<<*(&b)<<endl;
cout<<&a<<":"<<*(&a)<<endl;
cout<<typeid(&a).name()<<endl;
cout<<typeid(&b).name()<<endl;
system("pause");
return 0;
}
VC2005测试一下,其输出就是:
1
0012FF6C:2
0012FF6C:2
double const *
double *



#5
wfpb2007-06-06 13:57
我用的是VC6.0
纯粹编译器的bug,不管怎么优化,也不能把原则丢了。
相同地址怎么能够取出不同的值,VC6忘本了,呵呵
#6
tancui2007-06-08 13:08
好像对于const不是没有内在地址吗,相当于是个符号吗?
不明白,
如果是C的#define 就理解了
#7
unicorn2007-06-08 22:32

用const定义的变量 如果不去引用它 这个变量只存在符号表中

但如果你引用它了 它就会在内存中分配一个临时存储区


const int a=1; //没有引用前,内存不分配变量空间,只存在符号表里

int &b=const_cast<int&>(a); //b是a的引用,即a,b指向同一个地址

b=2; //临时存储区里的值发生变化


cout<<&b<<":"<<*(&b)<<endl; //b的地址里的值 ,肯定是2了

cout<<&a<<":"<<*(&a)<<endl; //a仅仅存储在符号表里,值不能改变还是1,但你要调用他的地址(引用)就是临时分配的那个存储区了,即b的地址

#8
yuyunliuhen2007-06-09 12:45
int main()
{
const double a=1;
double &b=const_cast<double&>(a);
cout<<a<<endl;
b=2;
cout<<&b<<":"<<*(&b)<<endl; //0012FF78:2
cout<<&a<<":"<<*(&a)<<endl; //0012FF78:2
return 0;
}
double替换int后的结果如何解释呢?
#9
wfpb2007-06-17 20:52
7楼的解释不就是在说*(&amp;a)被优化成a了吗?5楼说过了啊。。。
1