函数重载的一些问题

5 篇文章 0 订阅

面试问题:

void fun(int, double)
{
    cout << "int,double" << endl;
}

void fun(double, int)
{
    cout << "double,int" << endl;
}

现在调用fun(int , int)会怎么样?

函数重载的匹配过程有三步:
1、确定候选函数,两个原则:1)函数名相同 2)在调用点函数可见。显然对于该题目来说两个函数都是候选函数。
2、确定可行函数,也是有两个原则:1)参数个数匹配 2)形参类型和实参类型相同或者可以转型。对这个题而言,一个函数的形参为(int,double),实参为(int,int)可以转换为形参类型,对于另外一个函数,实参也可转换为形参类型。两个函数都是可行函数。
3、精确匹配,如果有多个候选函数,编译器就需要进行精确匹配的工作,精确匹配。精确匹配就是要找出最佳的那个可行函数,有两个原则:
1)该函数的每一个参数匹配都不比别的函数差;
2)至少有一个实参的匹配优于其他函数的匹配。
对于实参(int,int)而言,没有最佳的匹配函数。因为两个可行函数都不能做到比另一个匹配的更精确,所以编译器会出现二义性调用。

函数重载的其他注意问题:
1、const参数与重载
顶层const 不存在重载,只有底层const才会重载
补充:
int i=0;
int* const p = & i;//p是一个顶层const,即指针本身是一个常量指针,指针本身不能变
const int num=2;
const int* p1 = & num;//p1是一个底层const,指针p1指向一个常量,但是指针p1本身并不是一个常量

void fun(int);
void fun(const int);//重复的声明,非重载

void fun(int*);
void fun(int* const);//形参为顶层const,非重载

void fun(string str);
void fun(const string &);//底层const引用,新函数,正确的重载

void fun(int* p);
void fun(const int *p);//形参为底层const指针,正确的重载,新函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值