在 C++ 中使用非易失性对象调用易失性成员函数
Calling volatile member function using not volatile object in C++
如果使用非易失性对象调用易失性成员函数,会发生什么?
#include <iostream>
using namespace std;
class A
{
private:
int x;
public:
void func(int a) volatile //volatile function
{
x = a;
cout<<x<<endl;
}
};
int main()
{
A a1; // non volatile object
a1.func(10);
return 0;
}
规则与const
成员函数相同。可以在非 volatile
对象上调用 volatile
成员函数,但不能在 volatile
对象上调用非 volatile
成员函数。
对于您的情况,A::func()
将被正常调用。如果相反,编译会失败。
class A
{
private:
int x;
public:
void func(int a) // non-volatile member function
{
x = a;
cout<<x<<endl;
}
};
int main()
{
volatile A a1; // volatile object
a1.func(10); // fail
return 0;
}
您可以像调用非常量对象上的 const
函数一样调用它,但出于不同的原因。
volatile
限定符使隐式 this 参数被视为指向可变对象的指针。
本质上,这意味着在访问对象的数据成员时将应用易失性对象的语义。任何对 x
的读取都无法优化掉,即使编译器可以证明在上次读取之后没有最近的写入。
自然地,如果对象不是真正的 volatile,func
的主体仍然是正确的,尽管没有尽可能优化。这样你就可以调用它了。
如果使用非易失性对象调用易失性成员函数,会发生什么?
#include <iostream>
using namespace std;
class A
{
private:
int x;
public:
void func(int a) volatile //volatile function
{
x = a;
cout<<x<<endl;
}
};
int main()
{
A a1; // non volatile object
a1.func(10);
return 0;
}
规则与const
成员函数相同。可以在非 volatile
对象上调用 volatile
成员函数,但不能在 volatile
对象上调用非 volatile
成员函数。
对于您的情况,A::func()
将被正常调用。如果相反,编译会失败。
class A
{
private:
int x;
public:
void func(int a) // non-volatile member function
{
x = a;
cout<<x<<endl;
}
};
int main()
{
volatile A a1; // volatile object
a1.func(10); // fail
return 0;
}
您可以像调用非常量对象上的 const
函数一样调用它,但出于不同的原因。
volatile
限定符使隐式 this 参数被视为指向可变对象的指针。
本质上,这意味着在访问对象的数据成员时将应用易失性对象的语义。任何对 x
的读取都无法优化掉,即使编译器可以证明在上次读取之后没有最近的写入。
自然地,如果对象不是真正的 volatile,func
的主体仍然是正确的,尽管没有尽可能优化。这样你就可以调用它了。