2012-08-11 43 views
3

我寫了這個代碼在C++:const如何使一個函數重載?

class Foo 
{ 
public: 
    int& fun(){return var;}  // 1st fun 
    int fun() const {return var;} // 2rd fun 
private: 
    int var; 
}; 
int main() 
{ 
    Foo foo; 
    int i = foo.fun(); 
    return 0; 
} 

我知道C++不能判定由返回值重載函數,但爲什麼當我添加了一個常量到2RD功能,超載可以工作? 'const'做了什麼?

回答

6

編譯器無法通過返回類型進行區分,因爲在執行分配之前返回值可能會經歷轉換。另一方面,調用函數的對象是該函數的參數(儘管是隱式的),因此編譯器可以對其進行區分。

+0

我得出這樣的結論:函數名稱後面的const意味着implict對象(aka。'this')參數是const,所以這兩個函數之間的參數實際上是不同的,這會使重載起作用。是真的? – 2012-08-15 01:10:09

+0

@GaryGauh是的,這個結論是正確的。 – dasblinkenlight 2012-08-15 01:14:47

2

const爲以下列方式使用:該函數的名稱指的是隱式this參數CONST後

Foo inst1; 
const Foo inst2; 

inst1.fun(); // 1st fun 
inst2.fun(); // 2nd fun 

。所以,對於inst1它將會是Foo*和inst2 const Foo*。這將指導超載。

返回值不用於選擇過載。具有相同參數集和不同類型返回值的方法/函數不允許在同一圖層上。

1

對於它的價值,從標準(§13.3.1/ 3,4)語言:

同樣,在適當的時候,上下文可以構造包含隱含的對象 參數的參數列表表示要操作的對象。由於參數和參數在各自列表中的位置相關聯,因此慣例是隱式對象參數(如果存在)始終是第一個參數,而隱含對象參數(如果存在)總是第一個參數。

對於非靜態成員函數,隱含的對象參數的類型是

- 「左值參考CV X」爲不具有REF-限定符或與& REF-限定符

聲明的函數 - 對於用& & & ref-qualifier 聲明的函數的「右值引用cv X」其中X是函數是成員的類,cv是成員函數聲明中的cv限定。 [例如:對於X類的const成員函數,額外參數被假定爲具有「對const X的引用」類型。 - 結束示例]

相關問題