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
-----------------------*/
...全文
306 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的啊,所以不能改。
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地介绍Visual C++ 2005进行流媒体编程的基本思路和方法,采用案例为主的叙述方式,将大量的技术理论融入具体的案例剖析中。采用的案例均来源于作者实际开发工作,具有很好的实用价值,可以帮助读者在开发中进行参考或直接应用。 第1篇 开发基础 1 第1章 数字音视频开发技术基础 3 1.1 数字音视频基本概念 4 1.1.1 数字音频技术基础 4 1.1.2 各种数字音频文件格式基础 4 1.1.3 视频的相关基础概念 8 1.1.4 常见的视频文件格式 8 1.2 数字音视频数据的编解码技术 10 1.2.1 音频数据的编解码 11 1.2.2 视频数据的编解码 13 1.2.3 音视频编码的相关标准 13 1.3 音视频处理平台的选择 15 1.3.1 个人多媒体计算机 15 1.3.2 嵌入式处理器ARM 16 1.3.3 数字媒体处理器DSP 16 1.4 音视频开发的典型应用 16 1.4.1 个人消费类电子产品 16 1.4.2 公共领域的音视频应用 18 1.5 常用音视频开发工具 21 1.5.1 DirectSound音频开发 21 1.5.2 DirectShow视频开发 21 1.5.3 DSP CCS算法开发 22 1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用程序 27 2.2.2 生成基于MFC的应用程序 32 2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 2.4.3 常用消息 66 2.5 基于对话框的编程 68 2.5.1 创建和编辑对话框 68 2.5.2 对话框种类 75 2.6 常用控件使用技巧 79 2.6.1 按钮类控件的使用 80 2.6.2 文本可编辑类控件的使用 81 2.6.3 静态类控件的使用 82 2.6.4 其他控件 83 2.7 Visual 2005开发技术资源 84 2.7.1 MSDN在线帮助 84 2.7.2 丰富的网络资源 86 2.8 Visual 2005开发的常见问题 86 2.8.1 如何使用volatile和const_cast 86 2.8.2 如何构造unicode版本的程序 87 2.8.3 如何使用.def文件 87 2.8.4 如何正确编写Win32 DLL 87 2.8.5 如何编写和使用资源DLL 88 2.8.6 如何实现对话框的数据交换 88 2.9 本章小结 89 第2篇 音频开发 91 第3章 DirectSound开发基础 93 3.1 Microsoft DirectSound SDK 94 3.1.1 比较DirectSound与DirectMusic 94 3.1.2 DirectSound SDK能做什么 95 3.1.3 如何获取DirectSound SDK 96 3.1.4 DirectSound SDK的基本结构 98 3.1.5 Directsound SDK安装 100 3.1.6 选择最适合用户的DirectSound SDK 100 3.1.7 用DirectSound进行编程的必要步骤 102 3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2 DirectSound应用程序的开发环境配置 119 3.3.3
老规矩,先看本节效果图我们实现这个支付功能完全是借助小程序云开发实现的,不用搭建自己的服务器,不用买域名,不用备案域名,不用支持https。只需要一个简单的云函数,就可以轻松的实现微信小程序支付功能。核心代码就下面这些一,创建一个云开发小程序关于如何创建云开发小程序,这里我就不再做具体讲解。不知道怎么创建云开发小程序的同学,可以去翻看我之前的文章,或者看下我录制的视频:https://edu.csdn.net/course/play/9604/204528创建云开发小程序有几点注意的1,一定不要忘记在app.js里初始化云开发环境。2,创建完云函数后,一定要记得上传二, 创建支付的云函数1,创建云函数pay三,引入三方依赖tenpay我们这里引入三方依赖的目的,是创建我们支付时需要的一些参数。我们安装依赖是使用里npm 而npm必须安装node,关于如何安装node,我这里不做讲解,百度一下,网上一大堆。1,首先右键pay,然后选择在终端中打开2,我们使用npm来安装这个依赖。在命令行里执行 npm i tenpay安装完成后,我们的pay云函数会多出一个package.json 文件到这里我们的tenpay依赖就安装好了。四,编写云函数pay完整代码如下//云开发实现支付 const cloud = require('wx-server-sdk')cloud.init() //1,引入支付的三方依赖 const tenpay = require('tenpay'); //2,配置支付信息 const config = ;exports.main = async(event, context) => 一定要注意把appid,mchid,partnerKey换成你自己的。到这里我们获取小程序支付所需参数的云函数代码就编写完成了。不要忘记上传这个云函数。出现下图就代表上传成功五,写一个简单的页面,用来提交订单,调用pay云函数。这个页面很简单,1,自己随便编写一个订单号(这个订单号要大于6位)2,自己随便填写一个订单价(单位是分)3,点击按钮,调用pay云函数。获取支付所需参数。下图是官方支付api所需要的一些必须参数。下图是我们调用pay云函数获取的参数,和上图所需要的是不是一样。六,调用wx.requestPayment实现支付下图是官方的示例代码这里不在做具体讲解了,完整的可以看视频。实现效果1,调起支付键盘2,支付完成3,log日志,可以看出不同支付状态的回调上图是支付成功的回调,我们可以在支付成功回调时,改变订单支付状态。下图是支付失败的回调,下图是支付完成的状态。到这里我们就轻松的实现了微信小程序的支付功能了。是不是很简单啊,完整的讲解可以看视频。

64,685

社区成员

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

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