参数缺省和函数重载讲解
一路风雨兼程磨砺意志,三载苦乐同享铸就辉煌
目录
1.参数缺省的概念
2.参数缺省的用法
3.缺省参数分类
3.1.全缺省参数
3.2.半缺省参数
4.函数重载的概念
5.函数重载的用法
6.函数重载的原理
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的函数里面去调用两个重载函数查找地址是也是明确的。
文章到这里就结束啦~~
参数缺省和函数重载讲解相关推荐
- C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)
每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...
- 【C++入门第一期】命名空间 缺省参数 函数重载 的使用方法及注意事项
目录 简介 命名空间 为何会有命名空间 命名空间的定义 嵌套定义 命名空间的使用 作用域限定符 using 将命名空间中某个成员引入 using namespace 将该空间所有成员引入 缺省参数 全 ...
- c/c++教程 - 2.3 函数的提高 函数的形参列表默认值 占位参数 函数重载
3. 函数的提高 目录 3. 函数的提高 3.1 函数的默认参数 3.2 函数占位参数 3.3 函数重载 (重要) 相关教程 3.1 函数的默认参数 C++中,函数的形参列表中的形参是可以有默认值的. ...
- C++函数重载解析细节
Copyright(C)<C++从入门到精通-经典完整版> 函数重载解析细节 函数重载解析过程有三个步骤这些步骤可以总结如下: 1 确定为该调用而考虑的候选函数以及函数调用中的实参表属性 ...
- C++中函数重载是如何实现
函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函数重载的实现,但我想其它语言也是类似的)?这个可以分解为下面两个问题 1.声明/定义重载函数时,是如何解决命 ...
- 浅谈C++的函数重载
转自:微点阅读(www.weidianyuedu.com)微点阅读 - 范文大全 - 免费学习网站 导语: 函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函 ...
- C++学习笔记:(二)函数重载 常量与引用
目录 3.函数重载 3.1 非成员函数重载 3.2 成员函数重载 3.3 函数的默认参数 3.4 内联函数 4.常量与引用 4.1 const的最初动机 4.2 const与指针 4.3 const与 ...
- java构造函数可以重载么_Java 构造函数和函数重载
构造函数:⑴方法名和类名相同,而且没有返回类型(包括 void 也没有): ⑵没有返回值: ⑶如果没有输入构造函数,jvm会自动帮我们创建一个不带参数,没有任何函数体的的构造函数: 如果我们手动的创建 ...
- 【C++】C++中函数重载的理解
我们在平时写代码中会用到几个函数但是他们的实现功能相同,但是有些细节却不同.例如:交换两个数的值其中包括(int, float,char,double)这些个类型.在C语言中我们是利用不同的函数名来加 ...
最新文章
- mysql 生成json,结合CONCAT()和COALESCE()在MySQL中生成JSON
- ueditor 不显示工具栏_Python 之Django富文本框Ueditor的使用
- ElementUI中使用el-calendar实现基于日历的节假日的增删改查
- 移动音视频SDK工程实践之数据采集和处理
- MinGW安装和使用基础教程
- 【HDU - 5050 】Divided Land (Java大数,大数进制转换,大数gcd)
- php直播pk规则,直播源码中的主播PK功能是如何实现的
- MySQL工作笔记-编写存储过程批量添加数据
- php中的CURL库
- ViolinMemory上市遇低迷 唱衰闪存为哪般?
- js练习8(幻灯片切换效果)
- vue 小写金额转换为大写金额
- 用Rust保存Windows聚焦图片
- 哲学家进餐问题(操作系统)
- python中的pip什么意思-python中的pip
- UPnP 体系架构和基本原理 —— UPnP的描述文件
- 高性能计算中的并行计算、分布式计算、网格计算和云计算之间的区别与联系
- Gitee+PicGo+Typora图床搭建丨出现 Error: You must be logged in to use 的解决方法
- 收费软件推广模式探索1
- 【IT圈内事】2019互联网企业100强
热门文章
- 如何部署服务器虚拟化,服务器如何虚拟化
- Nginx + Tomcat 实现负载均衡
- java智能停车场收费管理系统
- firmware upgrade encountered an issue.please select recovery mode in kies try again
- 连接mysql数据库实验_Jdbc连接数据库实验报告(1)
- 大数据未来7大发展趋势:第一大趋势为什么是物联网?
- [心得]被霏凡封的帖子,小红伞,趋势分析,五大杀毒引擎分
- python实现企查猫登录
- 金山网盾3.6两周拦阻2000万次恶意软件下载
- 计算机丢失msutb.dll,解决方法:如果输入法图标丢失,该怎么办?如果缺少计算机右下角的输入法,该怎么办...