1、 什么是重载函数
如果同一作用域内的几个函数名字相同但形参列表不同,那么这些函数就称之为——重载函数。
例如:
void print( const char *cp);
void print(const int *begin , const int *end);
void print(const int ia[], int size);
上面的这些构造函数执行的操作非常的相似,都是打印一些数据,但是接受的形参却不一样。 当调用这些函数时,编译器会根据传递的实参类型推断想要执行的是哪个函数。
例如:
int j[2] = {0,1};
print(“hello world”); //调用print( const char *cp);
print(begin(j),end(j)); //调用print(const int *begin , const int *end);
print(j, end(j) - begin(j)); //调用print(const int ia[], int size);
2、重载函数的作用:
函数的名字仅仅是让编译器知道它调用的是哪个函数,而函数重载可以在一定程度上减轻程序员起名字、记名字的负担。
3、 定义重载函数的注意点
①不允许两个函数除了返回类型外其他所有的元素都相同。即如果两个函数返回值不同,形参列表相同,那么第二个函数的申明时是错误的。
②有些形参列表看起来不一样,但是实际上是相同的,比如:
bool lookup(const Account &acct);
bool lookup(const Account & ); //省略了形参,但是实际上是一样的
bool lookup(Phone);
bool lookup(const Phone); //重复申明
③如果形参是某种类型的指针或引用,则上诉情况会不同,例如:
bool lookup(Account &); //作用于Account的引用
bool lookup(const Account &);//作用于常量引用
bool lookup(Account *); //作用于指向Account的指针
bool lookup(const Account &);//作用指向常量的指针
在上面的四个函数中,编译器通过实参是否是常量来推断应该调用哪个函数。因为const不能转换成其他类型,所以只能把const对象(或者指向const的指针)传递给const形参。相反的,因为非常量可以转换成const,所以上面的4个函数都可以作用非常量对象或者指向非常量对象的指针。不过,当我们传递非常量对象时,编译器会优先选用非常量版本的函数。
4、 调用重载函数
重载函数存在的意义在于减轻程序员记函数名称和个给函数取名的负担,因此在调用重载函数时,要明确的区别调用的重载函数形参列表的不同。要么形参列表的数量不同,要么类型差异较大。
在调用重载函数时,编译器会根据传入的实参的类型或者数量的不同来确定调用的是哪个重载函数。
一般的调用重载函数会有三种可能:
①编译器找到一个与实参最佳匹配的函数,并调用该函数的代码。
②找不到任何一个函数与调用的实参匹配,此时编译器发出“无匹配”错误。
③有多个函数可以匹配,但是每一个都不是明显的最佳选择。此时编译器发出“二义性调用”错误。
原文地址:http://blog.csdn.net/autocyz/article/details/44828267