初学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++,主要不太喜欢这个风格,虽然目前一直在用,但都是瞎用,不太理解。所以想系统学习下,看到这里,产生疑问,希望大家不吝指教
...全文
160 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地址处的值,你的程序输出结果已经显示了这一点
内容概要:本文系统研究了开关频率大于谐振频率(fs>fr)工况下,移相混合控制LLC谐振变换器在低压增益区域的工作特性,深入分析其在变频与移相结合控制模式下的调制机理、工作模态划分及损耗分布规律。通过Simulink平台构建高保真仿真模型,对变换器在不同负载和输入条件下的电压增益、转换效率、关键器件电压电流应力等性能指标进行了全面仿真验证,重点探讨了其在低增益区间的软开关实现能力与效率优化潜力,旨在提升LLC变换器在宽范围输入输出应用中的动态响应与能源转换效率。; 适合人群:从事电力电子变换器设计、高频电源开发及相关领域的高校研究生、科研院所研究人员及企业研发工程师,要求具备扎实的电路理论基础、电力电子技术知识以及一定的Simulink仿真能力。; 使用场景及目标:①深入理解LLC谐振变换器在fs>fr条件下采用移相混合控制的内在工作机理与模态转换过程;②掌握利用Simulink搭建复杂谐振变换器精确仿真模型的方法与技巧;③分析并优化低压增益区的增益特性与损耗构成,为设计高效率、高功率密度的软开关电源提供理论依据和数据支持; 阅读建议:建议读者结合文中所述仿真模型,亲自复现仿真过程,重点观察不同控制参数(如移相比、开关频率)对电压增益曲线和关键波形的影响,并对比传统变频控制策略,深入探究混合控制在拓宽调压范围、提升轻载效率方面的优势,从而深化对现代高效谐振电源设计的理解。
内容概要:本文提出了一种基于粒子群优化算法(PSO)的配电网光伏储能双层优化配置模型,以IEEE33节点系统为标准算例,实现光伏发电单元与储能系统的协同选址与定容优化。该模型采用双层架构设计,上层以投资成本、运行经济性及网络损耗最小为目标优化设备配置方案,下层通过潮流计算评估系统在不同负荷场景下的运行性能,综合考虑电压稳定性、供电可靠性及可再生能源消纳能力,最终通过Matlab编程实现完整求解流程,为高渗透率分布式电源接入背景下的配电网规划提供了有效的技术支撑。; 适合人群:具备电力系统分析基础和Matlab编程能力的研究生、高校科研人员及从事新能源并网、智能配电网规划与优化的工程技术人员。; 使用场景及目标:①研究含高比例光伏接入的配电网规划与运行协同优化问题;②掌握双层优化建模方法与粒子群算法在复杂电力系统问题中的应用技巧;③为实际工程中分布式光伏与储能系统的科学选址与容量配置提供理论依据与仿真验证平台。; 阅读建议:建议读者结合Matlab代码深入理解双层迭代求解机制,重点关注算法收敛性分析、参数敏感性测试,并可通过更换初始种群、调整权重因子或引入其他标准测试系统(如IEEE69节点)进行对比实验,进一步验证所提模型的普适性与鲁棒性。

65,210

社区成员

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

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