成员函数是不稳定的是什么意思?

时间:2013-05-25 03:22:57

标签: c++

我通常会看到用于表示const成员函数的const说明符。但是,当使用 volatile 关键字时,它意味着什么?

void f() volatile {}

这对我来说很好,但我不明白这是为了什么。我在搜索中找不到任何相关信息,所以我们非常感谢您的帮助。

更新:为了说清楚,我知道volatile的用途。我只是不知道在这种情况下它意味着什么。

3 个答案:

答案 0 :(得分:14)

成员函数上的volatile限定符类似于const限定符。它允许在volatile个对象上调用成员函数:

struct A {
    void f() volatile {}
    void g() {}
};

int main() {
    A volatile a;
    a.f(); // Allowed
    a.g(); // Doesn't compile
}

答案 1 :(得分:9)

在会员功能上,constvolatile限定符适用于*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();

}

答案 2 :(得分:2)

声明为volatile的对象不会在某些优化中使用,因为它们的值可能随时更改。系统始终在请求点读取易失性对象的当前值,即使先前的指令要求来自同一对象的值也是如此。此外,在分配时立即写入对象的值。

volatile对象只能调用volatile成员函数。

因此,通过将成员函数标记为volatile,您可以将该成员函数中对象的非静态数据成员的任何访问权限设置为volatile。