初谈C++:缺省参数函数重载

在这里插入图片描述

文章目录

  • 缺省参数
    • 概述
    • 缺省参数的分类
      • 全缺省
      • 半缺省参数
    • 注意
  • 函数重载
    • 概述
    • 重载类型不同
      • 参数类型不同
      • 参数个数不同
      • 参数类型顺序不同
  • C++支持函数重载的原理

缺省参数

概述

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

举例:

void fun(int a = 5)
{
	cout << a << endl;
}

int main()
{
	fun(10); //传参,使用指定的参数-->10

	fun(); //没有传参,使用参数的默认值

	return 0;
}

在这串代码中,在fun函数中有一个形参int a = 5,主函数中,fun(10),传了参数,于是在fun函数中就是用传的参数;而fun()中没有传参数,就是用参数的默认值。

输出结果:

10
5

在这里插入图片描述

缺省参数的分类

全缺省

void Func(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}

int main()
{
	Func();
	return 0;
}

结果:

a = 10
b = 20
c = 30

主函数中Func()没有任何参数,则全部使用缺省值。

半缺省参数

void Func(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl << endl;
}

int main()
{
	Func(1, 2, 3);
	Func(1, 2);
	Func(1);

	return 0;
}

结果:

a = 1
b = 2
c = 3

a = 1
b = 2
c = 30

a = 1
b = 20
c = 30

在这里插入图片描述
半缺省参数必须从右往左依次来给出,不能间隔着给

Func(1, 2)是给了第一个参数和第二个参数值,,而没有给第三个参数值
Func(1)只给第一个参数传了值
不存在只给第一个参数和第三个参数传值的说法,这种是错误的,只能从左至右一次给出。

注意

  • 缺省参数不能在函数声明和定义中同时出现
//test.h
void Func(int a = 10);
// test.cpp
void Func(int a = 20)
{}

如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值

  • 缺省值必须是常量或者全局变量

函数重载

在汉语中,一个词语会有多种意思,人们可以结合语境可以判断一个词的意思。如“方便”一词:”你现在方便嘛”、“我要去方便一下”。

概述

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

重载类型不同

参数类型不同

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;
}
int main()
{
	cout << Add(2, 3) << endl;
	cout << Add(2.0, 3.0) << endl;
}

运行结果:

在这里插入图片描述

函数名称同为Add,但是定义此函数的类型不同,一个是int,另一个是double,在主函数中调用的Add函数,如果传的参数为int型,那么调用int Add(int left, int right);如果传的参数为double型,那么调用double Add(double left, double right)

编译器会根据参数类型,自动选择调用的函数

参数个数不同

void fun()
{
	cout << "f()" << endl;
}
void fun(int a)
{
	cout << "f(int a)" << endl;
}
int main()
{
	fun();
	fun(1);
	return 0;
}

运行结果:
在这里插入图片描述
主函数中,第一个调用的函数fun(),没有参数,第二个调用的函数fun(1)传了一个参数,属于参数不同的情况。

但是在无参调用时,出现了歧义,对于两个fun函数来说,都可以不传参。

参数类型顺序不同

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

int main()
{
	Text(1, 'a');
	Text('a', 1);
	return 0;
}

运行结果:

在这里插入图片描述

编译器自己会根据传入的参数类型不同而选择相应的函数。

C++支持函数重载的原理

为什么C++支持函数重载,而C语言不支持函数重载呢?

在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。

预处理是展开头文件/宏替换/条件编译/去掉注释

编译是检查语法,转成汇编代码

汇编是把汇编代码转成二进制机器码

在这里插入图片描述
实际项目通常是由多个头文件和多个源文件构成,而通过C语言阶段学习的编译链接,我们
可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标
文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。

如何处理这一问题?

链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就
会到b.o的符号表中找Add的地址,然后链接到一起。每个编译器都有自己的
函数名修饰规则。

Windows系统下的命名规则稍复杂,在Linux操作系统下会简单些,可参考文章–>Linux编译器-gcc/g++

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/361594.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TI AM5708工业派

文章目录 一、TI AM5708工业派简介二、主要使用的功能三、J12 扩展接口四、NFS代码实现总结 一、TI AM5708工业派简介 TI AM5708工业派是基于美国德州仪器&#xff08;TI&#xff09;的AM5708处理器所开发的智能硬件工业派&#xff0c;主要面向工业生产、图像处理、智能人机交…

Java面试题之 IO(四)

Java面试题之 IO&#xff08;四&#xff09; 文章目录 Java面试题之 IO&#xff08;四&#xff09;随机访问流 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 随机访问流 这里要介绍的随机访问流指的是支持随意跳转到文件的任意位置进行读写的 RandomAccessFile 。…

HTTPS实现原理

1 为什么需要HTTPS&#xff1f; HTTP 在进行数据传输时采用明文传输&#xff0c;数据包中的用户信息等隐私数据可以被第三方通过抓包等方式窃取&#xff0c;是不安全的。 如果客户端使用 MD5 加密算法对数据进行加密&#xff0c;由于加密后的结果是不可逆的&#xff0c;服务器…

LeetCode刷题日志-117填充每个节点的下一个右侧指针II

二叉树的题目&#xff0c;我认为二叉树必须要掌握递归的三种遍历算法&#xff0c;以及层序遍历算法才能做二叉树题目。这道题目我的想法是&#xff1a; 因为在二叉树每一层中&#xff0c;next指针指向的是的当前节点的右边的节点&#xff0c;所以&#xff0c;使用层序遍历&…

软件价值3-A*算法寻路

A*算法&#xff08;A-star算法&#xff09;是一种启发式搜索算法&#xff0c;主要用于在图或网络中找到从起始节点到目标节点的最佳路径。它结合了Dijkstra算法的广度优先搜索和贪婪最优优先搜索的特点&#xff0c;通过估算从起始节点到目标节点的代价来指导搜索方向。 A*算法…

数据恢复之道:DevicData-P-XXXXXXXX勒索病毒的预防与恢复攻略

尊敬的读者&#xff1a; 随着科技的发展&#xff0c;网络安全问题愈发突出&#xff0c;而勒索病毒作为其中的一种恶意软件&#xff0c;正不断演进成为威胁用户数据安全的严重问题。本文将深入介绍.DevicData-P-XXXXXXXX勒索病毒的特征&#xff0c;提供被感染文件的恢复方法&am…

【Latex】 最全的Latex公式常用符号和文本颜色用法汇总

每次在CSDN写latex公式都没有一个很全的博客能完全覆盖&#xff0c;本文争取汇总Latex使用过程中用到的所有符号和技巧&#xff0c;包括&#xff1a;二元运算与关系符号、大型运算符、数学符号、特殊字符、希腊字母、各种括号和矩阵的编码等。 注意&#xff0c;其他排版主要用…

ov通配符ssl证书申请时间长吗

通配符SSL证书是SSL数字证书的一种&#xff0c;可以同时保护主域名以及同一个域名下的所有子域名。用户在申请通配符SSL证书时需要CA认证机构对提交的信息进行审核&#xff0c;审核时间根据证书的品牌、类型而变化。今天就随SSL盾小编了解OV通配符SSL证书申请时间。 1.通配符S…

深入Pyecharts:桑基图绘制与炫酷效果实战【第38篇—python:桑基图】

文章目录 深入Pyecharts&#xff1a;桑基图绘制与炫酷效果实战桑基图简介安装 Pyecharts简单桑基图的绘制自定义桑基图的炫酷效果高级样式定制 多组数据桑基图的展示动态桑基图的绘制结合真实数据的桑基图案例导出和分享进阶应用&#xff1a;桑基图与其他图表的组合总结 深入Py…

知识点积累系列(四)Kubernetes篇【持续更新】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 知识点积累 系列文章的第四篇&#xff0c;记录日常学习中遇到的 Kubernetes 相关的知识点 1.Kubernetes琐碎知识点 1.1.为什么要有annotations annotation中除了能够记录一些额外信息&#xff0c;还可以解决k…

几种常见的vcruntime140_1.dll无法继续执行代码弹窗错误解决办法

vcruntime140_1.dll是Windows操作系统中的一个动态链接库文件&#xff0c;用于支持C程序和应用程序的运行&#xff0c;有时可能会遇到以下错误信息&#xff1a;“vcruntime140_1.dll无法继续执行代码”。本文将详细介绍这个常见问题的原因&#xff0c;并提供相应的解决办法。 一…

安装 vant-ui 实现底部导航栏 Tabbar

本例子使用vue3 介绍 vant-ui 地址&#xff1a;介绍 - Vant 4 (vant-ui.github.io) Vant 是一个轻量、可定制的移动端组件库 安装 通过 npm 安装&#xff1a; # Vue 3 项目&#xff0c;安装最新版 Vant npm i vant # Vue 2 项目&#xff0c;安装 Vant 2 npm i vantlatest-v…

Linux服务器根据服务端口号杀死对应服务

获取服务pid 输入命令 ss -tulnp | grep :16522输出 tcp 表示连接的类型是TCP。LISTEN 表示端口正在监听连接。第一个数字 0 是 Recv-Q&#xff08;接收队列&#xff09;&#xff0c;表示当前接收队列中已由网络接收但还未被进程读取的数据的数量。第二个数字 128 是 Send-Q&…

使用moment实现数字转秒数和递进分钟和小时

使用moment实现数字转秒数和递进分钟和小时 效果图引用包js 功能&#xff1a;不满一分钟展示秒数&#xff0c;满一分钟展示分秒&#xff0c;满一小时展示时分秒 效果图 引用包 "moment": "^2.24.0", "moment-duration-format": "^2.3.2&q…

springboot+AOP+自定义注解+RBAC自定义操作权限管理01

springbootAOP自定义注解RBAC自定义操作权限管理01!今天 做了内容是该自定义权限管理系统的前奏。第一小节内容。搭建了一个基础的springboot项目&#xff0c;和数据库的三张表。 tb_user;tb_role;tb_roel_user。实现了一个基础的&#xff0c;用户和角色表的联动查询。为了后续…

uniapp如何安装uview

1.下载并导入插件 打开链接 uView2.0重磅发布&#xff0c;利剑出鞘&#xff0c;一统江湖 - DCloud 插件市场 没有的登录的就先登录 导入成功后&#xff0c;可见 2. 添加配置 main.js import uView from /uni_modules/uview-ui Vue.use(uView) uni.scss import /uni_module…

(M)UNITY三段攻击制作

三段攻击逻辑 基本逻辑&#xff1a; 人物点击攻击按钮进入攻击状态&#xff08;bool isAttack&#xff09; 在攻击状态下&#xff0c; 一旦设置的触发器&#xff08;trigger attack&#xff09;被触发&#xff0c;设置的计数器&#xff08;int combo&#xff09;查看目前攻击…

Mastercam 2024 下载安装教程,流程简单,小白也能轻松搞定,附安装包和工具

前言 Mastercam是一款高效专业的实用型CAD/CAM设计辅助工具&#xff0c;集二维绘图、三维实体造型、曲面设计、体素拼合、数控编程、刀具路径模拟及真实感模拟等多种功能于一身&#xff0c;能够帮助用户轻松设计各种复杂的曲线、曲面零件、刀具路径等。 准备工作 1、Win10及…

小米笔记本电脑共享屏幕到苹果手机,这里有两个方法

相信大家都知道苹果手机投屏到小米笔记本电脑的方法&#xff0c;今天分享一下将电脑投屏到苹果手机的操作。 你可以选择安装软件或不安装软件。 安装软件的方法&#xff1a; 第一步&#xff0c;在小米笔记本电脑和苹果手机都安装AirDroid Cast&#xff0c;两台设备连接同一个网…

Linux/ScriptKiddie

Enumeration nmap 第一次扫描发现系统对外开放了22和5000端口&#xff0c;端口详细信息如下 22端口运行着openssh&#xff0c;5000端口则是werkzeug的httpd&#xff0c;tittle是kids hacker tools TCP/5000 首先从5000端口开始&#xff0c;先访问站点&#xff0c;站点是一个…