很多人都说 “volatile成员函数完全类似于const的工作方式。”
它们非常相似,如果指针被标记为const / volatile,它只能访问标记为const / volatile的成员函数。
但实际上将成员函数定义为const会产生额外的影响,这会使函数成为只读。对函数内部对象的任何修改都将导致编译器错误。在volatile成员函数中是否有这样的类比?
答案 0 :(得分:3)
好吧,volatile成员函数会使对象成员变为volatile,即this
就像定义volatile T * const this
一样。因此,对成员变量的任何引用也都是不稳定的。
请记住,易失性读/写是编译器无法省略/重新排序的操作。它们通常用于实现内存映射的硬件设备或类似的东西。
坦率地说,我从来没有使用过这个功能,只是通过巧妙的技巧来过滤对函数的访问,而不是利用对象的易失性。如果你的代码足够低,需要volatile
,你可能会想要将volatile放在你需要的变量中。
答案 1 :(得分:0)
简答:是的。
如果一个对象的实例被声明为volatile,则在其上调用非易失性方法是错误的(或者那些方法调用其他非易失性方法)。
非易失性实例仍然可以调用volatile方法,但并不是说在类中有两个相同的方法是完全合法的 - 一个是volatile,一个不是。在这种情况下,非易失性实例将调用该方法的非易失性版本。
答案 2 :(得分:0)
但实际上将成员函数定义为const会产生额外的影响,这会使函数成为只读函数。
这有点误解。它不会使成员函数成为只读 - 它会使*this
const
。两者之间有一个小但重要的区别(成员函数仍然可以修改mutable
成员,如果它想要讨厌,它可以抛弃const
- *this
修改它想要的任何东西,编译器不会抱怨)。
volatile
成员函数的工作方式完全相同 - 它会*this
volatile
。