函数重载以及二义性

Posted 「已注销」

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数重载以及二义性相关的知识,希望对你有一定的参考价值。

函数重载

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

函数重载的要求:

  1. 函数名必须相同

  2. 函数的参数列表不同:

    ​ i , 参数对应列表个数不同

    ​ ii , 相对应位置的类型不同

范例:

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, 那么到底应该强转为什么类型的, 计算机这时就无法进行判断了


!!!错误

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

解决二义性:

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

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

以上是关于函数重载以及二义性的主要内容,如果未能解决你的问题,请参考以下文章

C++引用,内联函数,函数重载二义性总结_C++

c++重载

函数重载,操作符重载(王桂林视频笔记)

C++中,爷类跟父类有相同的函数,用子类对象调用时会产生两义性吗?

c++中两个函数函数名相同,参数类型和参数个数也相同,但是函数类型不同,那它们是重载函数吗?

在JAVA中能给方法参数赋默认值吗