2011-06-02 38 views
2

說我有以下C++類。C++爲什麼它調用函數參考

class C 
{ 
    int foo() const; 
    int & foo(); 
}; 

,我只是叫myC.foo(),我可以看到使用它調用一個與參考調試器。

爲什麼?

謝謝!

+4

你不認爲顯示'myC'的定義可能是相關的? – ildjarn 2011-06-02 17:08:20

回答

11

這很可能是因爲myC是一個非const值,因此編譯器更喜歡非const方法。當從const值訪問時,const方法將僅爲首選。例如

C value1; 
value1.foo(); // int& foo(); 
const C value2; 
value2.foo(); // int foo() const; 

EDIT

此外,如奧利指出的那樣,在C++重載解析不受該方法的返回類型。因此,它不會根據使用該值的方式選擇其中一個簽名。

+7

+1:確實。還值得一提的是,重載分辨率不受返回類型的影響? – 2011-06-02 17:09:32

+0

@Oli,很好的電話。增加了一個blurb。 – JaredPar 2011-06-02 17:10:54

3

因爲myC一定不是const obj。

C++允許根據const關鍵字重載函數。

如果創建該類的const對象,則只能通過該對象調用const成員函數,因爲它們保證它們不會修改該對象的狀態。

非常量對象既可以調用const也可以調用非const成員函數,但編譯器會優先於非const成員函數而不是const成員函數,因此會優先考慮您的情況中的行爲。