【C->Cpp】深度解析#由C迈向Cpp(2)
目录
(一)缺省参数
全缺省参数
半缺省参数
缺省参数只能在函数的声明中出现:
小结:
(二)函数重载
函数重载的定义
三种重载
在上一篇中,我们从第一个Cpp程序为切入,讲解了Cpp的命名空间要解决的问题,以及输入输出流。
接下来,开始本篇内容->
长长的路,慢慢的走
(一)缺省参数
缺省参数是Cpp另一个基于C上的新增加的语法,实现一个项目,离不开一个一个的功能,为了更加方便的重复使用同一个功能,我们通常将代码段封装成“高内聚,低耦合”的函数中。
想要使用函数,一般要向他传递参数。在C中,我们必须按照函数定义时的参数一一对应的传参:
#include<stdio.h>float sub(float a,int b)
{return (float)(a-b);
}int main()
{printf("%lf\n",sub(5.6,4));return 0;
}
在Cpp中,有缺省参数的语法:
在函数定义的时候,给参数一个值,这个值是“备用的”,如果这个在调用此函数时,没有给参数传值,那么这个参数就会使用这个设定的默认值。
#include<iostream>int func(int a = 50)
{return a;
}
int main()
{std::cout << func(10) << std::endl;std::cout << func() << std::endl;return 0;
}
a默认值为50,有传值按照传递的值;无传值则默认为50.
缺省参数按照缺省的情况不同,分为全缺省参数和半缺省参数
全缺省参数
在定义函数的时候,所有的参数都有默认值
//在定义的时候,对所有的参数设置有默认值void fun_c(int a = 1,int b = 2,int c = 3)
{std::cout << "a = " << a << std::endl;std::cout << "b = " << b << std::endl;std::cout << "c = " << c << std::endl;
}
半缺省参数
在定义函数的时候,部分参数有默认值
//部分参数有默认值——第一个参数a没有默认值,其余参数有默认值void fun_c2(int a,int b = 5,int c = 52)
{std::cout << "a = " << a << std::endl;std::cout << "b = " << b << std::endl;std::cout << "c = " << c << std::endl;
}
但是,有默认值的参数要放在函数定义的参数括号的最右侧,否则,编译器报错
将有默认值的参数放到函数参数括号的右侧后,没有错误提示
在使用的时候,由于有默认值的参数都放在函数的参数括号的最右侧,无默认值的参数在函数括号的左侧,所以手动传入的参数主要是给无缺省参数的参数。
无法跨过没有默认值的参数,直接给有默认值的参数传参
void func2(int a ,int b = 5, int c = 8)
{std::cout << "a = " << a << std::endl;std::cout << "b = " << b << std::endl;std::cout << "c = " << c << std::endl;std::cout << std::endl;
}int main()
{func2(,1,2);func2(1,2);return 0;
}
缺省参数只能在函数的声明中出现:
在项目内部时,缺省参数统一放在函数的声明中
main.cpp
#include"test.h"int main()
{std::cout << add(1,2) << std::endl;std::cout << add() << std::endl;return 0;
}
add.h
#ifndef TEST_H
#define TEST_Hint add(int a = 1,int b = 1);#endif
add.cpp
int add(int a,int b)
{return a+b;
}
编译成功,按照传入参数,和为3;按照默认参数,和为2;
对其他情况:
在定义中设置默认参数;
在定义和声明中都设置默认参数;
都无法编译通过。
只有在声明中设置默认参数,编译可以成功;
小结:
1.半缺省参数(有默认值的参数)必须从右向左来给出,不能间隔着给;
2.缺省参数不能在函数的声明和定义中同时出现,要将缺省参数放在声明中。
(二)函数重载
在C中,我们无法定义任何一个同名的函数。当我们想要实现一系列功能类似,知识数据类型不同的函数时,我们只能在函数名上附带上一些标记:
add_int(); add_dou(); add_flo(); ...
这就不利于我们编程。因为当函数类型更多时,记忆十分繁琐。
函数重载是Cpp为了方便编程,在C的基础上添加的新的语法。
函数重载的定义
函数重载是在同一个作用域中,可以声明几个功能类似的同名函数,但是需要满足的条件是:函数的形参列表不同->
具体来说,形参列表不同指的是 参数个数,类型,类型顺序不同
三种重载
类型不同
int add_(int a,int b)
{return a+b;
}
double add_(double a,double b)
{return a+b;
}int main()
{std::cout << add_(1,2) << std::endl;std::cout << add_(1.5,2.6) << std::endl;return 0;
}
参数个数不同
int add_(int a,int b)
{return a+b;
}int add_(int a,int b,int c)
{return a+b+c;
}int main()
{std::cout << add_(1,2) << std::endl;std::cout << add_(3,5,9) << std::endl;return 0;
}
类型顺序不同
void fun_c4(int a,char c)
{std::cout << a << std::endl;std::cout << c << std::endl;
}void fun_c4(char c,int a)
{std::cout << a << std::endl;std::cout << c << std::endl;
}int main()
{fun_c4(5,'v');fun_c4('p',5);return 0;
}
以上三种情况都是正确的,可以编译通过;编译器似乎可以自动识别函数的参数类型,他根据我们传入参数的类型来自动调用参数类型合适的函数。
但是为什么呢? 编译的时候,编译器是怎么识别的呢?
与C不同的是,Cpp对函数名进行了不同的修饰,同名的函数,由于修饰的内容不同,所以最终Cpp编译器对于同名函数的名称能够区分开。
至于如何区分,具体请听下回解析~
完~
未经作者同意禁止转载
相关文章:

【C->Cpp】深度解析#由C迈向Cpp(2)
目录 (一)缺省参数 全缺省参数 半缺省参数 缺省参数只能在函数的声明中出现: 小结: (二)函数重载 函数重载的定义 三种重载 在上一篇中,我们从第一个Cpp程序为切入,讲解了Cpp的…...

WPS中如何根据身份证号生成出生日期并排序
1. wps中如何根据身份证号导出出生日期并排序 1.1 wps中建一张表 1.2 使用转日期格式导出出生日期 DATE(VALUE(MID(C2,7,4)),VALUE(MID(C2,11,2)),VALUE(MID(C2,13,2)))MID(C2, 7, 4):这部分从单元格 C2 中提取文本字符串,从第7个字符开始提取长度为4的…...

20231222给NanoPC-T4(RK3399)开发板的适配Android11的挖掘机方案并跑通AP6398SV
20231222给NanoPC-T4(RK3399)开发板的适配Android11的挖掘机方案并跑通AP6398SV 2023/12/22 7:54 简略步骤:rootrootrootroot-X99-Turbo:~/3TB$ cat Android11.0.tar.bz2.a* > Android11.0.tar.bz2 rootrootrootroot-X99-Turbo:~/3TB$ tar jxvf Android11.0.tar.…...

iClient for JavaScript如何以mvt矢量瓦片的形式加载数据服务
刘大 这里写目录标题 前言1.iServer中的预览页面2.iClient for JavaScript加载2.1 构建Style2.2 iCient加载2.2.1Leaflet & MapboxGL2.2.2 OpenLayers 前言 在提到查看iServer REST数据服务的概况的时候,大家总会想到说,通过发布对应的地图服务或者…...

全方位掌握卷积神经网络:理解原理 优化实践应用
计算机视觉CV的发展 检测任务 分类与检索 超分辨率重构 医学任务 无人驾驶 整体网络架构 卷积层和激活函数(ReLU)的组合是网络的核心组成部分 激活函数(ReLU) 引入非线性,增强网络的表达能力。 卷积层 负责特征提取 池化层…...

视频批量处理:随机分割方法,创新剪辑方式
随着数字媒体技术的飞速发展,视频处理已是日常生活和工作中不可或缺的一部分。在处理大量视频时,要一种高效、自动化的方法来满足需求。现在一起来看云炫AI智剪如何批量随机分割视频的批量处理方法,给视频剪辑工作带来创新。 视频随机分割4段…...

Gaussian-Splatting 训练并导入Unity中
这个周末玩点啥~🐞 🍥环境安装💡安装C编译工具💡安装Python💡安装CUDA💡添加ffmpeg到环境变量Path添加COLMAP-3.8-windows-cuda文件路径到环境变量Path💡pytorch安装💡tqdm 安装&…...

账号和权限管理
目录 一、用户账号和的概述 (一)用户类别 (二)组账号 编辑(三)UID号 编辑(四)GID号 (五)配置文件 二、用户账号管理 (一)…...
前端---表单标签
1. 表单的介绍 表单用于搜集不同类型的用户输入(用户输入的数据),然后可以把用户数据提交到web服务器 。 2. 表单相关标签的使用 <form>标签 表示表单标签,定义整体的表单区域 <label>标签 表示表单元素的文字标注标签,定义文字…...

Matplotlib 绘制基本的图表
# 导入包 import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams[font.sans-serif][SimHei] # 用来显示中文 plt.rcParams[axes.unicode_minus] False # 显示负坐标轴# 读取源数据,后续大部分数据基于词文件的数据,需…...

【JavaScript】异步解决方案的发展历程
✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…...
前端性能优化三十四:花裤衩模板引入打包分析工具
测量各个插件和loader所花费的时间 (1). install: yarn add speed-measure-webpack-plugin -D(2). Vue-cli 3.x设置: const SpeedMeasurePlugin require(speed-measure-webpack-plugin) const smp new SpeedMeasurePlugin({outputFormat: human }) // 包裹configureWebpac…...
求职小程序列表基础配置-移动端通用列表模块配置教程(1)
求职小程序列表基础配置-移动端通用列表模块配置教程(1) 移动端通用列表页开发指南 准备工作 注册多八多AIIDE账号: 访问多八多AIIDE官网并注册新账号。完成邮箱和手机号的验证。 创建移动应用: 登录后,在工作台新建一个移动应用。填写应用名称,选择“…...
牛客设计模式
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:…...

从零构建tomcat环境
一、官网构建 1.1 下载 一般来说对于开源软件都有自己的官方网站,并且会附上使用文档以及一些特性和二次构建的方法,那么我们首先的话需要从官网或者tomcat上下载到我们需要的源码包。下载地址:官网、Github。 这里需要声明一下ÿ…...

MySQL递归公用表表达式
😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。 🎆学习格言:不读书的人,思想就会停止。——狄德罗 ⛪️个人主页:进入博主主页 🗼专栏系列:MySQL知识 &…...

深入 K8s 网络原理(一)- Flannel VXLAN 模式分析
1. 概述 这周集中聊下 K8s 的集群网络原理,我初步考虑分成3个方向: Pod-to-Pod 通信(同节点 or 跨节点),以 Flannel VXLAN 模式为例; Pod/External-to-Service 通信,以 iptables 实现为例&…...

fpga 8段4位数码管verilator模拟
8段4位数码管verilator模拟 seg.v module seg(input wire clk,input wire rst_n,output wire[7:0] SEG,output wire[3:0] SEL );reg[7:0] digit[0:15] {8h3f, 8h06, 8h5b, 8h4f, 8h66, 8h6d, 8h7d,8h07,8h7f,8h6f, 8h77, 8h7c, 8h39, 8h5e, 8h79, 8h71};reg[31:0] cnt 32…...
HttpURLConnection发送各种内容格式
通过java.net.HttpURLConnection类实现http post发送Content-Type为multipart/form-data的请求。 json处理使用com.fasterxml.jackson 图片压缩使用net.coobird.thumbnailator log使用org.slf4j 一些静态变量 private static final Charset charset StandardCharsets.UTF_8;…...

摇杆控制人物移动
摇杆控制人物移动 一、UI搭建二、3d模型搭建三、脚本JoyStickBar.csPlayerController.cs 工程在我资源里名字叫Joystickbar.unitypackage [连接](https://download.csdn.net/download/qq_42194657/12043019?spm1001.2014.3001.5503) 一、UI搭建 JoyStickBar是图片背景 JoySt…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...

高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...