我基于这个概念问了这个函数(可能不正确?!):只要const存在,就可以在这个地方存在一个volatile。
class classA
{
public:
const int Foo() const;
}
这里第一个“const”表示返回值是const,我们无法改变它。 第二个const表示“Is Query”,这个函数不能改变成员变量而不能调用非const函数。
现在变得不稳定:我可以理解volatile对变量的作用,比如“volatile int a”。 但是我不知道以下几点之间的区别:
Case 1: The return type is volatile?
volatile void Function1();
Case 2: The function can only call volatile functions? Why add volatile here? Any example?
void Function2() volatile;
Case 3: Is it valid? If yes, is it simply a combination of Case 1 and Case 2?
volatile void Function3() volatile;
当我们将const放在函数声明的末尾时,它有一个漂亮的名字:“Is Query” 你能为案例2中的“易变”提供一个合适的名字/别名吗? 我的意思是,每当我们称这个名字时,我们都知道我们正在讨论案例2,而不是案例1。
提前谢谢!
答案 0 :(得分:7)
Volatile有一个主要功能,就是说“STOP!这个对象连接到外部资源,因此当我写入它时,不要对其他易失性读取或写入重新排序写入,当我读到它,不要同样重新排序,不要优化它们!“
为了支持这一点,您可以将volatile
放在成员函数之后,这是调用volatile
类对象上的成员函数所必需的。
// just a silly example
struct HWOverlayClock {
HWOverlayClock() { }
int64_t getTime() volatile const { return timestamp; }
int64_t timestamp;
};
// imagine we use an implementation defined way to put the
// object at some fixed machine address
volatile const HWOverlayClock clock __attribute__((at_address(0xbabe)));
将volatile
放在返回值上也可以这样做,但在我看来它没那么有用,因为返回值通常是临时值,而volatile
语义完全相反。临时工。将volatile
放在void
上尤其荒谬(如果类型不是类类型,则放在返回类型的顶层时忽略const
和volatile
在*
的右边,如果它是一个指针),因为这些返回值与内存不对应,可能也被实现保存在寄存器中)。将volatile
放在非顶层的引用或指针上可能很有用,如下所示
struct Controller {
HWOverlayClock volatile const* getClock() const { return clock; }
private:
volatile const HWOverlayClock *clock;
};
希望它有所帮助。
答案 1 :(得分:3)
第二个const意味着“Is Query”,这个函数不能改变成员变量而不能调用非const函数。
是的,那是正确的。
volatile void Function1();
返回类型是不稳定的?
此处函数的返回类型为void
(表示无效)。如果它什么都不返回,那么指定返回的任何内容都不是volatile
是没有意义的。 volatile
前面的空白将是还原的。
如果返回类型为int
,则表示前面的volatile
适用于返回类型。这意味着此返回值只能采用volatile
的变量类型。
void Function2()volatile;
该函数只能调用volatile函数吗?为什么在这里添加volatile?任何例子?
是的,那是正确的。请参阅下面的代码示例,它演示了这一点
volatile void Function3()volatile;
有效吗?如果是,它只是案例1和案例2的组合吗?
案例1中的volatile
是多余的,如果函数返回void
(没有),则返回的值为volatile
是没有意义的,所以基本上等于只是案例2。
#include<iostream>
class Myclass
{
public:
volatile int i;
Myclass():i(10){}
void doSomething()
{
std::cout<<"\nInside doSomething";
}
void doSomethingMore() volatile
{
std::cout<<"\nInside doSomethingMore";
doSomething(); //Error
}
};
int main()
{
Myclass obj;
obj.doSomethingMore();
return 0;
}
“Is Query”你能否为案例2中的“volatile”提供一个合适的名字/别名?我的意思是,每当我们称这个名字时,我们都知道我们正在谈论案例2,而不是案例1.
遵循简单的规则:
只要volatile
或const
关键字出现在声明或定义中函数签名的末尾,关键字就会应用于该函数。
这是因为函数签名之前的任何内容都适用于返回类型。
使用volatile
关键字来表示函数签名更有意义,因为它准确地表明了目的,我认为你应该坚持这种标准方式,因为它比任何别名更清楚地表明了意图。
答案 2 :(得分:3)
当
this
是指向const
“的指针时,第二个const意味着”可以使用,此函数无法更改非 -mutable
this
的成员变量,无法在this
上调用非常量函数。
在那里,为你修好了。
现在应该清楚volatile
成员函数意味着什么:当this
是指向volatile的指针时,可以调用它。如果它们也是不稳定的,它只能调用其他成员函数的要求是结果,但不是核心含义。