注册 登录
编程论坛 C++教室

对 《对象参数与私有变量》有感,大侠看了不要笑话啊~

yyblackyy 发布于 2010-04-01 09:42, 470 次点击
//偶是新手,看了帖子之后就回去自己试了试
//也就有了自己的一点认识,所以拿出来分享一下
#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;
}
/* 总结:
    找出数据成员的偏移量 求出偏移地址 强制转换到该数据类型的指针
    赋值,访问
*/
0 回复
1