函数重载以及二义性
Posted 「已注销」
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数重载以及二义性相关的知识,希望对你有一定的参考价值。
函数重载
重载函数是函数的一种特殊情况, c++中允许在同一范围中声明几个功能类似的同名函数
函数重载的要求:
范例:
ERROR: 错误代码, 参数列表需不同
int fun(int a, int b)
double fun(int a, int b)
True: 正确代码
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
我们来试试下面这段代码:
#include<iostream>
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 等类型也如此
函数重载二义性
问题来了!!
#include<iostream>
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, 那么到底应该强转为什么类型的, 计算机这时就无法进行判断了
!!!错误
以上这种情况就叫做二义性
解决二义性:
- 加入新的重载函数, 使用double类型形参
- 明确调用时实参强转类型: 传参前把数值强转为想要的类型
注: 编译器总是会把基本数据大的转为小的
以上是关于函数重载以及二义性的主要内容,如果未能解决你的问题,请参考以下文章
C++中,爷类跟父类有相同的函数,用子类对象调用时会产生两义性吗?