一级棒(Eachfun)
一级棒 - 读书笔记 - C++ Primer - 重载函数的调用匹配
RSS订阅
重载函数的调用匹配
发表时间:2006-09-08 21:50:56 关键词:C++,MFC,VC,Primer,编程,教程,读书

  函数调用时从来没有在匹配上冒出过大问题,直到重载概念的到来。因为重载函数允许一批函数共用一个函数名。
  以往调用函数是依赖函数名的,直接找到对应的函数名,检查一下参数个数和类型是否符合即可。现在就只好凭函数名和参数一起来确定该调用哪个函数了。
  若是凭参数能唯一确定函数那自然好,可是参数还存在类型转换与区配的问题。这就增加了函数匹配的难度,有时甚至明明有多个函数供选择却找不到能匹配的。
  书上为重载确定整理了以下几个步骤:“候选函数”、“选择可行函数”、“寻找最佳匹配”。其实这里面真正难以对付的是“寻找最佳匹配”。下面分述之:
  第一步“候选函数”是凭函数名进行筛选。简单说就是找出所有的同名函数。当然,如果仅仅按是否同名来判断将面临问题,因为函数有不同的作用域。严格说来就是下面这句话:
  引用:候选函数是与被调用函数同名的函数,并且在调用点上,它的声明可见。
  第二步“选择可行函数”是按参数的个数进行筛选。参数的个数是明确的条件,这就减少了产生分歧的可能性。当然,分歧还是会有的,那就是有些函数允许缺省参数。比如:
void f(int i);//函数一
void f(int i, int j=0);//函数二
f(1, 2);//调用一
f(1);//调用二
  以上两个重载函数究竟会不会产生调用分歧,仅凭函数还不能判。如果只有调用一,则它们是没有冲突的,但是如果有调用二,则在调用二的点上会产生“二义性”。
  第三步是难点,怎样寻找最佳匹配?如果能找到某个重载,它的参数个数和参数类型完全与调用一致,则它就是“最佳”。但是事实上有两种情况会导致不确定性:一是字面值常量没有明确的类型,二是变量的类型可以转换。
  先说字面值常量,比如“f('a');”的参数就是一个字面值常量。它究竟是char型还是unsigned char型?再比如“f(1);”的参数,它究竟是int、unsigned int、long还是unsigned long?
  对于变量来说,它有明确的类型,但是如果在可行函数中不存在完全相同的类型,就要面临转换的问题,转换是多种多样的,一个int既可以转为unsigned int也可以转为long,甚至还可以转化为float或double。那么,多种转换之间就要寻找一个“最佳”。
  简单地说,除了类型“精确匹配”以外,类型的“提升”是优于“降级”的。那么,能否找到类型的提升就是关键了。对于含有多个参数的函数,有时就更难迁就每一个参数了。比如:
void f(int, int);//函数一
void f(double, double);//函数二
f(42, 2.56);//调用一
  上面的例子中,对于调用一,两个函数没有哪一个比另一个优。
  引用:区配成功的条件为有且仅有一个函数满足下列条件:(1)每个实参的匹配都不劣于其它可行函数需要的匹配。(2)至少有一个实参的匹配优于其它可行函数提供的匹配。
  说到底,重载函数之所以在调用的时候有这么大的麻烦,原因还在于多个函数共用一个函数名。有一点还需要拿出来弹调一下:虽然它们函数名相同,但它们是不同的函数。

本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
发表评论
称呼:
QQ:
邮箱:
链接:
内容:
搜索: 百度搜索 Google搜索
Copyright©2000 - 2008 Eachfun.Com, All Rights Reserved 一级棒网络
苏ICP备05080156号
一级棒建站系统 http://www.eachfun.com 一级棒版权所有,未经许可不得商用!