文章目录
- 前言
- 一、什么是函数重载
- [二、构成函数重载的 3 种合法条件](#二、构成函数重载的 3 种合法条件)
-
- [1. 参数个数不同](#1. 参数个数不同)
- [2. 参数类型不同](#2. 参数类型不同)
- [3. 参数类型顺序不同](#3. 参数类型顺序不同)
- [三、绝对不能构成重载的 2 种情况](#三、绝对不能构成重载的 2 种情况)
-
- [1. 仅返回值不同,不能构成重载](#1. 仅返回值不同,不能构成重载)
- [2. 仅参数名字不同,不能构成重载](#2. 仅参数名字不同,不能构成重载)
- [四、函数重载 + 缺省参数 = 歧义陷阱(易错点)](#四、函数重载 + 缺省参数 = 歧义陷阱(易错点))
- 总结
前言
在 C 语言中,同一个作用域内不能定义同名函数 ,一旦重复定义就编译报错。
而 C++ 引入了函数重载 特性,允许同一作用域下存在多个同名函数,只要参数列表有差异即可。
一、什么是函数重载
官方定义:
在同一个作用域 中,存在多个函数名相同 ,但参数列表不同 的一组函数,称之为函数重载。
二、构成函数重载的 3 种合法条件
只要满足任意一种,即可构成重载:
- 参数个数不同
- 参数类型不同
- 参数类型的顺序不同
注意:和返回值 、参数变量名无关。
1. 参数个数不同
cpp
#include<iostream>
using namespace std;
// 无参
void f()
{
cout << "f()" << endl;
}
// 1个参
void f(int a)
{
cout << "f(int a)" << endl;
}
int main()
{
f(); // 调用无参版本,即输出:f()
f(10); // 调用有参版本,即输出:f(int a)
return 0;
}
2. 参数类型不同
cpp
#include<iostream>
using namespace std;
int Add(int left, int right)
{
cout << "int 版本" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double 版本" << endl;
return left + right;
}
int main()
{
Add(10, 20); // 匹配int版本
Add(10.5, 20.5); // 匹配double版本
return 0;
}
3. 参数类型顺序不同
参数个数相同、类型相同,仅顺序调换,也可以构成重载:
cpp
#include<iostream>
using namespace std;
void f(int a, char b)
{
cout << "f(int, char)" << endl;
}
void f(char b, int a)
{
cout << "f(char, int)" << endl;
}
int main()
{
f(10, 'a'); // 输出:f(int, char)
f('a', 10); // 输出:f(char, int)
return 0;
}
三、绝对不能构成重载的 2 种情况
1. 仅返回值不同,不能构成重载
cpp
// 错误!仅返回值不同,不构成重载
void fxx()
{}
int fxx()
{
return 1;
}
原因:
函数调用时,编译器只看参数 ,不看返回值;
调用 fxx(); 编译器无法区分该调用哪个版本,直接编译报错。
2. 仅参数名字不同,不能构成重载
cpp
void fun(int a)
{}
void fun(int b) // 不算重载!参数名不参与重载判定
{}
四、函数重载 + 缺省参数 = 歧义陷阱(易错点)
重载和缺省参数混用,极易产生调用歧义,编译报错。
举个例子:
cpp
#include<iostream>
using namespace std;
// 重载版本1:无参
void f1()
{
cout << "f()" << endl;
}
// 重载版本2:带缺省参数
void f1(int a = 10)
{
cout << "f(int a)" << endl;
}
int main()
{
f(); // 编译报错!歧义
return 0;
}
报错原因:
调用 f1() 不传参时:
- 可以调用无参
f1() - 也可以调用带缺省的
f1(int a = 10)
编译器不知道选哪个,产生二义性 ,直接编译失败。
因此:写重载函数时,尽量不要给参数设置缺省值。
总结
看到这的小伙伴可以点个赞吗?你的点赞是我更新的动力!!!ヾ(≧▽≦*)o