初学C++,想问个const_cast的问题

mifeixq 2008-12-25 04:40:17
Code:

#include <iostream>
using namespace std;

int main()
{
const int i=0;

int *j = const_cast<int *> (&i);
*j = 1;
cout << &i << "\t"<< j << endl;
cout << i << " \t "<< *j << endl;
}


Result:

mifei@P-I-mi:~/cplusplus$ ./a.out
0xbfc9096c 0xbfc9096c
0 1


问题:
我知道,C里,const int * 是不能赋值给int *的,但看到C++里有const_cast可以把const int * 转换成int *,那么,诸如上例,j == &i,也就是 j指向了i,让*j=1;也就是修改j所指向的内容,结果 i没有变,为0,而*j=1,那么,这里面到底是怎么回事呢?

一直没有勇气学C++,主要不太喜欢这个风格,虽然目前一直在用,但都是瞎用,不太理解。所以想系统学习下,看到这里,产生疑问,希望大家不吝指教
...全文
161 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lann64 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mifeixq 的回复:]
引用 1 楼 lbh2001 的回复:
C/C++ codeconstinti=0;
在C++中会产生常量折叠,凡是出现i的地方用常量0代替,对i取地址除外
你的程序中*j = 1;其实已经改变了i地址处的值,你的程序输出结果已经显示了这一点


那也就是说,这个地址的值已经被我修改了,只是下面cout < < i的时候,i直接被替换成0了?
[/Quote]
是的,google一下常量折叠
P_ghost 2008-12-25
  • 打赏
  • 举报
回复
记住如果你需要取消掉一个对象的const属性,你应该加上关键字volatile告诉编译器不进行优化
mifeixq 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wu_tao 的回复:]
用法:const_cast <type_id> (expression)
该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
常量指针被转化成非常量指针,并且仍然指向原来的对象;
常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。

其实应该是j只是得到了i指向的内存地址(在const_cast <int *> (&i);时候)并没有改变i的常数的属性,并不改变i的值,因…
[/Quote]

这里和C不一样……
哎~~不一样的地方很多阿……
datonggui 2008-12-25
  • 打赏
  • 举报
回复
用法:const_cast<type_id> (expression)
  该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
  常量指针被转化成非常量指针,并且仍然指向原来的对象;
  常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。

其实应该是j只是得到了i指向的内存地址(在const_cast<int *> (&i);时候)并没有改变i的常数的属性,并不改变i的值,因为i仍是一个常量,所以i值仍然是0,
i j 指向相的内存地址.
silverice 2008-12-25
  • 打赏
  • 举报
回复
我把LZ代码稍作修改
const int i=0;
前面加volatile 变成
volatile const int i=0;
输出结果变成
1 0012FF60
1 1
谁来解释一下,我好像明白一点,volatile是即时取值,也就是直接从寄存器中取值,没有放入内存?谁来明确解释一下,谢谢
SearchLife 2008-12-25
  • 打赏
  • 举报
回复
up
mifeixq 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lbh2001 的回复:]
引用 3 楼 mifeixq 的回复:
那也就是说,这个地址的值已经被我修改了,只是下面cout < < i的时候,i直接被替换成0了?


Right
[/Quote]

我考~~想了N久,不明白什么意思~~ 原来是这么回事~~~

刚g了一下,原来think in c++后面有说~~ 目前正在学C++,噯,提不起来兴趣

揭帖
lbh2001 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mifeixq 的回复:]
那也就是说,这个地址的值已经被我修改了,只是下面cout < < i的时候,i直接被替换成0了?
[/Quote]

Right
mifeixq 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lbh2001 的回复:]
C/C++ codeconstinti=0;
在C++中会产生常量折叠,凡是出现i的地方用常量0代替,对i取地址除外
你的程序中*j = 1;其实已经改变了i地址处的值,你的程序输出结果已经显示了这一点
[/Quote]

那也就是说,这个地址的值已经被我修改了,只是下面cout << i的时候,i直接被替换成0了?
mifeixq 2008-12-25
  • 打赏
  • 举报
回复

不好意思,验证了一下,const int * 是不能赋值给int *的, 这句话是不成立的~~

是我记忆错误了…… 记得C专家编程提到过类似的东西,但是记不太清楚了……
lbh2001 2008-12-25
  • 打赏
  • 举报
回复

const int i=0;

在C++中会产生常量折叠,凡是出现i的地方用常量0代替,对i取地址除外
你的程序中*j = 1;其实已经改变了i地址处的值,你的程序输出结果已经显示了这一点

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧