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