博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gotchas 6-对常量(性)的认识误区
阅读量:6167 次
发布时间:2019-06-21

本文共 1252 字,大约阅读时间需要 4 分钟。

摘要:

1)“字面常量没有地址,永远不能改变其值”③

2)关于左值和右值得理解误区:
左值并不是指能放在赋值号左边的值,右值自然也不是指能放到赋值号右边的。左值可以放在赋值号右边,但右值一定只能是在赋值号的右边。但左值也不一定能放在赋值号的左边:
const int i;
对于常量i是不能放在赋值号的左边的,但其的的确确是个左值,它是一个不能改变的左值。
正确的理解是:左值是“能放置值得地方”,而右值就是没有与之相关的地址的值。
3)关于常量性的理解:
int i=10;
const int *ip=&i;
i=10;//没问题,约束的不是i的一般操作,而是通过ip对i的操作
*ip=13;//错误
“const这个修饰词描述了通过ip对i的操作约束,而不是对i一般操作的约束”①
“这里我们就有了一个指向const int类型的指针,而这个const类型对象又是一个普通的int类型对象的引用。这里的常量性仅仅限制了我们能通过ip做什么。这不表明i不会变,只是对它的修改不能通过ip进行。如果我们把问题说的再详细一点,请看下面这个把const和volatile结合使用的例子:
extern const volatile time_t clock;
这个const修饰词表面我们未被允许(在代码中显示的直接的)修改ckock的值,但是同时存在volatile修饰词说明clock肯定还是会通过其他途径发生变化”②
=======================================================
注释:
①译注:也就是说变量本身不具有常量性,具有常量性的是通过指针反引用的那个能够作为左值得表达式(*ip),虽然这两者从观念上来看,是同一个对象。这就让我们理解,C++常量性不是根据低级地址绑定的,而是富有高级的对象观念的。
②译注:这个例子说明了C++中的常量性的观念只限制了在代码中对const修饰的变量显示的直接修改,对于其他方式修改,并不是C++语言的常量性的要求。总体来看本文指出了常量性是高级操作。
=======================================================
个人理解:
对于③的理解:
int &i=12;//错误,“引用必须以左值来初始化”→常见错误44:引用和临时对象
const int &i2=12;//正确,编译器会声明一个临时对象
但是不要试图通过下面的方式改变字面常量12的值:
const_cast<int &>(i2)=11;//赋值给那个匿名临时对象,或者程序直接崩溃。
=========================================================
See Also
常见错误44:引用和临时对象

转载于:https://www.cnblogs.com/zhanjindong/archive/2012/09/30/2839859.html

你可能感兴趣的文章
从91移动应用发展趋势报告看国内应用现状
查看>>
【ORACLE技术嘉年华PPT】MySQL压力测试经验
查看>>
Linux下汇编调试器GDB的使用
查看>>
css溢出机制探究
查看>>
vue中如何实现后台管理系统的权限控制
查看>>
关于angularjs过滤器的理解
查看>>
vue 使用html2canvas将DOM转化为图片
查看>>
angular编辑-初始化变量失败
查看>>
jQuery源码解析之Data
查看>>
React Native Cannot read property 'bindings' of null (null)) 解决!
查看>>
同样的神经网络引擎,苹果A11芯片比华为麒麟970牛在哪?
查看>>
ucar-weex
查看>>
vuex 理解与应用
查看>>
ES6(3)-各种类型的扩展(数组、对象)
查看>>
eclipse部署web项目至本地的tomcat但在webapps中找不到
查看>>
mysql 分组
查看>>
Android JNI入门第三篇——jni头文件分析
查看>>
ubuntu server 10.4下NFS服务的配置
查看>>
nginx+php-FastCGI+mysql性能测试
查看>>
Openstack架构及基本概念理解
查看>>