無法用C 中的非靜態函數重載靜態函數
雖然許多程式語言允許基於靜態或實例方法重載函數, C明確禁止這種行為。 C 標準 13.1/2 規定,具有相同名稱和參數類型的成員函數如果其中任何一個是靜態的,則不能重載。
<code class="cpp">class X { static void f(); void f(); };</code>
在上面的範例中,考慮了 f() 的兩個聲明標準格式不正確。
在實例上呼叫靜態函數時存在歧義
即使在這種情況下允許函數重載,在呼叫實例上的靜態函數。 C 標準 9.4/2 允許使用限定 ID(例如 X::f())和類別成員存取語法(例如 g().reschedule())來呼叫靜態成員。因此,在下面的程式碼中,不清楚應該呼叫靜態或非靜態print() 函數:
<code class="cpp">class Foo { void print() { cout << "nonstatic" << endl; } static void print() { cout << "static" << endl; } }; Foo f; f.print(); // Ambiguous: static or non-static?</code>
檢查函數是否被靜態呼叫
與PHP不同,在PHP 中你可以檢查是否定義了this 變數來確定函數是否被靜態調用,而C 不提供此功能。 this 關鍵字始終指向一個對象,並且永遠不會為 NULL,因此您不能使用它來區分靜態呼叫和實例呼叫。
以上是為什麼 C 中靜態函數不能用非靜態函數重載?的詳細內容。更多資訊請關注PHP中文網其他相關文章!