2016-03-05 29 views
-4

我在介紹C++的oop,我有一個問題。 當我在頭文件中聲明一個靜態函數時,爲什麼如果我在代碼文件中也放入了靜態函數,我會得到一個錯誤?我的意思是,爲什麼靜態應該只在頭文件?錯誤,因爲「靜態」在C代碼

的menssage錯誤:

mod.cc:71:40:錯誤:不能聲明成員函數 '靜態INT MOD :: mida_maxima()' 爲有靜態鏈接[-fpermissive]

+1

請張貼你想要做的一個例子。 –

+0

標題:靜態布爾函數(); 代碼:靜態布爾函數(){//代碼//} 如果我在代碼文件中聲明該函數爲靜態,則會出現錯誤,我的問題是原因。 – KooPad

+1

請發表[mcve]。是的,請包括MCVE的完整錯誤信息。 –

回答

1

staticclass裏面的成員函數是一個類函數;它在沒有任何接收器的情況下工作,所以this不能在裏面使用。但是,任何編制單位都可以看到它的聲明。

當您定義static函數時,它具有static鏈接,因此只能從其編譯單元中看到(有點像C的static關鍵字)。顯然,一個類函數通常應該在整個程序中可見(而不僅僅是一個編譯單元)。

因此,static成員函數的定義應該static,換句話說:

// perhaps in a header file 
class Foo { 
    static void memberfun (int); // class member function declaration 
}; 

// definition in the compilation unit 
void // static is forbidden here 
Foo::memberfun(int arg) { 
    /// some body 
} 

換言之,C++重用static關鍵字爲兩個不相關的用途:定義類別成員和聲明靜態鏈接(由C啓發)。

+0

完美!非常感謝! – KooPad

+0

我認爲這個答案並沒有真正解決爲什麼在函數的定義中禁止static的問題。據我所知,語言可以允許在那裏使用'static',因爲從這個聲明可以知道'memberfun'是'static',所以它沒有任何區別。我懷疑背後的歷史原因,但我不知道。 –

+0

不,'static'也具有受C啓發的可見性角色。另外,它用於定義類成員(不是實例成員) –