动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息



本月文章推荐
.在Visual C++中如何利用UDL文件来.
.在TVGA上实现全屏幕动画.
.QQ本地密码验证破解.
.C++ Builder 设计工具.
.三视图的画法.
.C++设计模式之Factory Method.
.动态链结函式库(DLL-Dynamic Li.
.《TVS2.0应用实录》005:Togethe.
.深度探索C++对象模型(3).
.C语言图形处理.
.C语言初学者入门讲座 第十六讲 文.
.用C++访问SQL Server 2000.
.C++编译器如何实现异常处理.
.C++ 语言基础(2).
.在 Linux 下建立软体套件.
.AT&T/x86/asm语法.
.java:使用路径访问Access数据库.
.C++箴言:绝不重定义继承的非虚拟.
.C++箴言:如何访问模板化基类中的.
.几个游戏代码(机器人大战).

C++对象的放置

发表日期:2008-3-8 |



  (声明:本文参考了《深度探索c++对象模型》这本书,我连例子都和此书一样,
如有人认为是偷的话,还请各位原谅,^_^)
经历过从c到c++的人,一定想知道c++编译器是如何安排类的成员的.这里我
大概的作一下介绍,并有一些代码供你进行测试,希望对大家有点作用吧.
其实这里的标题或许有点大了,简单的说,类的非static成员是按照声明的顺序
存放在内存区的,而类的static成员和一般的static变量的存储格式一样.我不从
简单的东西入手了,直接从一个相对复杂的多重继续的例子入手.看下面的代码:
class Point2d
{
public:
int _x,_y;
virtual f(){}//保证Point2d有个虚拟指针
};
class Point3d:public Point2d
{
public:
int _z;
};
class Vertex
{
public:
virtual void h(){}//保证Vertex3d的第二基础类有个vptr
int next;
};
class Vertex3d:public Point3d,public Vertex
{
public:
int mumble;
};
Point2d,Point3d,Vertex,Vertex3d的继续关系能看得出来吧.再看主函数
int main()
{
Vertex3d v3d;
Vertex*pv;
pv=&v3d;
int*x=&v3d._x;//获取v3d的成员的地址
int*y=&v3d._y;
int*z=&v3d._z;
int*n=&v3d.next;
int*mem=&v3d.mumble;
cout<<"*v3d= "<<&v3d<<endl;//输出第一个vptr
cout<<"*x= "<<x<<endl;//输出成员的x的地址
cout<<"*y= "<<y<<endl;//….
cout<<"*z= "<<z<<endl;//…..
cout<<"*pv= "<<pv<<endl;/.输出第二个vptr
cout<<"*n= "<<n<<endl;//…….
cout<<"*mem= "<<mem<<endl;//……..
return 0;
}
我在vc6.0编译运行的结果是:
&v3d = 0x0012ff64
x = 0x0012ff68
y = 0x0012ff6c
z = 0x0012ff70
pv = 0x0012ff74
n = 0x0012ff78
mem = 0x0012ff7c
从上面的输出结果来看,对象是如何布局的就一幕了然了,假如你不信,可以自己可
以试试看,输出Vertex3d的尺寸瞧一瞧,^_^.注重,Vertex3d内有两个vptr,假如还
不知道为什么会有的话,建议你先去看看书吧!!

补充:我想到另一个比较直观的方法,就是利用Placement Operator New(PON)的
方法,相对应的还有Placement Operator Delete.至于这些概念,我就不多说了,^_^.
刚才看到那些地址都是内存中的,但可以利用(PON)把那些地址放倒一个数组中
去,那样会更直观,不信,你看着:
#include<iostream.h>
#include<new.h>
class Point2d
{
public:
int _x,_y;//
Point2d(){
_x=10;
_y=20;
}
virtual f(){}
};
class Point3d:public Point2d
{
public:
int _z;
Point3d(){_z=30;}
};
class Vertex
{
public:
int next;
Vertex(){next=40;}
virtual void f(){}
virtual void g(){}
virtual void h(){}
};
class Vertex3d:public Point3d,public Vertex
{
public:
int mumble;
Vertex3d(){mumble=50;}
};
int main()
{
long str[30];
Vertex3d*array=new(str)Vertex3d;
for(int i=0;i<sizeof(Vertex3d)/4;i++)
{
cout<<str[i]<<endl;
}
//这里需要显示调用Vertex3d的析构函数,
return 0;

}
让我慢慢说来,这里的一些类,只是添加了构造函数而已,为的是能够直观.我定义
了一个数组为的放置Vertex3d对象,类型为long是由于上面的类的每个成员都是四
个字节,而虚拟指针(vptr)也是四个字节,这样输出很方便.
Vertex3d*array=new(str)Vertex3d;这条语句就是用了PON方法,在数组str中放置
一个Vertex3d对象,一切都已经做好了,对象的布局就是在数组str中,不妨去看看
str中的内容,这里我就不打算把输出结果写出来了,自己调试.有个缺陷就是看不到
virtual函数的函数地址(虽然有其他的方法,但不直观.vc调试模式下直接就可以看,
或许我会想到办法的)
就简单说这么些了,vc编译器的debug模式下可以直接看到的,更直观,但我的
目的只是弄懂c++类究竟是如何放置的(我不认为我是在转牛角尖).

上一篇:创建一个带有CheckBox的TreeView 人气:237
下一篇:让CppWebBrowser响应回车健 人气:228
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-25 WikyBlog v1.7.0.1 多国语言版
2008-7-25 乐彼网上开店系统(56770 Eshop)
2008-7-25 赛特网站管理系统sitecms v3.6.0
2008-7-25 Modoer多功能点评系统 v1.0.1 Bu
2008-7-25 Shangducms Teamsuit! v1.1.0 开
2008-7-25 幻影动漫网视频系统(Ppdong) v1.
2008-7-25 acteecompany企业网站建设系统 v
2008-7-25 恒浪整合管理系统 ims v4.1 ACCE
2008-7-25 艺术图库系统 v1.0 beta
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号