小弟最近被限定符const弄晕了,在此恳请大神指教~

-bootblack- 2016-03-09 10:06:55
1>第一种情况,const修饰指针和引用
因为const修饰引用或者指针,所以形参是和实参紧密的"绑"在一起,所以在这种情况下,如果实参是const,那么形参必须是const.
当然,形参是const,实参也可以是非const,,因为可以将非const 赋值给const.这也是为什么很多情况下将形参修饰为const.
2>第二种情况:const修饰普通形参
因为函数的传递实际上将实参的副本传递给形参,这里我认为这个副本是不具有const属性的(即使实参是const,它的副本也是不具有const属性的).
所以这里不要求形参是否具有const属性.如果函数形参此时仍然是const,我认为这里是想告诉读者,在这个函数中,不可修改这个形参的值,仅此而已.
请问大神:上面小弟的理解正确吗?尤其是红色部分和蓝色部分,恳请大神指教~
...全文
128 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灸舞 2016-03-10
  • 打赏
  • 举报
回复
LZ的说法我觉得是正确的,普通形参加const,更多的是告诉使用者,这个变量不能被修改,否则可能造成不可意料的情况 -------------------------------------------------------------------------------------------------------------------------------------------------------------- 普通形参加不加const限定符对实参没有影响,引用形参和指针形参前面没有const限定符时,实参必须是非const的,而前面有const限定符时对实参也没有什么影响。 为什么会出现这种情况? 原因在于实参的传递方式不同,函数中的形参是普通形参的时,函数只是操纵的实参的副本,而无法去修改实参,实参会想,你形参反正改变不了我的值,那么你有没有const还有什么意义吗?引用形参和指针形参就下不同了,函数是对实参直接操纵,没有const的形参时实参的值是可以改变的,这种情况下怎能用函数来操纵const实参呢。 我一直这样记忆:“对于变量的约束,允许加强,当绝对不能削弱.....” 例如:实参是const,那么形参如果是非const意味着可以在函数体中改变形参的值,使约束削弱了所以不行。对于使用&,自然也是这个道理。同样的,指针里面的const也是这个样子的,如果让非const指针指向了const对象的地址,那么必然是无法通过编译的,因为如果这样做了,意味着可以通过这个指针改变本该是const的值了,显然是使约束削弱了
-bootblack- 2016-03-10
  • 打赏
  • 举报
回复
已准备好板凳,瓜子....
-bootblack- 2016-03-10
  • 打赏
  • 举报
回复
引用 3 楼 qq423399099 的回复:
LZ的说法我觉得是正确的,普通形参加const,更多的是告诉使用者,这个变量不能被修改,否则可能造成不可意料的情况 -------------------------------------------------------------------------------------------------------------------------------------------------------------- 普通形参加不加const限定符对实参没有影响,引用形参和指针形参前面没有const限定符时,实参必须是非const的,而前面有const限定符时对实参也没有什么影响。 为什么会出现这种情况? 原因在于实参的传递方式不同,函数中的形参是普通形参的时,函数只是操纵的实参的副本,而无法去修改实参,实参会想,你形参反正改变不了我的值,那么你有没有const还有什么意义吗?引用形参和指针形参就下不同了,函数是对实参直接操纵,没有const的形参时实参的值是可以改变的,这种情况下怎能用函数来操纵const实参呢。 我一直这样记忆:“对于变量的约束,允许加强,当绝对不能削弱.....” 例如:实参是const,那么形参如果是非const意味着可以在函数体中改变形参的值,使约束削弱了所以不行。对于使用&,自然也是这个道理。同样的,指针里面的const也是这个样子的,如果让非const指针指向了const对象的地址,那么必然是无法通过编译的,因为如果这样做了,意味着可以通过这个指针改变本该是const的值了,显然是使约束削弱了
聆听大神讲解,小弟受益匪浅,感激不尽~~~
qq20004604 2016-03-10
  • 打赏
  • 举报
回复
简单的说,const 变量,这个变量不能改 const指针,分为两种,指针只能指一个对象(这个对象的值可以被改),和指针指向的对象的值不能被改(但可以让它指向其他的对象)。
引用
①对于const int*a;限定的是指针的值,不限定指针指向的地址;(想象成const *a,*a是值) ②对于int*const a;限定的是指针指向的地址,不限定指针的值。(想象成const a,a是地址)。
http://blog.csdn.net/qq20004604/article/details/50345347 即,常用的const int *a这样,是不能改这个指针指向的地址的值的。 然后const指针可以指向const对象,非const指针可以指向非const对象; const指针可以指向非const对象,但反过来不行。
赵4老师 2016-03-10
  • 打赏
  • 举报
回复
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
lm_whales 2016-03-09
  • 打赏
  • 举报
回复
const 对象的引用,这种类型,被它引用的对象,对于引用来说是 const 对象,值不可被修改 而该对象本身,可以是 const 对象,也可以是 非 const 对象 const 对象 ,表示对象是不可修改的,包括 ,用于函数参数表中,表示 函数不能修改该对象 对于内置类型来说,const 对象参数的 const属于多余的 非内置类型,一般应该传递引用,而非对象

64,683

社区成员

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

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