目录
1.函数重载的定义
函数重载:用同一个函数名定义不同的函数,当函数名和不同的参数搭配时函数的含义不同。
2.函数重载规则
- 函数名相同
- 参数个数不同,参数的类型不同,参数顺序不同,均可构成重载
- 返回值类型不同不可构成重载
void func(int a);//ok
void func(char a);//ok
void func(char a,int b);//ok
void func(int a,char b);//ok
char func(int a);//与第一个函数有冲突 (与第一个函数是同定义)
3.调用规则
- 严格匹配,找到则调用
- 通过隐式转换寻求一个匹配,找到则调用
#include<iostream>
using namespace std;
void print(int a)
{
cout<<a<<endl;
}
void print(double a)
{
cout<<a<<endl;
}
void print(char a)
{
cout<<a<<endl;
}
int main(void)
{
print(10);
print(10.00);
print('a');
print(1.11f);
}
4.编译器调用重载函数的准则
- 将所有同名函数作为候选者
- 尝试寻找可行的候选函数
- 精确匹配实参
- 通过默认参数能够匹配实参
- 通过默认类型转换匹配实参
- 匹配失败
- 最终寻找到的可行候选函数不唯一,则出现二义性,编译失败
- 无法匹配所有候选者,函数未定义,编译失败
5.函数重载与函数指针
5.1三种方式定义函数指针
- 定义其函数类型
- 定义一个指向这种函数类型的指针类型
- 直接定义函数指针
#include<iostream>
using namespace std;
int func(int a, int b)
{
cout << "func" << endl;
return 0;
}
//1.定义其函数类型
typedef int(MY_FUNC)(int, int);
//2.定义一个指向这种函数类型的指针类型
typedef int(*MY_FUNC_P)(int, int);
int main(void)
{
//1.
MY_FUNC* fp = NULL;
fp = func;
fp(10, 20);
(*fp)(10, 20);
//2.
MY_FUNC_P ffp = NULL;
ffp = func;
ffp(10, 20);
//3.直接定义函数指针
int(*fp3)(int, int) = NULL;
fp3=func;
fp3(10, 20);
return 0;
}
5.2与函数重载联系
#include<iostream>
using namespace std;
int func(int a, int b)
{
cout << "func(int ,int)" << endl;
return 0;
}
int func(int a, int b, int c)
{
cout << "func(int ,int ,int)" << endl;
return 0;
}
//1.定义其函数类型
typedef int(MY_FUNC)(int, int);
//2.定义一个指向这种函数类型的指针类型
typedef int(*MY_FUNC_P)(int, int);
int main(void)
{
//1.
MY_FUNC* fp = NULL;
fp = func;
fp(10, 20);
(*fp)(10, 20);
//2.
MY_FUNC_P ffp = NULL;
ffp = func;
ffp(10, 20);
//3.
int(*fp3)(int, int) = NULL;
fp3=func;
fp3(10, 20);
cout << "-------------------" << endl;
fp3 = func;
fp3(10, 20);//func(int,int)
//fp3(10, 20, 30);//error
int(*fp4)(int, int, int) = NULL;
fp4 = func;
fp4(10, 20, 30);
return 0;
}
上面的代码中fp3与fp4为函数重载
注:1.实际上再给函数指针赋值的时候,是会发生函数重载匹配的
2.在调用函数指针的时候,所有调用的函数就已经固定了