对 《对象参数与私有变量》有感,大侠看了不要笑话啊~
//偶是新手,看了帖子之后就回去自己试了试//也就有了自己的一点认识,所以拿出来分享一下
#include <iostream>
#include <cstdio>
using namespace std;
class A
{
char a; //偏移量 0
short b; //偏移量 2(1+1)
int c; //偏移量 4(2+2)
double d; //偏移量 8(4+4)
public:
void show(){ cout<<"a="<<a<<" "<<"b="<<b<<" "<<"c="<<c<<" "<<"d="<<d<<endl;}
};
int main()
{
A t;
/*
类(结构体)的大小等于最后一个数据成员的偏移大小加上数据类型大小
假如我们要修改一个类成员的数值,我们可以用其偏移地址来访问(类的首地址加要访问的数据成员的偏移量)
而偏移量又有四条条规格(网上查的):
1: 偏移量必须是数据类型的整数倍(0为任何数据类型的整数倍);
2: 类(结构体)的大小必须是类(结构体)最大数据类型的整数倍;
3: 第一个数据类型的偏移量等于类(结构体)的首地址;
4: 若类(结构体)有嵌套,则嵌套中的类(结构体)偏移量必须是嵌套类(结构体)中最大数据类型的整数倍;
讲完了这些也该下菜了*/
char *p1=0; //为了方便,嘿嘿
short *p2=0;
int *p3=0;
double *p4=0;
p1=(char *)&t+0; //a 的偏移地址 等于类(结构体)的首地址所以加上0
p2=(short *)&t+1; //b 的偏移地址 (short 类型为2个字节 指针移一下就2个字节,所以只要加1就行了 )
p3=(int *)&t+1; // c的偏移地址 (int 为四字节(VC6) 指针移一下就4个字节,所以只要加1就行了)
p4=(double *)&t+1; // d的偏移地址 (double 为八字节 指针移一下就8个字节,所以只要加1就行了)
//赋值***************************************************************************
printf("%p\n%p\n%p\n%p\n",p1,p2,p3,p4);
*p1='a';
*p2=23;
*p3=45;
*p4=56.7;
//输出
cout<<"a="<<*p1<<" "<<"b="<<*p2<<" "<<"c="<<*p3<<" "<<"d="<<*p4<<endl;//直接调用用的是偏移地址
//*************************************************************************************
t.show ();//用共有的函数调用
return 0;
}
/* 总结:
找出数据成员的偏移量 求出偏移地址 强制转换到该数据类型的指针
赋值,访问
*/