手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

深入剖析C 重载函数的应用

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
 重载函数(overloaded function)是C 支持的一种特别函数,C 编译器对函数重载的判断更是C 语言中最复杂的内容之一

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

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

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

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

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

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

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

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( );显然对于程式员来说是不易理解的。因此对于函数重载的使用我们应遵循应用的逻辑,而不是简单地因为他的存在就必须使用他。程式员不应该勉强使用重载函数。

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

  假如有下面一组函数:

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),最后选出最好可行函数。

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




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS