本页主题: C++语言辅导:C++中的静态联编和动态联编介绍 二级考试 打印 | 加为IE收藏 | 复制链接 | 收藏主题 | 上一主题 | 下一主题

jlshare
级别: 交流共享版主


精华: 3
发帖: 1152
威望: 35 点
财富币: 19 金币
贡献值: 0 点
在线时间:44(小时)
注册时间:2008-01-25
最后登录:2008-08-27

 C++语言辅导:C++中的静态联编和动态联编介绍 二级考试

联编是指一个计算机程序自身彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。   静态联编
  静态联编是指联编工作出现在编译连接阶段,这种联编又称早期联编,因为这种联编过程是在程序开始运行之前完成的。
  在编译时所进行的这种联编又称静态束定。在编译时就解决了程序中的操作调用与执行该操作代码间的关系,确定这种关系又称为束定,在编译时束定又称静态束定。下面举一个静态联编的例子。
#include
class Point
{
public:
Point(double i, double j) { x=i; y=j; }
double Area() const { return 0.0; }
private:
double x, y;
};
class Rectangle:public Point
{
public:
Rectangle(double i, double j, double k, double l);
double Area() const { return w*h; }
private:
double w, h;
};
Rectangle::Rectangle(double i, double j, double k, double l)oint(i, j)
{
w=k; h=l;
}
void fun(Point &s)
{
cout< }
void main()
{
Rectangle rec(3.0, 5.2, 15.0, 25.0);
fun(rec);
}
该程序的运行结果为:
0
  输出结果表明在fun()函数中,s所引用的对象执行的Area()操作被关联到Point::Area()的实现代码上。这是因为静态联编的结果。在程序编译阶段,对s所引用的对象所执行的Area()操作只能束定到Point类的函数上。因此,导致程序输出了所不期望的结果。因为我们期望的是s引用的对象所执行的Area()操作应该束定到Rectangl类的Area()函数上。这是静态联编所达不到的。
  动态联编
  从对静态联编的上述分析中可以知道,编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序执行时才能确定将要调用的函数,为此要确切知道该调用的函数,要求联编工作要在程序运行时进行,这种在程序运行时进行联编工作被称为动态联编,或称动态束定,又叫晚期联编。
  动态联编实际上是进行动态识别。在上例中,前面分析过了静态联编时,fun()函数中s所引用的对象被束定到Point类上。而在运行时进行动态联编将把s的对象引用束定到Rectangle类上。可见,同一个对象引用s,在不同阶段被束定的类对象将是不同的。那么如何来确定是静态联编还是动态联编呢?C++规定动态联编是在虚函数的支持下实现的。
  从上述分析可以看出静态联编和动态联编也都是属于多态性的,它们是不同阶段对不同实现进行不同的选择。?F例中As迪稚鲜嵌詅un()函数参数的多态性的选择。该函数的参数是一8隼嗟Ct对象引用,静态联编和动态联编和动态联编实际上是在选择它的静态类型和动态类型。联编是对这个引用的多态性的选择。
搜索更多相关文章:计算机 考试 程序 等级
交流空间---资源共享论坛
  做最综合的专业论坛!
顶端 Posted: 2008-02-01 21:32 | [楼 主]
帖子浏览记录 版块浏览记录
交流共享论坛 » 等级考试交流

【交流共享论坛免责声明】
本论坛属技术交流,非赢利性论坛。拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,严禁发布色情反动言论及有关违反国家法律法规内容!会员发表言论仅代表个人观点,不代表论坛立场,本站所有文章,发表者拥有版权,发表者拥有展示权,未经本站明确许可,任何网站不得非法盗链、转载及抄袭本站资源;转载请注明出处!本站部分内容及所有资料来自网络,版权归原作者所有,如涉及侵权请联系我们删除,资料仅供学习和科研之用! 站长联系邮箱:jlshare@126.com


Time now is:08-29 04:04, Gzip enabled 浙ICP备06052510号
Powered by PHPWind v6.0 Certificate Code © 2003-08 PHPWind.com Corporation