程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 指向類成員函數的指針其實並非指針

指向類成員函數的指針其實並非指針

編輯:C語言基礎知識

1、與常規指針不同,一個指向成員的指針並不指向一個具體的內存位置,它指向的是一個類的特定成員,而不是指向特定對象裡的特定成員。通常最清晰的做法,是將指向數據成員的指針看作為一個偏移量。

這個偏移量告訴你,一個特定成員的位置距離對象的起點有多少個字節。

2、給定一個成員在類內的偏移量,為了訪問位於那個偏移量的數據成員,我們需要該類的一個對象的地址。這時候就需要 .*和->*的操作。pC->*pimC,請求將pC內的地址加上pimC內的偏移量,為的是訪問pC所指向的C對象中適當的數據成員。aC.*pimC,請求aC的地址加上pimC中的偏離量,也是為了訪問pC所指向的C對象中適當的數據成員。
Ps:
*成員指針解引用操作符(.*)從對象或引用獲取成員
*成員指針箭頭操作符(->*)通過對象的指針獲取成員

3、獲取非靜態成員函數的地址時,得到的不是一個地址,而是一個指向成員函數的指針。

4、為了對一個指向成員函數的指針進行解引用,需要一個對象或一個指向對象的指針。對於指向數據成員的指針的情形,為了訪問該成員,需要將對象的地址和成員的偏移量相加。對於指向成員函數的指針的情形,需要將對象的地址用作this指針的值,進行函數調用,以及作為其他用途。

5、一個指向成員函數的指針的實現自身必須存儲一些信息,諸如它所指向的成員函數是虛擬的還是非虛擬的,到哪裡支找到的適當的虛函數表指針等等。

6、另外補充一點關於指向內聯函數的指針的問題。一個函數指針指向內聯函數是合法的。然而,通過函數指針調用內聯函數將不會導致內聯式的函數調用,因為編譯器無法在編譯期精確地確定將會調用什麼函數。因此在調用點,編譯器別無他法,只好生成間接、非內聯的函數調用代碼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved