关于C语言与C++中函数重载问题

本文详细介绍了函数重载的概念及其在C++中的应用,解释了为何C语言不支持函数重载,同时探讨了如何利用缺省参数来增强函数的灵活性。

1.函数重载定义

  函数重载:函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。

2.为什么需要函数重载

如果没有函数重载机制,如在C中,你必须要这样去做:

int ADD1(int a, int b);        //将int变量的值相加
float ADD2(float a, float b);    //将float变量的值相加
int ADD3(int a, char b);      //将int变量和char变量的值相加
float ADD4(float a, long b);      //将float变量和long变量的值相加

而在C++中可以使用函数重载,使函数调用更加简单方便,但必须遵循以下规则:
  •函数名称必须相同。
  •参数列表必须不同(个数不同、类型不同或参数排列顺序不同等)。
  •函数的返回类型可以相同也可以不相同。
  •仅仅返回类型不同不足以成为函数的重载。

3.为什么C语言不支持函数重载而C++支持

原因很简单,代码从编译到运行要经过以下步骤:
1.预处理 (生成.i文件)
  1)头文件展开
  2)宏替换
  3)去注释
  4)条件编译
2.编译过程:检查语法,将高级语言转为汇编语言; (生成.s文件)
3.汇编过程:汇编语言转为二进制程序;(生成.o文件)
4.链接部分:所引用的数据链接进来。(生成a.out文件)
而编译器在编译时会对函数进行重命名,在这里以ADD函数为例:

//C++文件
#include <iostream>

using namespace std;

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

float ADD(float a, float b)
{
    return a + b;
}

int ADD(int a, char b)
{
    return a + b;
}

float ADD(float a, long b)
{
    return a + b; 
}


int main()
{
    int ret1 = ADD(2, 3);
    float ret2 = ADD(2.0f, 3.5f);
    int ret3 = ADD(2, 'a');
    float ret4 = ADD(2.4f, 3l);
    cout << ret1 << endl;
    cout << ret2 << endl;
    cout << ret3 << endl;
    cout << ret4 << endl;
    return 0;
}

输出结果为:
结果

若将文件重命名为.c文件将无法编译。
结果

  原因在于在c语言中,编译器在编译后在库中的名字全为_ADD ,不能进行链接。
  而在c++中,编译器在编译后在库中的名字为_Z3ADDic等,各个函数编译后的名字不同,编译器可以识别各个函数,可执行链接。

4.为什么函数重载不可以根据返回类型区分

如:

float Add(int a, int b);
int Add(int a, int b);

  当你在调用时并不能指定类型信息,编译器不知道你要调用哪个函数。比如调用Add(2,3)时,编译器无法判断到底调用的是那个函数,从这一点可看出函数重载不可以根据返回类型区分。

5.缺省参数

  所谓缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。缺省参数使用主要规则:
1.调用时你只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略它后面所有的参数而不能省略中间参数,即:带缺省值的参数必须放在参数表的最后面。
2.缺省值必须是常量。
3.缺省参数必须通过值参或常参传递。声明是带有缺省参数的函数,则缺省值只能写在声明当中。
4.若没传所缺省的参数,则使用缺省参数,若传参了则使用所传参数。

如:

int Add(int a, int b=2)     //半缺省
{
    return a+b;
}

Add(3)=5
Add(4)=4
Add(2,1)=3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值