const_cast的疑问

LubinLew 2014-03-25 12:33:31
const_cast主要用来暂时解除const限制。
下面程序中 变量b 为什么没有被修改,调用函数 my_sqrt时,他的引用被修改了,
引用被修改了,为什么原来的值不能被改变呢 ?


#include <iostream>

void my_sqrt(const int &x)
{
const_cast<int &>(x) = x * x; //去掉了x的const限制,否则不能更改x的值
std::cout<<"x = "<<x<<std::endl;
}
int main(void)
{
int a = 5;
const int b = 5;

my_sqrt(a);
std::cout<<"a = "<<a<<std::endl;

my_sqrt(b);
std::cout<<"b = "<<b<<std::endl;

return 0;
}

/*---- 输出结果---------
x = 25
a = 25
x = 25
b = 5
-----------------------*/
...全文
347 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2014-04-12
  • 打赏
  • 举报
回复
C++编译器,已经初始化的 const 会彻底看做常量(常量表达式) 编译的时候,只要是直接使用 该常量的名字,就会替换成常量本身; 至于存储这个数据的空间,只有通过间接访问的,才访问 这个内存,才能获得被修改的数据。 这是由于你的行为不一致,造成代码的行为也不一致。 因为你自己定义,这个数据为常量,而后通过其他途径,去企图修改这个常量。 C++允许你这么做,却不在保证你的程序的行为是正确的,可控的了。
Morrisss_ 2014-03-27
  • 打赏
  • 举报
回复
引用 8 楼 u011761982 的回复:
引用 6 楼 oYinGui1 的回复:
[quote=引用 5 楼 lgbxyz 的回复:] 再解释一下x吧,为什么x是25 [quote=引用 1 楼 oYinGui1 的回复:] x是个const引用,你将a传进去,x绑定在a上,a不是const的,去除了const限制,你可以通过x改a。但是你将b传入,b是const的,你去除了x的const限制,但是只是说你能通过x去改绑定的值,不过你的b还是const的啊,所以不能改。
上面已经说了,a没const限制,所以x去了const限制就能改a,但是b有const限制,你只是去掉了x的限制。。所以还是改不了b啊。。[/quote] 这个我也觉得很奇怪,在内存里面,b占据的内存明明已经变成25了,出了函数之后却还是输出5[/quote] 看汇编的时候,输出之后又有一个mov指令,说明它又变回5了。
DoDoMouse 2014-03-26
  • 打赏
  • 举报
回复
引用 6 楼 oYinGui1 的回复:
引用 5 楼 lgbxyz 的回复:
再解释一下x吧,为什么x是25 [quote=引用 1 楼 oYinGui1 的回复:] x是个const引用,你将a传进去,x绑定在a上,a不是const的,去除了const限制,你可以通过x改a。但是你将b传入,b是const的,你去除了x的const限制,但是只是说你能通过x去改绑定的值,不过你的b还是const的啊,所以不能改。
上面已经说了,a没const限制,所以x去了const限制就能改a,但是b有const限制,你只是去掉了x的限制。。所以还是改不了b啊。。[/quote] 这个我也觉得很奇怪,在内存里面,b占据的内存明明已经变成25了,出了函数之后却还是输出5
coeusw 2014-03-26
  • 打赏
  • 举报
回复
http://blog.csdn.net/sinshine/article/details/6743454
Morrisss_ 2014-03-26
  • 打赏
  • 举报
回复
引用 5 楼 lgbxyz 的回复:
再解释一下x吧,为什么x是25
引用 1 楼 oYinGui1 的回复:
x是个const引用,你将a传进去,x绑定在a上,a不是const的,去除了const限制,你可以通过x改a。但是你将b传入,b是const的,你去除了x的const限制,但是只是说你能通过x去改绑定的值,不过你的b还是const的啊,所以不能改。
上面已经说了,a没const限制,所以x去了const限制就能改a,但是b有const限制,你只是去掉了x的限制。。所以还是改不了b啊。。
LubinLew 2014-03-25
  • 打赏
  • 举报
回复
再解释一下x吧,为什么x是25
引用 1 楼 oYinGui1 的回复:
x是个const引用,你将a传进去,x绑定在a上,a不是const的,去除了const限制,你可以通过x改a。但是你将b传入,b是const的,你去除了x的const限制,但是只是说你能通过x去改绑定的值,不过你的b还是const的啊,所以不能改。
LubinLew 2014-03-25
  • 打赏
  • 举报
回复
那么x怎么解释呢? 为什么与b的值不同, x是b的引用的啊
引用 2 楼 cangyingzhijia 的回复:
常量被编译器直接替换成对应的值了,看下面编译出来的汇编的147行,直接替换成立即数了
苍蝇①号 2014-03-25
  • 打赏
  • 举报
回复
常量被编译器直接替换成对应的值了,看下面编译出来的汇编的147行,直接替换成立即数了

141     leaq    -16(%rbp), %rdi
142     call    _Z7my_sqrtRKi
143     movl    $.LC2, %esi
144     movl    $_ZSt4cout, %edi
145     call    _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
146     movq    %rax, %rdi
147     movl    $5, %esi
148     call    _ZNSolsEi
149     movq    %rax, %rdi
150     movl    $_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, %esi
Morrisss_ 2014-03-25
  • 打赏
  • 举报
回复
x是个const引用,你将a传进去,x绑定在a上,a不是const的,去除了const限制,你可以通过x改a。但是你将b传入,b是const的,你去除了x的const限制,但是只是说你能通过x去改绑定的值,不过你的b还是const的啊,所以不能改。

65,170

社区成员

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

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