1.问题引入:
在我们实际开发中,有时候我们需要实现几个功能类似的函数,这几个函数只是有一些比较小的区别。比如我们想要交换两个变量的值,这两个变量有多种类型,int float char bool 等等,把这些参数的地址 传递到函数的内部,在C语言中,我们需要设计出三个不同名的函数,函数原型基本类似,这样写的话比较繁琐,而且效率不高,示例如下
#include <stdio.h>
int swap1(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int swap2(char *a,char *b)
{
char temp = *a;
*a = *b;
*b = temp;
}
int swap3(float *a,float *b)
{
float temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a = 10,b=20;
swap1(&a,&b);
char ca = '1',cb = '2';
swap2(&ca,&cb);
float fa = 10.5,fb = 20.5;
swap3(&fa,&fb);
}
而在C++中,引入了一种解决方法,就是函数重载
函数重载概念
用相同的函数名定义多个不同的功能 称之为函数重载。重载的函数可以根据参数的个数和类型进行区分,但是不能仅仅根据返回值类型来区分。
#include<iostream>
using namespace std;
int swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int swap(int &a,int &b)
{
int temp = a;
a = b;
b = temp;
}
int swap(char *a,char *b)
{
char temp = *a;
*a = *b;
*b = temp;
}
int swap(float *a,float *b)
{
float temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int ia=10,ib=20;
char ca='a',cb='b';
float fa=10.5,fb=20.5;
//在函数调用的时候会根据不同的参数列表选择调用对应的函数
swap(ia,ib);
swap(&ia,&ib);
swap(&ca,&cb);
swap(&fa,&fb);
cout<<"ia:"<<ia<<" ib:"<<ib<<endl;
return 0;
}
函数重载的规则
函数名字必须相同
参数列表必须不同(个数不同、类型不同、参数排列顺序不同)
函数的返回值类型可以相同也可以不相同,但是如果仅仅是 返回值类型不同 不足以 让这些函数重载
在C++中 编译器会检查函数名字和参数列表,在C语言中编译器只会检查函数名字
函数重载的作用
解决函数名字资源问题
函数调用的时候很方便,自动根据不同的参数调用的不同的函数(静态多态)