類成員函式型別宣告和變數定義
型別宣告: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...