类成员指针

关于类成员指针,一般来说有两个作用,一个是判断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++中还有继承,还有多态,还有多重继承,你都需要尝试一下。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值