爲什麼static關鍵字是必需的?'靜態'的C++類成員函數?
爲什麼編譯器不能推斷它是否是'靜態'?
如下:
我可以編譯這個功能沒有訪問非靜態成員數據?是 - >靜態功能。 否 - >非靜態函數。
是否有任何理由這是不是推斷?
爲什麼static關鍵字是必需的?'靜態'的C++類成員函數?
爲什麼編譯器不能推斷它是否是'靜態'?
如下:
我可以編譯這個功能沒有訪問非靜態成員數據?是 - >靜態功能。 否 - >非靜態函數。
是否有任何理由這是不是推斷?
如果您希望編譯器現場確定它是否是靜態的,那麼如何影響外部源文件與僅定義方法簽名的頭文件鏈接呢?
是的,編譯器可以,但它不知道你的意圖。原來的設計師可能認爲提供你的意圖很重要。
在語言中如此冗餘有助於確保很多編程錯誤最終會被編譯器捕獲。
另一個原因:如果該函數是靜態的,則它不能在派生類中重寫。沒有多態性。
這是虛擬的,而不是靜態的。例如,靜態和非靜態的基本成員都可以被派生類隱藏,比如std :: fstream :: rdbuf。 – 2010-02-25 02:51:55
@Roger:他在問爲什麼不訪問任何成員變量的方法不只是被編譯器自動聲明爲'static'。我在說虛擬方法可能會或可能不會訪問成員變量,但您不希望編譯器自動將它們聲明爲靜態。 – 2010-02-25 03:57:44
一個虛擬方法,僅僅憑藉虛擬,總是隱含着對成員變量的訪問。即,vtable。由於我們只是在討論隱式靜態而不是隱式虛擬,因此任何標記爲虛擬的方法永遠都不適合自動分類爲靜態。 – 2010-02-25 07:17:52
作爲靜態或非靜態的行爲會影響函數類型。例如,非靜態成員函數有一個隱含的this
參數,而靜態成員函數不包含。
換句話說,靜態和非靜態成員函數之間存在主要的質的區別。編譯器不能「推斷」這一點。這是作者意圖的問題。
如果我想(需要)我的函數是非靜態的,我使它非靜態,即使它不訪問類的任何非靜態成員。如果編譯器突然決定讓我的非靜態函數成爲靜態的,因爲它不訪問類的任何非靜態成員,通常情況下它會破壞代碼的功能。
+1點接通答案..... – 2010-02-25 02:05:36