1. 什么是函数重载
现在我们定义了一个交换值的函数,如下:
#include <iostream>
using namespace std;
void swap(int *A, int *B){
int temp = *A;
*A = *B;
*B = temp;
}
int main(){
int a = 10, b = 20;
swap(&a,&b);
cout<<a<<" "<<b<<endl;
}
这个函数的形参类型是int型,那么我们想交换其他类型变量的时候,我们就需要重新定义一个void swap2(float *A, float *B),void swap3(char *A, char *B)等等,需要定义多个函数,但是这些函数的功能却又是相近的,于是伟大的程序员想到了将这些函数的名字统一,而且保持其功能不变,这就是函数重载。
函数重载会出现多个同名函数,他们的区别在于函数形参的设置,比如:
#include <iostream>
using namespace std;
void swap(int *A, int *B){
int temp = *A;
*A = *B;
*B = temp;
}
void swap(float *A, float *B){
float temp = *A;
*A = *B;
*B = temp;
}
void swap(char *A, char *B , int len){
char temp;
for (int i = 0; i < len; i++){
temp = A[i];
A[i] = B[i];
B[i] = temp;
}
}
int main(){
int a1 = 10, b1 = 20;
swap(&a1,&b1);
cout<<a1<<" "<<b1<<endl;
float a2 = 10.1, b2 = 20.1;
swap(&a2,&b2);
cout<<a2<<" "<<b2<<endl;
char a3[] = "asd", b3[] = "zxc";
swap(a3,b3,3);
cout<<a3<<" "<<b3<<endl;
}
于是,仅用一个函数就可以实现多种类型数据的交换,函数调用的时候,编译器根据输入参数的不同,判断要选择哪一个函数。
依我之见,函数重载只是为了使命名变得方便,因为这个三个函数,对编译器而言,依然是三个完全不同的函数,在进行编译之后,函数名会分别标记为_swap_int_int_,_swap_float _float _,_swap_char_char_(只是举个例子)。因此重载函数只是为了程序员自己方便,对编译器来说没有区别。
2. 函数重载的注意事项
① 函数名必须相同;
②输入形参必须有区别(类型、数量、顺序);
③输出类型不作为函数重载的依据;
④函数重载要尽可能包含要用到的类型,否则可能产生二义性;换句话讲,就是尽量不要输入没有重载的形参类型;
⑤函数重载只是方便我们的程序开发,对计算机来说依然是多个不同的函数。