C++中易失性成员函数与常量成员函数的比较
volatile member function vs. constant member function in C++
很多人都在说"volatile成员函数完全类似于const的工作方式。"
它们非常相似,因为如果指针被标记为const/vvolatile,它只能访问标记为const/Vvolatile的成员函数。
但实际上,将成员函数定义为const还有一个额外的效果,即使函数只读。对函数内对象的任何修改都将导致编译器错误。挥发性成员函数中是否存在类似物?
好吧,一个volatile成员函数会使对象成员变得volatile,也就是说,this
将像定义了volatile T * const this
一样。因此,对成员变量的任何引用都是不稳定的。
请记住,易失性读/写操作是编译器无法消除/重新排序的操作。它们通常用于实现内存映射的硬件设备或类似的东西。
坦率地说,我从来没有使用过这个功能,除了做一些聪明的技巧来过滤对函数的访问,而不是利用对象的易失性。如果您的代码级别足够低,需要volatile
,那么您可能会想把volatile放在所需的变量中。
简短回答:是。
如果对象的实例被声明为volatile,那么在其上调用非易失性方法(或者这些方法调用其他非易失方法)是错误的。
非易失性实例仍然可以调用volatile方法,但这并不是说在一个类中有两个完全相同的方法是完全合法的——一个是volatile,另一个不是。在这种情况下,非易失性实例将调用该方法的非易失版本。
但实际上,将成员函数定义为const还有一个额外的效果,即使函数只读。
这有点误解。它不会使成员函数变为只读,而是使*this
变为const
。两者之间有一个很小但很重要的区别(成员函数仍然可以修改mutable
成员,如果它想让人讨厌,它可以去掉*this
的const
特性来修改它想要的任何内容,编译器不会抱怨)。
volatile
成员函数的工作方式完全相同——它使*this
成为volatile
。
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法