dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>C/C++>C/C++技术资料>文章内容
重载函数的应用与深入剖析
来源:CSDN     作者:    
重载函数(overloaded function)是C++支持的一种特殊函数,C++编译器对重载的判断更是语言中最复杂的内容之一

 首先我们先明确一下重载函数的定义:在相同的声明域中的函数名相同的,而参数表不同的,即通过函数的参数表而唯一标识并且来区分函数的一种特殊的。

 您也许要问,函数为什么要重载呢?何时应该选择重载(function overloading),何时又不呢?这也是我要在下面介绍的。

  当将要定义一组函数,使它们执行一系列的操作,但是它们是应用在不同的参数类型上的。此时我们可以选择重载。

  例如:int z_x_max (int,int); //返回两个整数的最大值;

 int ve_max  (const vector <int> &); //返回vector容器中的最大值;

 int matrix_max (const matrix &);  //返回matrix引用的最大值;

  上面的三个函数都可以大概地说成判断一组数中的最大值,对于函数的用户来说,他们并不关心函数定义的细节,也就是说他们不关心判断两个整数的大小和判断数组(vector容器)数的大小应该使用不同的函数,而对于程序的设计者来说这可是不得不想到的。程序员必须记住并查找每个函数名。而的重载把程序员从这种问题的复杂性中解放了出来,提供了这种支持。上面的三个比较大小的可以定义成:

      int Max (int,int); //返回两个整数的最大值;

 int Max  (const vector <int> &); //返回vector容器中的最大值;

 int Max (const matrix &);  //返回matrix引用的最大值;

  对!通过参数就可以一眼分辨不同的。

  同时函数的重载也有它不适用的情况。例如:在开发文本编辑器的过程中,会涉及到一系列控制光标的,如下:

 Screen& MoveUp( );

 Screen& MoveDown( );

Screen& MoveLeft( );

 Screen& MoveRight( );

  看过这四个函数不言而喻,它们是控制光标在屏幕上的位置的,即:向上移动光标,向下移动光标,向左移动光标,向右移动光标。如果我现在把它们写成重载函数,每个都是Screen& Move( );显然对于程序员来说是不易理解的。因此对于函数重载的使用我们应遵循应用的逻辑,而不是简单地因为它的存在就必须使用它。程序员不应该勉强使用重载。

  您有没有想过编译器是如何判断您调用的是重载中的哪个函数?即使它们的函数名相同。您也许会毫不犹豫的回答:是通过的参数表。其实识别的过程并不是像您想象中的那么的容易,其中涉及到参数的等级划分,参数转换等诸多方面,下面我就一一进行讲解。

  假如有下面一组:

 void S ( );

 void S ( int );

 void S ( double , double = 1.2 );

 void S ( const char*,const char*);

 void Max ( int , int );

 //……

 int main( )

 {

  S (2.4);

 return;

}

  //S (2.4 );的调用与S ( ); S ( int ); S ( double , double = 1.2); S (const char* , const char*),的声明在同一域,即是可见的。

  那么好,问题出现了。S (2.4 );将调用上面四个中的哪一个呢?

  编译器判断重载函数的第一步是确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数(candidant function)。所谓候选函数就是与被调用函数同名的函数。上面的前四个函数都可以成为候选(当然可以是多个),而唯有Max ( int , int ) 被排除在外了。

 编译器判断重载函数的第二步分为两动作。第一个动作是编译器从第一步选出的候选函数中调出可行函数(viable function)。可行函数的函数参数个数与调用的函数参数个数相同(如S ( int )),或者可行函数的参数可以多一些,但是多出来的函数参数都要有相关的缺省值(如 S (double , double =1.2 );)第二个动作是根据参数类型的转换规则将被调用的函数实参转换(conversion)成候选函数的实参。这里本着充分利用参数类型转换的原则,换句话说,尽可能的使用上参数类型转换。当然转换要以候选函数为转换的目标。上面的函数中只有两个是可行,它们分别是S ( int ); S ( double , double )。

 如果依照参数转换规则没有找到可行函数,则该调用就是错误的,则说没有与调用匹配,属于无匹配情况(no match function)。

 编译器判断重载函数的第三步是从第二步中选出的可行函数中选出最佳可行函数(best match situation)。在最佳可行函数的选择中,从函数实参类型到相应可行函数参数所用的转化都要划分等级,根据等级的划分(ranked),最后选出最佳可行。

 最佳可行函数即编译器要调用的。

 

 

上一篇:Gzip Zlib PNG 压缩算法,源码详解   下一篇:一个对Winsock完成端口模型封装的类
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·C语言数组排序小结
·Python 与 C++ 程序的简单实例对
·c++ 数组与指针
·C++中的内存管理(new、delete、
·如何用C语言开发DSP嵌入式系统
·如何用C语言开发DSP嵌入式系统
·Linux下C语言编程
·学习arm的话先看哪本书?
·C++初学者应该关心的优秀图书一
·利用C语言小程序来解决大问题
·用C语言写PHP扩展的步骤
·用C语言扩展PHP功能
  相关文章
·Gzip Zlib PNG 压缩算法,源码详
·一个对Winsock完成端口模型封装
·窗口类的诞生(注册自己的窗口类)
·VC++学习:用SDK实现分隔条
·窗口类的诞生(注册自己的窗口类)
·在VC中透明浮动按键的实现
·让你的控制台程序也支持自动补齐
·在视图中同步显示鼠标的位置
·显示内存中的HTML内容
·无闪烁刷屏技术的实现
·ado方式访问带密码数据库的方法
·利用VC编程在界面上实现3D文字
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763