C++中易失性成员函数与常量成员函数的比较

volatile member function vs. constant member function in C++

本文关键字:成员 函数 比较 常量 C++ 易失性      更新时间:2023-10-16

很多人都在说"volatile成员函数完全类似于const的工作方式。"

它们非常相似,因为如果指针被标记为const/vvolatile,它只能访问标记为const/Vvolatile的成员函数。

但实际上,将成员函数定义为const还有一个额外的效果,即使函数只读。对函数内对象的任何修改都将导致编译器错误。挥发性成员函数中是否存在类似物?

好吧,一个volatile成员函数会使对象成员变得volatile,也就是说,this将像定义了volatile T * const this一样。因此,对成员变量的任何引用都是不稳定的。

请记住,易失性读/写操作是编译器无法消除/重新排序的操作。它们通常用于实现内存映射的硬件设备或类似的东西。

坦率地说,我从来没有使用过这个功能,除了做一些聪明的技巧来过滤对函数的访问,而不是利用对象的易失性。如果您的代码级别足够低,需要volatile,那么您可能会想把volatile放在所需的变量中。

简短回答:是。

如果对象的实例被声明为volatile,那么在其上调用非易失性方法(或者这些方法调用其他非易失方法)是错误的。

非易失性实例仍然可以调用volatile方法,但这并不是说在一个类中有两个完全相同的方法是完全合法的——一个是volatile,另一个不是。在这种情况下,非易失性实例将调用该方法的非易失版本。

但实际上,将成员函数定义为const还有一个额外的效果,即使函数只读。

这有点误解。它不会使成员函数变为只读,而是使*this变为const。两者之间有一个很小但很重要的区别(成员函数仍然可以修改mutable成员,如果它想让人讨厌,它可以去掉*thisconst特性来修改它想要的任何内容,编译器不会抱怨)。

volatile成员函数的工作方式完全相同——它使*this成为volatile