1、與常規指針不同,一個指向成員的指針並不指向一個具體的內存位置,它指向的是一個類的特定成員,而不是指向特定對象裡的特定成員。通常最清晰的做法,是將指向數據成員的指針看作為一個偏移量。
這個偏移量告訴你,一個特定成員的位置距離對象的起點有多少個字節。
2、給定一個成員在類內的偏移量,為了訪問位於那個偏移量的數據成員,我們需要該類的一個對象的地址。這時候就需要 .*和->*的操作。pC->*pimC,請求將pC內的地址加上pimC內的偏移量,為的是訪問pC所指向的C對象中適當的數據成員。aC.*pimC,請求aC的地址加上pimC中的偏離量,也是為了訪問pC所指向的C對象中適當的數據成員。
Ps:
*成員指針解引用操作符(.*)從對象或引用獲取成員
*成員指針箭頭操作符(->*)通過對象的指針獲取成員
3、獲取非靜態成員函數的地址時,得到的不是一個地址,而是一個指向成員函數的指針。
4、為了對一個指向成員函數的指針進行解引用,需要一個對象或一個指向對象的指針。對於指向數據成員的指針的情形,為了訪問該成員,需要將對象的地址和成員的偏移量相加。對於指向成員函數的指針的情形,需要將對象的地址用作this指針的值,進行函數調用,以及作為其他用途。
5、一個指向成員函數的指針的實現自身必須存儲一些信息,諸如它所指向的成員函數是虛擬的還是非虛擬的,到哪裡支找到的適當的虛函數表指針等等。
6、另外補充一點關於指向內聯函數的指針的問題。一個函數指針指向內聯函數是合法的。然而,通過函數指針調用內聯函數將不會導致內聯式的函數調用,因為編譯器無法在編譯期精確地確定將會調用什麼函數。因此在調用點,編譯器別無他法,只好生成間接、非內聯的函數調用代碼。