在類x的非常量成員函數中,this指針的類型為 x *const .也就是說他是指向非常量x的常量指針。
但是在類x的常量成員函數中,this的類型為const x* const . 這就是常量成員函數和非常量成員函數的差別。
類的非靜态資料成員可以被聲明為mutable,這将容許她們的值可以被這個類的常量成員函數(也包括非常量成員函數)修改。
如果一個類聲明了一個或者多個虛函數,那麼編譯器會為這個類的每一個對象插入一個指向虛函數表的指針。
如果使用了虛拟繼承,對象将會通過嵌入的指針,偏移量或者其他非嵌入的資訊來維持對其虛基類自對象位置的跟蹤。是以,即使類沒有聲明虛函數,其中還是有坑被插入了一個虛函數表的指針。
對于一個類x來說,複制構造函數應該被聲明為 x (const x &); 而複制指派操作符應該被聲明為x& operator=(const x&) 。
将一個函數的位址初始化或指派給一個指向函數的指針的時候,無需顯式的取得函數位址,編譯器知道隐式的擷取函數的位址,是以在這種情況下,&操作符是可選的。比如:
void (*fp)(int );
extern void h(int);
fp=h; //ok
fp= &h; //ok
類似的,可以采用如下的方式調用函數:
fp(12); 或者 (*fp)(12);
注意,和void * 指針可以指向任何類型的資料不同,不存在可以指向任何類型函數的通用指針。
還要注意,非靜态成員函數的位址不是一個指針,是以不可以将一個函數指針指向一個非靜态成員函數。
函數指針的一個傳統用途是實作回調。
一個函數指針指向内聯函數是合法的。但是如果通過函數指針調用内聯函數将不會導緻内聯函數的調用,因為編譯器通常無法在編譯階段确定将會調用什麼函數。