類成員指針

關於類成員指針,一般來說有兩個作用,一個是判斷vtpr position,二是用來探究編譯器對於class access sections的順序。

 

假如我們定義一個point2d的類:


class point2d {


public:
	…
	int _x;
	int _y;

};

當我們取這個類成員地址時返回的是什麼呢?

&point2d::_y;

上述操作將會返回一個class objectoffset

一般來講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);

 

好那接下來我們就看看,我們如何探究vtprclassaccess sections的順序:

測試環境在vs2015,其實2015有一點操蛋,它會把一個特性處理好來呈現給我們,因爲類成員指針是接受一個nostaticnumbers offset ,所以爲了區分指向空的指針和偏移量爲0的類成員指針,編譯器都會將偏移量加1,但是vs給這個優化掉了,直接給我們呈現的就是正確的偏移量。


類的定義:




 

這裏使用的類,我們在前面已經定義過了。這個類我也是仿照深度探究c++模型上寫的。然後我們看輸出結果,編譯器會有警告:“printf”: 格式字符串“%d”需要類型“int”的參數,但可變參數 1 擁有了類型“int point2d::* ”

 

輸出結果:




這裏one的大小是4,說明class的佈局中vptr放在類最前面,因爲一個point的大小爲4.

 

 

好了。這就是關於類成員指針的初步探究。你不要以爲這就完了,如果你真的想探究c++對象模型,那麼你需要多多利用類成員指針。因爲c++中還有繼承,還有多態,還有多重繼承,你都需要嘗試一下。


發佈了39 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章