Grisson's .net

源码之前,了无秘密

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
如果两个函数名字相同,并且在相同的域中被声明,但函数的参数表不同(参数的个数不同,或参数的类型不同),则他们就是重载函数。
 
注意:
  • 参数表的比较过程与参数名无关
  • 函数的返回类型不足以区分两个重载函数
  • 如果两个函数的参数表的区别只在于一个是用了typedef定义的类型,另一个是用了于typedef相应的类型,则该参数表不被视为不同。
  • 参数表的比较过程中不考虑const和volatile修饰

一个声明为局部的函数将隐藏而不是重载一个全局域中声明的函数

e.g.

#include <string>

void print(const string & );

void print(double);

 

void fooBar(int ival)

{

  extern void print (int);

  //print("value:");  是错误的,print(const string & )在这个域中被隐藏

  print(ival);

}

using对重载的影响
  用户不能在using声明中为一个函数指定的参数列表
  using声明只是一个声明。由using声明引入的函数就好像在该声明出现的地方被声明一样
  using声明向一个域中引入一个函数,而该函数已经有同名函数且具有相同的参数表,则该声明就是错误的。
  具有相同的名字,但是来自不同名字空间的成员函数都将加载到同一个重载函数集。
e.g.
namespace libs_R_us
{
  extern int max(int,int);
  extern int max(double,double);
 
  extern void print(int);
  extern void print(double);
}
 
namespave IBM
{
  extern void print(float);
}
 
extern void print(const string & ); 
 
using IBM
using libs_R_us::print;    //正确
//using lins_R_us::max(int,int)  是错误的
 
void fooBar(int ival)
{
  print( "Value:");
  print(ival);
  print(1.0f);  //是用的是IBM::print
}
重载函数解析的三个步骤:
  1.确定函数调用考虑的重载函数的集合,确定函数调用中实参表的属性(既实参的个数和类型)
 
2.从重载函数集合中选择函数,该函数可以在(给出实参个数和类型)的情况下用调用中指定的实参进行调用。
根据调用中指定的实参从候选函数中选择一个或多个函数,这些函数成为可行函数。他们的参数个数于调用的参数个数相同或多一点,但是每个多处来的参数都有缺省值,调用中实参和该函数中的实参之间类型作好精确匹配,至少要可以进行转换。
  3.选择于调用最匹配的函数
选择于调用最匹配的函数,称为最佳可行函数(最佳匹配函数),为实现这种匹配,从实参类型到相应的可行函数参数类型的转换被划分等级。


文章来源:http://spaces.msn.com/members/Grisson/Blog/cns!1pdzVqmOhs8O_w1Y7GbtnyFQ!205.entry
posted on 2005-08-12 10:53  海盗  阅读(497)  评论(0编辑  收藏  举报