它有意義嗎?類方法可以是內聯方式還是靜態方式?
回答
static
意味着該方法不與類的實例相關聯。 (即它沒有「this」指針)。
inline
是一個編譯提示,該方法的代碼應該被包含在內聯的地方,而不是通過普通分支調用。 (請注意,許多編譯器會忽略此關鍵字,並使用他們自己的指標來決定是否內聯)。
這些是正交(無關)的概念,所以沒有特別的原因,他們不能合併。
我不明白爲什麼不。靜態類成員就像一個獨立的函數,可以私人訪問其他成員函數。
是的,沒有理由不能組合。
您可以。
然而,GCC手冊說,該功能不會被編譯器集成到代碼,如果:
- 調用方法,你定義它之前,或
- 有內任何遞歸調用定義。
來源:GCC Manual - 討論C和C++。
我嘗試使用稱爲Class1的小樣本類在Visual C++中對這兩種場景進行編碼。這裏是相關的片段,其中incTest是在我的Class1.h文件中定義的。
// test static inline method - based on the GCC manual's C example
static inline int inc (int *a)
{
return (*a)++;
}
// test recursive call in a static inline method
static inline int fac (int x)
{
return x * fac(x-1);
}
int Class1::incTest(int* x)
{
return inc(x);
}
這是成功編譯的版本。但是,如果我使用的是Visual C++,並且將inc()的定義移動到incTest()的定義之後,則該文件無法成功編譯,因此在調用inc()時發生錯誤,表示「標識符不是發現」。
編輯:修改我的答案,以考慮我在Visual C++中的測試的評論和結果。
這些條件都不會阻止您聲明方法內聯。 – 2010-01-25 16:51:12
這是錯誤的。這兩個限制都不是C++的一部分。它們可能會限制函數在生成的代碼中實際內聯的能力,但您仍然可以將它們標記爲內聯。如果需要在頭文件中定義它們,例如,如果它們是模板化的,這非常有用。 – KeithB 2010-01-25 16:55:11
- 1. free_function可以是靜態類方法嗎?
- 2. DAO模式 - 使用靜態還是非靜態方法?
- 3. 我應該去靜態方法還是非靜態方法?
- 4. 靜態方法還是非靜態方法?
- 5. 靜態方法getDBConnection()從類型DBConnection的應以靜態方式
- 6. MVC的動作方法可以是靜態的還是擴展的方法?
- 7. 以靜態方式
- 8. 靜態內聯方法?
- 9. 靜態嵌套類中的方法是隱式靜態的嗎?
- 10. 虛擬方法是指動態還是靜態類型?
- 11. 我可以在Objective-C中內聯靜態類方法嗎?
- 12. 靜態方法是DI反模式嗎?
- 13. 靜態var,方法還是單例?
- 14. Java靜態 - 方法還是字段?
- 15. 在java中的靜態方法,我可以以非靜態方式訪問靜態方法嗎?
- 16. 是否可以「內聯」一個「方法」?
- 17. 警告:靜態方法應該以靜態方式訪問
- 18. 工廠類應該是單例還是靜態方法?
- 19. 是否可以在靜態方法中獲取類類型?
- 20. 從非靜態/共享方法調用靜態/共享方法,好還是壞?
- 21. PHP - 是否可以聲明靜態和非靜態方法
- 22. 靜態類的模板方法模式
- 23. Java的android優化。非靜態還是靜態方法?
- 24. 我應該使用靜態方法還是靜態字段
- 25. 模型類(在MVC中)應該使用靜態方法還是實例方法?
- 26. java中的靜態方法可以調用非靜態方法
- 27. 是否可以使用最終的靜態類方法?
- 28. 使用類名調用靜態方法 - 好還是壞?
- 29. 我應該創建靜態方法還是抽象超類
- 30. 是靜態方法嗎?
內聯的更重要的含義是該方法的多個定義是允許的(並且假定是相同的)。這允許函數定義在多個地方包含的頭文件中。 仍然沒有理由他們不能合併。事實上,對於模板中的靜態方法,它們幾乎必須是。 – KeithB 2010-01-25 16:49:03