3 回答

TA貢獻1844條經驗 獲得超8個贊
2)如果正確,那為什么呢?我找不到為什么會允許使用它,或者可能是為了幫助在模板中使用“靜態或非靜態”方法?
在以下幾種情況下可能很有用:
[建議使用“模板中的“靜態或非靜態”方法“:]當可以為模板指定許多類型,然后該模板想要調用成員時:可以使用相同的符號來調用提供靜態函數的類型。作為成員函數-前者可能更有效(沒有
this
指向通過/綁定的指針),而后者允許多態(virtual
)調度和成員數據的使用減少代碼維護
如果功能從需要實例的數據演變為不需要的數據-因此
static
可以輕松實現無實例使用并防止實例數據的意外使用-無需費力地更新現有客戶端使用的所有方面如果更改了類型,則
var.f()
調用將繼續使用該var
類型的函數,而Type::f()
可能需要手動更正當您有一個表達式或函數調用返回一個值并想調用(可能或始終)
static
函數時,該.
表示法可能會阻止您需要使用decltype
或支持模板來訪問該類型,因此您可以使用該::
表示法有時,變量名會更短,更方便或以更易于記錄的方式命名

TA貢獻2011條經驗 獲得超2個贊
該標準指出,不必通過實例調用該方法,這并不意味著您不能執行該方法。甚至有一個使用它的示例:
C ++ 03,9.4靜態成員
可以使用限定ID表達式X :: s來引用類X的靜態成員;不必使用類成員訪問語法(5.2.5)來引用靜態成員。可以使用類成員訪問語法來引用靜態成員,在這種情況下,將評估對象表達式。
class process {
public:
static void reschedule();
};
process& g();
void f()
{
process::reschedule(); // OK: no object necessary
g().reschedule(); // g() is called
}

TA貢獻1820條經驗 獲得超3個贊
靜態函數不需要實例化的對象即可調用,因此
k.DoCrash();
行為與
Test::DoCrash();
使用范圍解析運算符(::)確定類內部的靜態函數。
注意,在這兩種情況下,編譯器都不會將this指針放在堆棧中,因為靜態函數不需要它。
- 3 回答
- 0 關注
- 583 瀏覽
添加回答
舉報