我通常会看到const
用于指示 const 成员函数的说明符。volatile
但是使用关键字时是什么意思?
void f() volatile {}
这对我来说很好,但我不明白这是为了什么。我在搜索中找不到任何有关此的信息,因此不胜感激。
更新:为了清楚起见,我知道volatile
是为了什么。我只是不知道在这种情况下它意味着什么。
我通常会看到const
用于指示 const 成员函数的说明符。volatile
但是使用关键字时是什么意思?
void f() volatile {}
这对我来说很好,但我不明白这是为了什么。我在搜索中找不到任何有关此的信息,因此不胜感激。
更新:为了清楚起见,我知道volatile
是为了什么。我只是不知道在这种情况下它意味着什么。
成员函数上的限定符volatile
类似于const
限定符。它允许在volatile
对象上调用成员函数:
struct A {
void f() volatile {}
void g() {}
};
int main() {
A volatile a;
a.f(); // Allowed
a.g(); // Doesn't compile
}
在成员函数上,const
限定符volatile
适用于*this
. 对该成员函数内的任何实例成员的访问都将是访问,具有与任何变量volatile
相同的语义。volatile
特别是,volatile
不能在volatile
对象上调用非成员函数,并且volatile
以与以下相同的方式适用于重载const
:
#include <iostream>
class C {
public:
void f() {
std::cout << "f()\n";
}
void f() const {
std::cout << "f() const\n";
}
void f() volatile {
std::cout << "f() volatile\n";
}
void f() const volatile {
std::cout << "f() const volatile\n";
}
};
int main() {
C c1;
c1.f();
const C c2;
c2.f();
volatile C c3;
c3.f();
const volatile C c4;
c4.f();
}
声明为 volatile 的对象不会在某些优化中使用,因为它们的值可以随时更改。系统总是在请求时读取 volatile 对象的当前值,即使先前的指令要求来自同一对象的值。此外,对象的值在赋值时立即写入。
一个 volatile 对象只能调用 volatile 成员函数。
因此,通过将成员函数标记为易失性,您可以对该成员函数内的对象的非静态数据成员进行任何访问作为易失性。