2010-07-25 52 views
3
class A{ 
private: 
    int a; 
public: 
    A() {a = 4;} 
    const int& random1() const {return a; } 
    //int&  random2() const {return a; } 
    const int* random3() const {return &a;} 
    //int*  random4() const {return &a;} 
}; 

int main(){ 
    A objA; 
    cout<<objA.random1()<<"\n"; 
    cout<<*objA.random3()<<"\n"; 
} 

random2()random4()是不允許的,如上所述。我總是知道這一點,但直到今天,從未寫過我自己的代碼。什麼都不允許使用const成員函數?

除了這兩種情況之外,什麼都不允許在const成員函數中使用?

任何對C++標準文本的引用也會有所幫助。謝謝!

回答

10

首先明白const T*是指向一些不能更改的T的指針。第二件要記住的是所有成員實際上都通過this->訪問。

所以(§9.3.1):

阿非靜態成員函數可以被聲明爲const,易失性或const揮發性。這些cvqualifiers影響這個指針的類型(9.3.2)。

而且它做什麼(§9.3.2):

在非靜態(9.3)成員函數的主體,關鍵字這是一個非左值表達式,其值爲的地址該函數被調用的對象。 X類的成員函數中的類型是X *。如果成員函數聲明爲const,則其類型爲const X *,如果成員函數聲明爲volatile,則其類型爲volatile X *,並且如果成員函數聲明爲const volatile,則其類型爲const揮發性X *。

上的功能的const使得this指針const T*

這就是爲什麼這些示例失敗:在int&變型,a訪問爲this->athisconst T*,所以aconst intconst int不能隱式轉換爲int&。與其他功能相同。

換句話說,當一個函數爲const時,它會在類中的所有內容上剔除const,並且不能隱式地將const轉換爲遠端。

0

即使不更改任何成員數據,Const成員函數也不能調用非const成員函數。有時你需要提供同一個函數的const和非const版本,因爲這個指針被隱式地傳遞給成員函數,並在重載解析中扮演一個角色。

相關問題