c 類成員函式位址。

2021-08-18 11:54:02 字數 794 閱讀 2815

類成員函式型別宣告和變數定義

型別宣告:typedef void (myclass::*pfuntype)(); 或using pfuntype2 = void (myclass::*)();

變數定義:void (myclass::*p1)();

例子:

class myclass

};int main()

類成員函式使用

類成員函式使用需要3個特殊運算子: ::*  .* 和 ->*

在型別宣告時需要使用 ::* 比如: void (myclass::*p1)();

使用時需要.* 和 ->* 比如:myclass a; (a.*p1)();

類成員函式的大小

指標大小32為下是4個位元組,64位下是8個位元組。然而類成員函式的大小呢?

gcc編譯器5.4版本,類成員函式位址是void *大小的兩倍。

vs 編譯器在單繼承或不繼承的情況下函式位址大小和void*一樣,多繼承類成員函式位址是void *大小的兩倍。

#include class itype 

};class itype2

};class myclass : itype, itype2

};int main()

//vs 下輸出4,8。g++ 下輸出4,8
所以那些把類成員函式位址儲存為void*兄弟都悲劇了。

作者翻譯了一篇英文:

c 類成員函式

c 的兩大特色是多型和模板。其中多型是通過繼承和虛函式來實現的,其中虛函式是通過每個物件裡面的虛表來實現的。如果這個物件的類有虛函式,那麼這個類就有一張虛表,存的是每個虛函式的入口位址,而這個類的每個物件,都會有乙個4位元組的指標,指向這張虛表,這個就是虛指標。上面一段話很多人都知道,但是如果問普通...

c 類成員函式

類成員函式是類的乙個成員,它可以操作類的任意物件,可以訪問物件中的所有成員。定義類box,使用成員函式來訪問類的成員,而不是直接訪問這些類的成員 class box class box double box getvolume void 在這裡,需要強調一點,在 運算子之前必須使用類名。呼叫成員函式...

c 類成員函式

靜態型別 表示式在編譯時型別是已知的,它是變數宣告時和表示式生成的型別 動態型別 表達是表示式在記憶體中的型別 如果表示式不是指標或引用,則它的靜態型別和動態型別永遠一樣。person的靜態型別是person,它的動態型別可能是student,teacher.string job person.jo...