假设一下,我们刚刚写了一个判断两个整数是否相等,然而在写完不久就又发现我们需要判断两个浮点数是否相等,对于两个功能相近,但实现不同,且参数类型也不同的函数来说,我们可以直接的声明两个名字一样的函数并使用不同的参数来定义函数,编译器不会认为是函数的重定义。
//函数的重载 //作者:分解机226 #includeusing namespace std; bool boli(int a, int b) { return a == b; } bool boli(float a, float b) { return abs(a - b) < 0.00001;//因为比较浮点数的大小很难直接实现,所以我们需要两个数值的差与极小值比较。 } int main() { int a = 5; int b = 5; float fa = 3.0f; float fb = 3.001f; cout << "两个整数"; if (!boli(a, b)) { cout << "不"; } cout << "相等"< 运行结果
像上面这样的就是函数的重载。
函数重载的定义上面我们展示了参数类型的不同的重载,但是严格的函数重载定义是什么,首先函数的重载发生在相同的作用域中,内层的作用域会屏蔽外层的函数定义。
//函数的重载 //作者:分解机226 #includeusing namespace std; int boli(int a, int b, int c) { return a + b+c; } int main() { {int boli(int a, int b, int c); int a = 5; int b = 5; int c = 5; cout << "a+b" << boli(a, b) << endl; } return 0; } int boli(int a, int b) { return a + b; } 运行结果
上面我们可以看到,内层函数声明屏蔽了外层函数的定义,编译器在搜索到boli时就不会往外找了,所以尽管全局作用域中的参数个数是对的,编译器也无法找到他。现在我们知道只有作用域相同才存在函数的重载,只有返回值不同不能算作是重载函数。所以重载函数是在同一作用域中不同的形参表示的函数
我们来看一个案例
//函数的重载 //作者:分解机226 #includeusing namespace std; int boli(int a, int b) { return 0; }; int boli(int a, int b = 0) { return 0; }; //默认实参不改变形参性质 typedef int num; int daijie(num b) { return 0; }; int daijie(int a) { return 0; }; //typedef不改变类型实质 int dbjl(const int a) { return 0; }; int dbjl(int a) { return 0; } //非引用类型的实参 int main() { return 0; } 上面是一些错误的重载定义,它们其实是函数的重定义。要注意的是,main()函数只能有一个,不能重载。
函数重载解析简介当我们定义好一些重载函数后,在函数调用的时候编译器就会找到一个与实参列表最匹配的重载版本,这个寻找过程就是重载解析过程,来看下面的结构图,
下面我们来看一个例子
//函数的重载 //作者:分解机226 #includeusing namespace std; int boli(int a, int b, int c) { return a + b + c; } int boli(int a, int b) { return a + b; } float boli(float a, float b) { return a + b; } int main() { float a = 3.5f; float b = 3.5f; cout << "a+b=" << boli(a, b) << endl; return 0; } 在上面的案例中都有3个重载函数,并且都是可见的,第一个函数有3个参数,后面两个函数只有2个参数,由于我们在主函数中只有两个参数所以后面的两个函数就是可行函数,由于主函数中的参数是整形,不需要通过隐式转换,所以最后一个函数就是最佳匹配函数。
再来看一个例子加深理解
//函数的重载 //作者:分解机226 #includeusing namespace std; int boli(int a, int b, int c) { return a + b + c; } int boli(int a, int b) { return a + b; } float boli(float a, float b) { return a + b; } int main() { float a = 3.5f; int b = 3.5f; cout << "a+b=" << boli(a, b) << endl;//解决二义性匹配将本段代码换为cout<<"a+b="< 本例只是将主函数中的变量类型设为了两种,所以整形函数和浮点型函数两个版本都要进行一次隐式转换,所以后面两个函数分不出优劣,编译器就会报错。这就是二义性匹配,解决它的方法已在代码中解释。就是强制转换变量类型。



