2011-09-22 53 views
2

非mumber函數可以被多次刪除,而成員函數只能被聲明一次嗎?這是正確的嗎 ?我的例子似乎是說是的。非成員函數可以多次聲明,而成員函數只能聲明一次?

但是爲什麼?

class Base{ 
public: 
    int foo(int i); 
    //int foo(int i=10); //error C2535: 'void Base::foo(int)' : member function already defined or declared 
}; 

//but it seems ok to declare it multiple times 
int foo(int i); 
int foo(int i=10); 

int foo(int i) 
{ 
    return i; 
} 

int main (void) 
{ 
    int i = foo();//i is 10 
} 
+0

鏈接器如何處理? –

+0

@Captain長頸鹿:鏈接器將實際調用與定義進行匹配;它不依賴於聲明。 _compiler_早些時候使用這些聲明來解析調用。 – MSalters

+0

@all,感謝所有好的回答/評論/鏈接,這件事情現在已經清楚了! – Gob00st

回答

6

從標準(2003),§8.3.6/ 4說,

對於非模板函數,默認 參數可以被添加在後面 聲明的函數的在相同的 範圍。從標準本身

例子:

void f(int, int); 
void f(int, int = 7); 

第二個聲明增加了默認值!

另見§8.3.6/ 6。

而一個有趣的(和有點關係)主題:

和第9.3節/ 2,

除成員函數的定義出現的一類外定義除了類模板和成員函數模板(14.7)的成員函數的顯式特殊化出現在類定義之外,成員函數 不得重新聲明。

希望有所幫助。

+0

除他的代碼中沒有模板外。 –

+0

那是不是很完美,@詹姆斯?該標準的引用部分表示它適用於非模板函數。 –

+0

@UncleBens:謝謝。該報價非常精確。我將它添加到我的答案中。是的,在重新閱讀這個問題後,我覺得答案似乎不完整,我正在尋找另一個規範的引用。你在我面前做過。 – Nawaz

0

它的確定性 - 但我認爲這是不好的做法。

1

你得到相同的結果與此簡化版本:

int foo() ; 
int foo() ; // OK -- extern functions may be declared more than once 
class C { 
    int foo() ; 
    int foo() ; // Error -- member function may not be declared more than once 
} ; 

原因或許是歷史的 - 大量的extern功能C代碼中使用的重聲明的,所以他們就可以了。