在 C 中,靜態成員方法通常使用類別名稱本身而不是類別的實例來呼叫。然而,出現了一個問題:可以在類別實例上呼叫靜態成員方法嗎?
給定的程式碼片段示範了一個有趣的行為:
class Test { public: static void DoCrash(){ std::cout << "TEST IT!" << std::endl; } }; int main() { Test k; k.DoCrash(); // calling a static method like a member method... }
在 Visual Studio 2008 SP1 上,此程式碼成功編譯並輸出「TEST IT!」。與通常的預期相反,靜態方法似乎是在類別的實例上呼叫的。
1.你錯了嗎?代碼正確嗎?
根據 C 標準,在實例上呼叫靜態成員方法並沒有錯誤。標準在9.4(靜態成員)中明確指出:
「可以使用限定ID 表達式X::s 來引用類別X 的靜態成員;不必使用類別成員存取語法(5.2.5) 引用靜態成員。類別成員存取語法是允許的,但在這種情況下會計算物件表達式。2.為什麼允許這樣做?
此標準允許在實例上呼叫靜態成員,以方便在範本中使用「靜態或非靜態」方法。模板通常需要能夠在不知道函數是否靜態的情況下呼叫函數。透過允許在實例上呼叫靜態成員,編譯器始終可以確定要呼叫的正確函數,無論其靜態狀態為何。
以上是您可以在 C 中呼叫類別實例的靜態成員方法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!