如果我们在定义一个类的对象时,不使用任何的内部函数,是不能访问私有成员的,那么今天记录两种方式,达到突破界限的访问方式。
-
指针偏移
分析:
因为在定义类的时候,开辟的地址,即类的开始地址应该是变量的首地址,那么在A obj(1, 2, 3);
中int a = *(char*)(&obj);
的&obj
是取类的首地址,然后将地址转化成char*
的类型,即字符指针类型,便于后续计算后续元素的地址,然后*(char*)(&obj)
取指针的指向的值,在此程序中就是m_a
;后续的两个私有成员变量,即在此基础上偏移即可。
注意:
指针加上整型,是按照指针类型大小乘以提供的数值做加法的。int型指针+ n,地址+ 0x 4 * n,char型指针+n,地址+ 0x 1 * n。
所以要指针转换为char*,运算完后再转回int* -
使用define进行暗自修改类型,然而类的底层内存布局没改变,故可行。