| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 903 人关注过本帖
标题:由const_cast引发的疑惑...
只看楼主 加入收藏
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
 问题点数:0 回复次数:8 
由const_cast引发的疑惑...
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有什么魔力?
搜索更多相关主题的帖子: cast const 
2007-06-05 23:08
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 
const_cast在进行常量转换的时候他可以取得const对象的地址,生成一个指向const的指针,转换后地址就一样了吧

Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-06-05 23:28
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

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


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-06-06 00:04
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 
不好意思,看错题了。
楼主也是用的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 *




Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-06-06 13:34
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
我用的是VC6.0
纯粹编译器的bug,不管怎么优化,也不能把原则丢了。
相同地址怎么能够取出不同的值,VC6忘本了,呵呵

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-06-06 13:57
tancui
Rank: 1
等 级:新手上路
威 望:1
帖 子:63
专家分:0
注 册:2006-11-19
收藏
得分:0 
好像对于const不是没有内在地址吗,相当于是个符号吗?
不明白,
如果是C的#define 就理解了
2007-06-08 13:08
unicorn
Rank: 4
等 级:贵宾
威 望:14
帖 子:1066
专家分:0
注 册:2005-10-25
收藏
得分:0 

用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的地址


unicorn-h.spaces. ◇◆ sava-scratch.spaces.  noh enol ! pue pu!w hw u! shemle aq ll!m noh 
2007-06-08 22:32
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 
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后的结果如何解释呢?

Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-06-09 12:45
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
7楼的解释不就是在说*(&amp;a)被优化成a了吗?5楼说过了啊。。。

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-06-17 20:52
快速回复:由const_cast引发的疑惑...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030275 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved