c++中重载函数的准则问题研究

以下面的例子来进行研究:

#include <iostream>
#include <cstdio>
using namespace std;

double add(double x,double y)
{
	return x+y;
}


int add(int x,int y)
{
	return x+y;
}

int main()
{
	int a=1,b=2;
	double c=1.00,d=2.00;
	
	cout<<add(a,b)<<endl;
	add(c,d);
	//构成重载的条件:1.参数个数不同 2.参数类型不同 3.参数顺序不同
	//返回值不同不能构成重载
	return 0;
}

重载函数准则如下:

1.将所有同名函数作为候选者

即例子中2个add函数都可能被main函数中的add所调用。
 2.尝试寻找可行的候选函数:
          1 )精确匹配实参

            例子中的第一个add调用中的实参a,b都为int型,与第一个add函数匹配,所以调用第一个add函数;第二个add调用中的实参c,d都为double型,与第二个add函数匹配,所以调用第二个函数

            运行结果如下:

           
          2) 通过默认参数能够匹配实参

       将int型add函数添加一个默认参数

int add(int x,int y,int z=1)
{
	return x+y+z;
}

运行结果如下:

4为传进来的实参a=1,b=2与默认参数z=1的和。
          3) 通过默认类型转换匹配实参

将main函数改为如下:

int main()
{
	char a='q',b='w';
	double c=3.00,d=4.00;
	
	cout<<add(a,b)<<endl;
	add(c,d);
	cout<<add(c,d)<<endl;

	return 0;
}

将int型的a,b改为char型。

运行结果如下:

运行结果中的232即为q,w的ascll码之和,说明通过默认类型转换匹配实参。

此时,又有一个新的问题:char型的add调用时转换成了哪个类型?int 还是doouble?

于是我进行如下测试:

测试1:

将double型的add函数修改如下:

double add(double x,double y)
{
	return y-x;
}

运行结果如下:

说明char型的add优先调用int型add函数

测试2:

将int型的add函数注释掉

运行结果如下:

6为w与q的ascll码之差,说明此时char型的add调用了double型的add函数。
3.匹配失败:
          1) 最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。

添加一个带有一个默认参数的int型函数,其他和上一个int型函数一样

int add(int x,int y)
{
	return x+y;
}

int add(int x,int y,int z=0)
{
	return x+y+z;
}

运行结果如下:

说明有歧义的函数重载不可行,应该避免。
          2) 无法匹配所有候选者,函数未定义,编译失败。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值