【CPP】通过指针编译访问类成员
前置知识:内存对齐
首先定义一个简单的结构体
struct mCls
{
int a;
int b;
double c;
};
当我们使用指针获取到了该类型的一个实例
mCls* mClsP = new mCls;
我们该如何通过该指针访问mCls类的数据成员呢?
根据我们既有知识可知,int4字节,double8字节,通过简单的猜想和测试可发现
mClsP->a = 666;
mClsP->b = 123;
mClsP->c = 108.321;
cout << *((int*)(mClsP)+0) << endl;
cout << *((int*)(mClsP)+1) << endl;
cout << *((int*)(mClsP)+2) << endl;
cout << *((double*)(mClsP)+1) << endl;
1.指针绑定的实例的地址即是类首位数据成员的地址
2.通过指针的类型转换,我们的合理猜想与尝试得到了符合预期的反馈(即如何通过偏移量和指针访问类成员)
那么如果类本身再变得复杂一些呢?
struct mClsC
{
char a;
char notAC;
int b;
double c;
};
int main()
{
mClsC* mClsP = new mClsC;
mClsP->a = 12;
mClsP->notAC = 49;
mClsP->b = 5678;
mClsP->c = 108.321;
cout << (int)*((char*)(mClsP)+0) << endl;
cout << (int)*((char*)(mClsP)+1) << endl;
cout << *((int*)(mClsP)+1) << endl;
cout << *((double*)(mClsP)+1) << endl;
return 0;
}
运行结果是
恰好与内存对齐的知识相照应了。
当然,还有更多更复杂的情形或者细节我没有考虑到,或许日后会进一步完善。
参考内容:C++编程——利用指针偏移访问类的私有成员
原文地址:https://www.cnblogs.com/jian-lh/p/17465038.html