C++-const和volatile的一些问题
我看书上说“凡是const能够出现的地方,volatile都可以出现,且它们可以同时出现,const和volatile不能出现在构造函数或析构函数后”,为什么?const是表示有一个常量,但是volatile是表示可以被修改,怎么可以同时出现呢?而且为什么不能修饰构造函数和析构函数?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
const用于成员函数后面只是表明此接口调用不会修改对象内容,另一个作用是方便代码阅读和使用。构造析构函数都会改变对象,当然不能使用const限定;volatile表明对象内容会被意想不到地改变。const ,volatile同时出现并不于他们自身的定义冲突。对于多线程环境这是很常见的问题,在你调用const成员接口期间,该对象的内容给另一个线程给更新了。
const和volatile不冲突的。const表示这个变量是常量,不会被用户修改。volatile一般用在多线程里面,表示这个值有可能被修改:系统、中断等等引起的。编译器不会对其进行优化。
const不能修饰构造函数是因为:一般构造函数需要修改成员变量的值,但是const表示此函数不会修改成员变量的值,互相矛盾。析构函数同理。
如果将一个变量定义为 volatile 则相当于告诉编译器该变量可能随时被改变,例如被操作系统或硬件所改变。因为带有限定符 volatile 的变量可以在任何时刻改变,该变量的物理地址可能被频繁地访问。这就意味着编译器不能对这些变量实现优化,例如,将变量缓存到寄存器避免访问内存。相反,如果一个变量未被定义成 volatile,则编译器认为该变量不能在应用程序之外改变。因此编译器可对这种变量实行优化。
即使不用关键字 const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?原因如下:
关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。
通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
这里是一篇很有用的文章