我在介紹C++的oop,我有一個問題。 當我在頭文件中聲明一個靜態函數時,爲什麼如果我在代碼文件中也放入了靜態函數,我會得到一個錯誤?我的意思是,爲什麼靜態應該只在頭文件?錯誤,因爲「靜態」在C代碼
的menssage錯誤:
mod.cc:71:40:錯誤:不能聲明成員函數 '靜態INT MOD :: mida_maxima()' 爲有靜態鏈接[-fpermissive]
我在介紹C++的oop,我有一個問題。 當我在頭文件中聲明一個靜態函數時,爲什麼如果我在代碼文件中也放入了靜態函數,我會得到一個錯誤?我的意思是,爲什麼靜態應該只在頭文件?錯誤,因爲「靜態」在C代碼
的menssage錯誤:
mod.cc:71:40:錯誤:不能聲明成員函數 '靜態INT MOD :: mida_maxima()' 爲有靜態鏈接[-fpermissive]
甲static
class
裏面的成員函數是一個類函數;它在沒有任何接收器的情況下工作,所以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啓發)。
完美!非常感謝! – KooPad
我認爲這個答案並沒有真正解決爲什麼在函數的定義中禁止static的問題。據我所知,語言可以允許在那裏使用'static',因爲從這個聲明可以知道'memberfun'是'static',所以它沒有任何區別。我懷疑背後的歷史原因,但我不知道。 –
不,'static'也具有受C啓發的可見性角色。另外,它用於定義類成員(不是實例成員) –
請張貼你想要做的一個例子。 –
標題:靜態布爾函數(); 代碼:靜態布爾函數(){//代碼//} 如果我在代碼文件中聲明該函數爲靜態,則會出現錯誤,我的問題是原因。 – KooPad
請發表[mcve]。是的,請包括MCVE的完整錯誤信息。 –