為什麼C 中 void 能指向靜態成員函式但不能指非靜態向成員函式?

時間 2021-05-14 09:32:57

1樓:檀十一郎

讓我們來強行搞編譯器一波:

class A fp;

A a;

A* pa = &a;

(pa->*fp._fpa)();

(fp._fp_void)(); //因為A::test沒用到this,所以這麼搞也能工作。

return 0;

2樓:朱涵俊

靜態成員函式跟靜態函式沒區別,就是乙個作用域不同而已。可以看成普通的非成員函式。

成員函式在傳引數時候,實際上有個隱藏的this引數,跟靜態函式不一樣。靜態函式可以用函式指標呼叫,成員函式不行。

3樓:嘟嘟雞

C++ 並不保證所有的指標一樣大,很多情況下,指向非靜態成員的指標需要額外的空間來儲存資訊(虛函式、繼承都會帶來額外的偏移)

Pointers to member functions are very strange animals

Why the size of a pointer to a function is different from the size of a pointer to a member function?

4樓:Grfxlf

說下淺顯易懂的吧,眾所周知類成員函式呼叫實際會隱式傳參:this。你乙個void過去就把型別啥的丟了,就找不到真正的this了。

5樓:Cyandev

如果拋開 virtual 不談,類的靜態函式和非靜態函式編譯後位址是確定的,所以一定能通過 void * 來表示,只不過編譯器不允許顯式將乙個非靜態類成員函式轉換成 void *(當然用 struct 曲線救國還是可以做到的),但是函式簽名中別忘了加上乙個 this 指標作為第乙個引數。

C 為什麼Random類不做靜態?

程子昂 這保證每個Random例項都是乙個固定的偽隨機數生成器 PRNG 也就是說兩個Random例項如果用同乙個隨機數種子的話生成的隨機數序列是一樣的 預設的種子是系統時間 這個性質在某些地方會很有用,譬如密碼學裡的對稱流加密就可以用PRNG實現 總這個角度講Random其實也不太安全,RNGCy...

為什麼Java內部類要設計成靜態和非靜態兩種?

王二 除了邏輯和可讀性上的需求之外。也實現了單例模式下對資源的優化。比如 Math 裡的 RandomNumberGeneratorHolder 就是靜態內部類。 BWH.Steven 我們所知道static是不能用來修飾類的,但是成員內部類可以看做外部類中的乙個成員,所以可以用static修飾,這...

為什麼 C 中,基類指標可以指向派生類物件?

WangKX 語法就這麼規定這叫多型性,如果往深點說,因為子類物件一般比父類物件大,因此這麼指並沒問題,但反過來不行比如子類指標指向父類物件 馬東啥梅來著 不同型別的指標在記憶體中所佔大小是相同的,區別在於編譯器對於指標的解釋是不同的。乙個指標指向某個類的物件,實際上是指向該物件所佔記憶體的首位址位...