2012-05-24 59 views
1

方法聲明中'volatile'關鍵字的位置是否影響其功能?C++中成員函數聲明中volatile關鍵字的位置

即,以下兩段代碼是否有區別?

A.

class Test 
{ 
public: 
    volatile void testMe() 
    { 
    } 
}; 

B.

class Test 
{ 
public: 
    void testMe() volatile 
    { 
    } 
}; 

而且也是一樣,當成員函數返回值。謝謝!

回答

5

它與const限定符相同。

在第一個示例中,volatile適用於函數的返回值。在這種情況下它是無效的,所以它沒有多大意義。事實上,以揮發性值*返回沒有什麼意義。揮發性返回類型只會使感用於參考:

volatile int& foo() { ... } 
volatile int& i = foo(); // OK 
int j = foo(); // OK, use the volatile reference to construct a non volatile int 
int& j = foo(); // Error! 

在第二種情況下,這意味着,該方法是volatile,因此它可以在被調用(非const)非易失性揮發性類Test的實例。沒有volatile限定符的類似方法無法在volatile實例上調用。

Test test0; 
test0.testMe(); // OK 
volatile Test test1; 
test1.testMe(); // OK 
test1.someNonVolatileMethod(); // Error. 

*除非該值是一個指針

+0

這也是有道理的值返回揮發性類類型,這樣只有揮發性的成員函數可以在臨時調用。我不是說我見過這個,但看起來似乎合理。 –

+0

@ edA-qamort-ora-y我必須認真思考那個問題。我想你已經確定了一個不同於'const'的情況,其中'const'返回值會擾亂語義。 – juanchopanza

3

適用於const的相同規則適用於volatile

當返回void(而不是返回)時,volatile在第一個片段中沒有用處。

第二個片段將整個方法標記爲volatile

例如,如果您有:

volatile Test m; 
m.testMe(); 

只編譯爲testMe被標記爲volatile(如你的第二個代碼)。