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、 调用重载函数
重载函数存在的意义在于减轻程序猿记函数名称和个给函数取名的负担,因此在调用重载函数时,要明白的差别调用的重载函数形參列表的不同。要么形參列表的数量不同。要么类型差异较大。
在调用重载函数时。编译器会依据传入的实參的类型或者数量的不同来确定调用的是哪个重载函数。
一般的调用重载函数会有三种可能:
①编译器找到一个与实參最佳匹配的函数,并调用该函数的代码。
②找不到不论什么一个函数与调用的实參匹配,此时编译器发出“无匹配”错误。
③有多个函数能够匹配。可是每个都不是明显的最佳选择。此时编译器发出“二义性调用”错误。