C++中的函数重载

4.C++中的函数重载

本文参考自狄泰软件学院:《C++深度剖析》课程

在C语言中我们无法定义两个同名的函数。而当我们想用不同的方式实现相同功能的时候,只能重新定义一个函数名,这样的话就很不方便了。
那么,C++将怎么解决这个问题呢?

函数重载

重载(Overload)是效仿自然语言中的上下文得到的功能
在中文中,动词可以与许多词汇进行搭配来表达不同的意思。例如”洗”字:洗衣服、洗脑、洗脸等等。都表达不同的意思。

重载的定义:同一个标识符在不同的上下文中有不同的意义
1. 在C++中,我们可以用同一个函数名来定义不同的函数。
2. 当函数名和不同参数搭配时函数的含义不同(函数名就是动词,参数就是名词)

函数重载至少要满足下面一个条件
1. 函数参数个数不同
2. 函数参数类型不同
3. 函数参数顺序不同
注意:函数返回值不能作为函数重载的依据,函数重载时由函数名和参数列表决定的

函数重载必然发生在同一个作用域中
全局作用域和类作用域间,类作用域之间无法进行函数重载。

函数参数在本质上是相互独立的不同函数
实际上编译后函数名并不相同。

问题:编译器是如何分辨同名函数的?如何进行精确调用。

1. 当编译时需要调用同名函数时,将所有的同名函数作为候选者。

2. 尝试寻找可行的候选函数
精确匹配实参,通过默认参数能够匹配实参,通过默认类型转换匹配实参。

3. 匹配成功则执行,匹配失败则报错。

示例代码:函数重载示例

int func(int x)
{
    return x;
}

int func(float x)
{
    return x;
}

int func(const char*s, int b)
{
    return b;
}

int func(int b, const char* s)
{
    return strlen(s);
}

函数重载与函数指针

当存在一个函数指针指向一个重载的函数时,函数指针应该保存哪个函数的地址呢?

示例代码

#include <stdio.h>
#include <string.h>

int func(int x)
{
    return x;
}

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

int func(const char* s)
{
    return strlen(s);
}

typedef int(*PFUNC)(int a);

int main(int argc, char *argv[])
{
    int c = 0;
    PFUNC p = func;
    c = p(1);   
    printf("c = %d\n", c);
    return 0;
}

从上面的代码我们可以知道:将重载函数名赋值给函数指针时
1. 根据重载规则挑选与函数指针参数列表一致的候选者
2. 严格匹配候选者的函数类型与函数指针的函数类型

注:函数重载的规则中并没有要求返回类型需要一致,但是函数指针则要求返回类型必须一致。

函数重载与函数默认参数

当函数默认参数遇上函数重载时会发生什么呢?

示例代码:

int func(int a, int b, int c = 0)
{
    return a * b * c;
}

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

int main(int argc, char *argv[])
{
    int c = func(1, 2); //which one?

    return 0;
}

通过编译我们会发生,编译出现错误了:error: call of overloaded ‘func(int, int)’ is ambiguous
编译器不知道应该调用哪个(二义性)。这是C++的特性冲突。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值