關於類成員指針,一般來說有兩個作用,一個是判斷vtpr position,二是用來探究編譯器對於class 中access sections的順序。
假如我們定義一個point2d的類:
class point2d {
public:
…
int _x;
int _y;
};
當我們取這個類成員地址時返回的是什麼呢?
&point2d::_y;
上述操作將會返回一個class object的offset。
一般來講offset的大小是相當於_z的大小。因爲c++標準規定一個access level 中的number 順序應該和我們聲明順序相同。
但是當出現了vptr這時,一切都被打亂了,因爲vptr的順序是沒有限制的。
這時我們說說類成員指針定義,定義如下:
intclassname::*one;
那我們該如何調用它呢?
int point2d::*one =&point2d::_x;
Point2d a;
printf("thenostatic class numbers point is :%d\n",a.*one);
好那接下來我們就看看,我們如何探究vtpr與class中access sections的順序:
測試環境在vs2015,其實2015有一點操蛋,它會把一個特性處理好來呈現給我們,因爲類成員指針是接受一個nostaticnumbers的 offset ,所以爲了區分指向空的指針和偏移量爲0的類成員指針,編譯器都會將偏移量加1,但是vs給這個優化掉了,直接給我們呈現的就是正確的偏移量。
類的定義:
這裏使用的類,我們在前面已經定義過了。這個類我也是仿照深度探究c++模型上寫的。然後我們看輸出結果,編譯器會有警告:“printf”: 格式字符串“%d”需要類型“int”的參數,但可變參數 1 擁有了類型“int point2d::* ”
輸出結果:
這裏one的大小是4,說明class的佈局中vptr放在類最前面,因爲一個point的大小爲4.
好了。這就是關於類成員指針的初步探究。你不要以爲這就完了,如果你真的想探究c++對象模型,那麼你需要多多利用類成員指針。因爲c++中還有繼承,還有多態,還有多重繼承,你都需要嘗試一下。