标题:对 《对象参数与私有变量》有感,大侠看了不要笑话啊~
只看楼主
yyblackyy
Rank: 6Rank: 6
等 级:侠之大者
帖 子:98
专家分:457
注 册:2010-3-31
结帖率:100%
 问题点数:0 回复次数:0 
对 《对象参数与私有变量》有感,大侠看了不要笑话啊~
//偶是新手,看了帖子之后就回去自己试了试
//也就有了自己的一点认识,所以拿出来分享一下
#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;
}
/* 总结:
    找出数据成员的偏移量 求出偏移地址 强制转换到该数据类型的指针
    赋值,访问
*/
搜索更多相关主题的帖子: 笑话 对象 参数 变量 
2010-04-01 09:42



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-301247-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.256074 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved