参数缺省和函数重载讲解

简介: 参数缺省和函数重载讲解

1.参数缺省的概念

       一般情况下,函数调用时的实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有缺省参数的函数,这种函数调用时,实参个数可以与形参不相同。

      缺省参数指在定义函数时为形参指定缺省值(默认值)。

      这样的函数在调用时,对于缺省参数,可以给出实参值,也可以不给出参数值。如果给出实参,将实参传递给形参进行调用,如果不给出实参,则按缺省值进行调用。

      缺省参数的函数调用:缺省实参并不一定是常量表达式,可以是任意表达式,甚至可以通过函数调用给出。如果缺省实参是任意表达式,则函数每次被调用时该表达式被重新求值。但表达式必须有意义。


2.参数缺省的用法

以下图为例:


3.缺省参数分类

3.1.全缺省参数

全缺省就是所有参数都给了缺省值


3.2.半缺省参数

半缺省并不是缺省一半的参数,而是缺省部分参数

半缺省规定:必须从右往左缺省 ,如下面的实例:

 缺省一个参数的调用方式:


缺省二个参数的调用方式:


4.函数重载的概念

函数重在是指在同一个作用域内,有多个函数名相同,但是形参列表不同(参数类型不同,参数个数不同,参数顺序不同),返回值无关,我们将这种叫做重载函数。重载的函数是通过形参列表区分的,和其他无关。一句话来说“一个接口,多种实现”。


例如:如果要实现一个加法运算,加法函数可以是整型也可以是浮点型,就可以使用函数重载实现


5.函数重载的用法

如果要实现一个加法运算,加法函数可以是整型也可以是浮点型,就可以使用函数重载实现。

例如:

int Add(int a, int b)
{
  return a + b;
}
float Add(int a,float b)
{
  return a + b;
}
float Add(float a, int b)
{
  return a + b;
}
float Add(float a, float b)
{
  return a + b;
}


5.1参数类型不同

int add(int left, int right)
{
  cout << "int add(int left, int right)" << endl;
  return left + right;
}
double add(double left, double right)
{
  cout << "double add(double left, double right)" << endl;
  return left + right;
}

5.2参数个数不同

void f()
{
  cout << "f()" << endl;
}
void f(int a)
{
  cout << "f(int a)" << endl;
}

5.3参数顺序不同

void f(int a, char b)
{
  cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
  cout << "f(char b, int a)" << endl;
}


注意:返回值不同,不能构成重载 ,因为调用的时候不能区分


6.函数重载的原理

(前言:这部分我了解的也还不是非常深入,因此写的不是那么详细,也撮合着看吧~~)


大家有没有想过,为什么C语言不支持函数重载,而C++支持函数重载?C++又是如何支持的呢?


演示函数重载的原理用VS编译器不方便演示,需要用到Linux操作系统


在Linux系统下创建一个C语言的工程:


func.h 里面放的时函数的声明,func.c 里面放的时函数的定义,test.c 里面包含主函数

我们对这个工程进行编译:

此时会出现错误提示:

只有注释掉一个f()函数,才能编译成功,下图是注释无参f()函数后的执行结果:

这里就验证了C语言不能支持函数重载。

下面用C++ 对上述代码进行编译运行:

这里验证的是C++支持重载。

下一步,我们要探究的是为什么C语言不支持函数重载,而C++支持函数重载 ?C++是如何支持的?重点来了哈(敲黑板!!)

让我们来回顾一下编译链接的过程:

其中C语言不支持函数重载和C++支持函数重载就是链接这里的原因。

我们观察一下函数调用在汇编代码中是怎样实现的:

C语言不支持函数重载,因为编译的时候,两个重载函数函数名相同,在Func.o符号表中存在歧义和冲突,其次链接的时候也存在歧义和冲突,因为他们都是直接使用函数名去标识和查找,而重载函数,函数名相同


C++支持函数重载,因为C++的目标文件符号表中不是直接用函数名来标识和查找函数,C++引用了一个函数名修饰规则但不同的编译器下修饰规则有所不同, 有了函数名修饰规则,只要参数不同,func.o的符号标里面就不存在二义性和冲突了。链接的时候,test:o的main的函数里面去调用两个重载函数查找地址是也是明确的。


文章到这里就结束啦~~

目录
相关文章
|
存储 机器学习/深度学习 大数据
量子计算与大数据:处理海量信息的新方法
量子计算作为革命性的计算范式,凭借量子比特和量子门的独特优势,展现出在大数据处理中的巨大潜力。本文探讨了量子计算的基本原理、在大数据处理中的应用及面临的挑战与前景,展望了其在金融、医疗和物流等领域的广泛应用。
|
4月前
|
定位技术 Android开发 数据安全/隐私保护
抖音虚拟位置软件, 修改定位位置app,抖音虚拟位置修改
这些代码展示了如何模拟GPS位置变化和Android设备上的虚拟定位功能。第一个模块模拟了城市间的移动轨迹
|
人工智能 弹性计算 运维
通勤路上修故障?钉钉机器人+OOS AI助手实现7×24小时运维自由
通过钉钉机器人配置阿里云OOS AI助手,您可以直接在钉钉群内发送文字指令,实现免登录、跨设备、秒级响应的阿里云运维操作。
|
9月前
|
监控 安全 前端开发
我店模式如何快速引流拓客?三方裂变+流量共享+动态分红
该商业模式通过三方裂变、流量共享和动态分红实现高效引流与锁客。商家设置3%-20%让利比例,消费转化为积分+消费券,用户获高额返利,商家低成本锁客。流量共享池整合自营商城、异业联盟和区域商圈资源,提升进店率。动态分红机制每期递增收益,最多40期,用户收益翻倍,商家获被动收入。5级分销机制和区域代理模式进一步扩大裂变效应,确保企业长期稳定增长。30万商家验证,单店3个月客流提升50%以上,区域代理年收益超百万。
|
机器学习/深度学习 人工智能 算法
人工智能浪潮下的编程新范式
【9月更文挑战第27天】在AI技术飞速发展的今天,编程领域也迎来了新的变革。本文将深入探讨AI如何改变编程范式,以及这种变革对程序员和整个软件开发行业的影响。通过分析AI技术的特点和优势,我们将揭示它如何为编程带来更高效、智能的解决方案,并展望这一趋势对未来软件开发的深远影响。
267 2
|
机器学习/深度学习 人工智能 算法
DeepMind机器人打乒乓球,正手、反手溜到飞起,全胜人类初学者
【8月更文挑战第30天】DeepMind团队近日在机器人乒乓球领域取得了重大突破,其研发的机器人在与人类初学者的对战中表现出色,展现了惊人的技术水平和适应能力。这项成果不仅彰显了人工智能在体育竞技中的巨大潜力,还引发了关于AI与人类技能关系的广泛讨论。尽管存在一些挑战,如学习能力和成本问题,但该技术在训练、娱乐等方面的应用前景值得期待。论文详情见【https://arxiv.org/pdf/2408.03906】。
308 5
|
数据采集 数据安全/隐私保护
数据治理创新路:建设数据集市,强化数据报送一致性新实践
企业可以通过组织培训课程、提供操作手册等方式,提高数据报送人员的业务水平和数据意识,减少人为因素导致的数据不一致问题。
|
人工智能 Android开发 C++
ChatGPT最强竞争对手,无需魔法,直接使用
ChatGPT最强竞争对手,无需魔法,直接使用
|
SQL 数据库连接 Shell
python连接SqlServer数据库
要使用Python连接SQL Server数据库,你需要先安装pyodbc库,然后使用它来建立连接。
518 1
python连接SqlServer数据库
|
运维 安全 Linux
企业实战(18)超简单实现轻量级开源堡垒机Teleport管理Linux/Windows主机(2)
企业实战(18)超简单实现轻量级开源堡垒机Teleport管理Linux/Windows主机(2)
364 0