指向類成員函數(shù)的指針其實(shí)并非指針
1、與常規(guī)指針不同,一個(gè)指向成員的指針并不指向一個(gè)具體的內(nèi)存位置,它指向的是一個(gè)類的特定成員,而不是指向特定對(duì)象里的特定成員。通常最清晰的做法,是將指向數(shù)據(jù)成員的指針看作為一個(gè)偏移量。
這個(gè)偏移量告訴你,一個(gè)特定成員的位置距離對(duì)象的起點(diǎn)有多少個(gè)字節(jié)。
2、給定一個(gè)成員在類內(nèi)的偏移量,為了訪問(wèn)位于那個(gè)偏移量的數(shù)據(jù)成員,我們需要該類的一個(gè)對(duì)象的地址。這時(shí)候就需要 .*和->*的操作。pC->*pimC,請(qǐng)求將pC內(nèi)的地址加上pimC內(nèi)的偏移量,為的是訪問(wèn)pC所指向的C對(duì)象中適當(dāng)?shù)臄?shù)據(jù)成員。aC.*pimC,請(qǐng)求aC的地址加上pimC中的偏離量,也是為了訪問(wèn)pC所指向的C對(duì)象中適當(dāng)?shù)臄?shù)據(jù)成員。
Ps:
*成員指針解引用操作符(.*)從對(duì)象或引用獲取成員
*成員指針箭頭操作符(->*)通過(guò)對(duì)象的指針獲取成員
3、獲取非靜態(tài)成員函數(shù)的地址時(shí),得到的不是一個(gè)地址,而是一個(gè)指向成員函數(shù)的指針。
4、為了對(duì)一個(gè)指向成員函數(shù)的指針進(jìn)行解引用,需要一個(gè)對(duì)象或一個(gè)指向?qū)ο蟮闹羔?。?duì)于指向數(shù)據(jù)成員的指針的情形,為了訪問(wèn)該成員,需要將對(duì)象的地址和成員的偏移量相加。對(duì)于指向成員函數(shù)的指針的情形,需要將對(duì)象的地址用作this指針的值,進(jìn)行函數(shù)調(diào)用,以及作為其他用途。
5、一個(gè)指向成員函數(shù)的指針的實(shí)現(xiàn)自身必須存儲(chǔ)一些信息,諸如它所指向的成員函數(shù)是虛擬的還是非虛擬的,到哪里支找到的適當(dāng)?shù)奶摵瘮?shù)表指針等等。
6、另外補(bǔ)充一點(diǎn)關(guān)于指向內(nèi)聯(lián)函數(shù)的指針的問(wèn)題。一個(gè)函數(shù)指針指向內(nèi)聯(lián)函數(shù)是合法的。然而,通過(guò)函數(shù)指針調(diào)用內(nèi)聯(lián)函數(shù)將不會(huì)導(dǎo)致內(nèi)聯(lián)式的函數(shù)調(diào)用,因?yàn)榫幾g器無(wú)法在編譯期精確地確定將會(huì)調(diào)用什么函數(shù)。因此在調(diào)用點(diǎn),編譯器別無(wú)他法,只好生成間接、非內(nèi)聯(lián)的函數(shù)調(diào)用代碼。

