首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >函数重载以及二义性

函数重载以及二义性

作者头像
木杉乀
发布2021-04-02 02:18:53
发布2021-04-02 02:18:53
6140
举报
文章被收录于专栏:木杉の小屋木杉の小屋

函数重载

重载函数是函数的一种特殊情况, c++中允许在同一范围中声明几个功能类似同名函数

函数重载的要求:

  1. 函数名必须相同
  2. 函数的参数列表不同: ​ i , 参数对应列表个数不同 ​ ii , 相对应位置的类型不同

范例:

ERROR: 错误代码, 参数列表需不同

代码语言:javascript
复制
int fun(int a, int b){}
double fun(int a, int b){}

True: 正确代码

代码语言:javascript
复制
void fun(int a, int b){}                            // 1
void fun(double a, double b){}                      // 2
void fun(double a, double b, char c){}              // 3

当调用函数时, 编译器会分析参数类型进行传参

例如上面这段代码, 如果定义时传入形参的a和b为int类型, 则会传到函数 1 , 如果定义时传入形参a和b为double类型, 则会传到函数 2

我们来试试下面这段代码:

代码语言:javascript
复制
#include
using namespace std;

int add(int a, int b) {
	return a + b;
}

double add(double a, double b) {
	return a + b;
}

double add(double a, double b, int c) {
	return a + b;
}

int main() {
	cout << add(1.2, 3.4, 8.9);
}

这是一个简单的求和重载函数, 当我传入了3个变量, 但第三个变量并不符合函数定义形参类型

此时编译器依然选择了形参为3个的重载函数, 并且同时将错误的参数强转

上图可见: 调试结果, 调用了第三个重载函数, 并且c ( 9.8 ) 值强转为 int类型 ( 8 )

相同方式测试 char 等类型也如此

函数重载二义性

问题来了!!

代码语言:javascript
复制
#include
using namespace std;

int add(float a, float b) {
	return a + b;
}

double add(int a, int b) {
	return a + b;
}

int main() {
	add(1.2, 3.4);
}

我们已经知道, 函数调用时,如果函数的参数类型与传参类型不符, 编译时会自动强转, 但是如果像上面代码的情况,传入的参数1.2 , 3.4 默认都为double类型, double类型既可以强转为int类型,又可以强转为float, 那么到底应该强转为什么类型的, 计算机这时就无法进行判断了

!!!错误

以上这种情况就叫做二义性

解决二义性:

  1. 加入新的重载函数, 使用double类型形参
  2. 明确调用时实参强转类型: 传参前把数值强转为想要的类型

注: 编译器总是会把基本数据大的转为小的

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数重载
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档