原文链接
重载函数
在实际应用中会遇到这样的问题,同一项功能,由于有不同类型的需求,需要分别编制不同的函数。例如求一个数的绝对值,由于类型不同的需要,有下述不同名字的函数
Int abs(int );
Long labs(long);
Double fabs(double);
这些函数的功能是相同的,但是名称不同,需要调用的时候就很麻烦,如果都使用相同的函数名是不是就很方便了呢。
C++中引进了重载函数,使得同一个函数名可以对应着不同的函数实现。所谓函数的重载就是建立多个同名的函数,但是函数的形参表必须互不相同。所以还可以表示为:
Int abs(int );
Long abs(long);
Double abs(double);
这样调用起来是不是就方便了很多呢?
两个函数成为重载函数,必须具有如下特征:
函数名相同,作用域相同,参数表中的参数个数或者参数类型或者参数顺序不同。但如果仅仅是返回值不同,不能成为重载函数。
那么又一个问题来了?这么多函数函数名都相同,那我应该怎么调用呢?
我们在调用一个重载函数时,编译的选择原则如下:
将实参类型与所有重载函数的形参一一进行比较,先是查找到一个严格匹配的,如果找到了就调用这个函数,再是通过内部数据转换查找一个匹配的,如果找到了就调用那个函数,最后是通过用户所定义的强制数据转换来查找一个匹配的
我们来举个例子,这样你就可以一目了然了
Void abs(int);
Void abs(double);
则对于下列调用函数abs的匹配情况如下:
abs(1); //匹配Void abs(int);
Abs(1.5); //匹配Void abs(double);
Abs(“m”); //匹配Void abs(int);
Abs((double)5); //匹配 Void abs(double);
使用重载函数有很多显而易见的好处,当需要实现同一个功能时,方便函数名的记忆,而且更主要是完善了同一个函数的代码功能,给调用带来了许多方便。
#include <iostream>
using namespace std;
class printData
{
public:
void print(int i) {
cout << "整数为: " << i << endl;
}
void print(double f) {
cout << "浮点数为: " << f << endl;
}
void print(char c[]) {
cout << "字符串为: " << c << endl;
}
};
int main(void)
{
printData pd;
// 输出整数
pd.print(5);
// 输出浮点数
pd.print(500.263);
// 输出字符串
char c[] = "Hello C++";
pd.print(c);
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
整数为: 5
浮点数为: 500.263
字符串为: Hello C++