【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器

| C++语法 | 相关知识点 | 可以通过点击 | 以下链接进行学习 | 一起加油! |
|---|---|---|---|---|
| 命名空间 |
本章将分享缺省参数与函数重载相关知识,为了更加深入学习C++打下了坚实的基础。本章重点在于缺省参数与函数重载使用前提与注意事项


🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记
🌈初阶数据结构笔记专栏: 初阶数据结构笔记
🌈Linux笔记专栏: Linux笔记
🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅

文章目录
- 一、缺省参数
- 1.1 缺省参数的概念
- 1.2 缺省函数分类
- 1.3 正确使用缺省参数前提
- 二、函数重载
- 2.1 函数重载概念
- 2.2 使用函数重载前提
- 2.3 C++支持函数重载的原理-名字修饰(name Mangling)
一、缺省参数
1.1 缺省参数的概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值(默认值)。在调用该函数时,如果没有指定实参,则采用该形参的缺省值(默认值),否则使用指定的实参。
#include <iostream>
using namespace str;
void Func(int a=0)
{count<<a<<endl
}
int main()
{Func();//0Func(10);//10
}
1.没有传参,使用参数的默认值
2.传参,使用指定的参数
1.2 缺省函数分类
全缺省函数:
void Func(int a = 10, int b = 20, int c = 30)
{cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;
}
半缺省函数:
void Func(int a, int b = 10, int c = 20)
{cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;
}
1.3 正确使用缺省参数前提
第一点(重点):
- 缺省参数不能在函数声明和定义同时出现
说明:从两个方面来说,一方面如果声明与定义位置同时出现,恰好两个位置提供的值不同,那么编译器就无法确定到底该使用哪个缺省值,另一个方面来说就算两个位置提供的值相同,祖师爷规定也不能这种方式操作
2.缺省参数选择在函数声明出现
说明:一般将声明放在头文件中,而头文件将在编译阶段进行展开进行语法检查。对于函数地址而言是用于执行一堆指令(Call 函数中指令)到CPU中处理,那么函数地址是第一个指令地址,而函数定义才会使用到地址,函数声明不存在有效地址。
那么在编译阶段,对于函数声明编译器选择放过呢?由于编译器是进行语法分析,在链接时,函数声明会通过无效地址到符号表定位到真正函数的地址。
重定位就是在链接地址跟运行地址不同的情况下,执行一段位置无关码,这段位置无关码的作用就是将原来的那份代码全部复制到链接地址那里去,然后自己再长跳转到新的那份代码的刚刚执行的那个位置。这样就实现了链接地址跟运行地址一致的情况

具体场景辅助理解:
你要买房需要首付30w,现在手头只有20w,打了一通你的室友电话,你的室友同意借你10w。到首付的时候,你室友的10w迟迟没有到账,后面才知道你室友家破产了,借不出去答应借你10w(声明/承诺)
- 答应借你10w(声明/承诺)
- 转账给你10w(定义/兑现)
第二点:
- 半缺省实(或形)参数必须从右往左依次来给出,不允许间隔着给
说明:在语法层次上,我们属于学习者是根据语法规定来进行学习。如果想要更有说服力的答案,在调试阶段,通过鼠标右边点击反汇编,从图中我们可以得到传参是传参是从右到左push数据

部分补充:
- 缺省参数必须是常量或者全局变量
- C语言不支持缺省参数
缺省参数使用场景:无法得知插入准确值
//1.确定要插入100个数据
StackInit(&st1, 100);
//1.确定要插入10个数据
StackInit(&st2, 10);
// 3、不知道要插入多少个
StackInit(&st3);
二、函数重载
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断词真实的含义,该词被重载了。(有卧龙必有凤雏)
2.1 函数重载概念
函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,常用来处理实现功能类似数据类型不同的问题,而C语言不允许同名函数
2.2 使用函数重载前提
函数重载需要满足其中一个条件:
- 参数类型不同
- 参数个数不同
- 参数类型顺序不同(本质是参数类型不同)
#include<iostream>
using namespace std;
// 1、参数类型不同
int Add(int x,int y)
{return x+y;
}
int Add(double x,double y)
{return x+y;
}// 2、参数个数不同
void f()
{cout<<"f()"<<endl;
}
void f(int a)
{cout<<"f(a)"<<endl;
}// 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;
}
int main()
{Add(10, 20); //call(?)Add(10.1, 20.2); //call(?)f();f(10);f(10, 'a');f('a', 10);return 0;
}
2.3 C++支持函数重载的原理-名字修饰(name Mangling)
我们知道C语言不支持函数重载,那么C++如何去支持函数重载呢?
f(10, 'a'); //call(?)f('a', 10); //call(?)
首先简单快速过一遍,关于程序在编译环境下的流程
在C/C++,程序运行之前,需要进行以下几个阶段:预处理、编译、汇编、链接

每个编译器都有属于自己的一套函数名修饰规则,windows下vs的修饰规则过于复杂,而Linux下g++的修饰规则简单
int Add(int a,int b)
{return a+b;
}
void func(int a,double b,int *p)
{}
int main()
{Add(1,2);func(1,2,0);return0
}
采用C语言编译器:

采用C++编译器:

- C语言在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变
- C++在linux下,采用gcc编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修饰后名字中
梳理:由于C语言在链接时,直接使用函数名去找地址,同名函数无法区分不开。C++可以通过函数名修饰规则,将名字引入参数类型(不同编译器有不同规则)。只要参数不同,修饰出来的名字就不一样,就支持了重载。(如果两个函数的函数名和参数时一样的,返回值不同是不构成重载的)
以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二呀C++笔记,希望对你在学习C++语言旅途中有所帮助!

相关文章:
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间 本章将分享缺省参数与函数重载相关知识,为了更加深入学习C打下了坚实的基础。本章重点在于缺省参数与函数重载使用前提与注意事项 🌈个人主页:是店小二呀 …...
mysql排查死锁的几个查询sql
SHOW PROCESSLIST; select * from information_schema.INNODB_TRX; select * from information_schema.INNODB_LOCKS; select * from information_schema.INNODB_LOCK_WAITS;...
快速部署私有化大模型 毕昇(使用docker-compose方式)
docker安装 1. # Linux系统安装docker,以CentOS/RHEL为例,其他操作系统请参考docker官方安装方法 # 如果已经安装过docker 期望重装,先卸载 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \d…...
B端:导航条就框架提供的默认样式吗?非也,看过来。
导航条不一定必须使用框架提供的默认样式,你可以根据项目需求和设计风格进行自定义。通过使用框架提供的自定义选项、CSS样式覆盖、自行设计或者使用其他UI库或组件,你可以实现独特且符合需求的导航条样式。 下面发一些参考给友友们,可以让设…...
idea的git与SVN切换
1、选择setting->Version Control,新增或者编辑,选择目录,使用git或者svn管理 2、选择项目中的vcs.xml,打开选择要用的,注释掉不用的版本即可...
互联网家政小程序,为大众带来高效、便捷的服务
随着人口老龄化的严重和社会生活节奏的加快,大众对家政服务的需求日益增加,家政行业的市场规模逐渐扩大! 在科技的推动下,家政行业开始向数字化发展,“互联网家政”的模式推动了市场的快速发展。互联网家政小程序借助…...
【常用库】【pytorch】基本部件
基本元件 1. 卷积 2. batchnorm loss函数 torch.nn.MSELoss() >>> a torch.rand(3) >>> a tensor([0.2161, 0.2227, 0.9175]) >>> b torch.rand(3) >>> b tensor([0.6976, 0.9149, 0.4918]) >>> mse torch.nn.MSELOSS() &…...
深入Scrapy框架:掌握其工作流程
深入Scrapy框架:掌握其工作流程 引言 作为一名资深的Python程序员,我对各种数据采集工具有着深刻的理解。Scrapy,作为一个上场率极高的爬虫框架,以其高效、灵活和强大的特性,成为数据采集领域的不二选择。在本文中&a…...
从零开始学习机器学习,掌握AI未来的关键!
从零开始学习机器学习 1. 介绍1.1 人工智能(AI)概述1.2 机器学习在人工智能中的应用1.3 机器学习基础概念 2. 监督学习2.1 什么是监督学习2.2 回归分析2.3 分类问题2.4 模型评估和选择 3. 无监督学习3.1 什么是无监督学习3.2 聚类算法3.3 降维技术 4. 深…...
CI/CD(持续集成/持续部署)
CI/CD(持续集成/持续部署)是软件开发过程中的一种方法,旨在提高开发效率和软件质量。以下是对CI/CD的具体解释: 1.持续集成(Continuous Integration,CI): 概念:开发人员将代码频繁地合并到主分支中,每次提交都会触发自动化构建和测试过程。目的:及时发现和修复集成…...
实现字母的大小写转换。多组输入输出(c语言)
1.我们先输入字母(用getchar的函数),判断是不是字母,我们可以用a<tmp<z或者A<tmp<Z,注意:小写转换大写用tmp-32,大写转换小写用tmp32.. #include<stdio.h> int main() {int a 0;while …...
2024华为OD机试真题-最小矩阵宽度Python-C卷D卷-200分
2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述 给定一个矩阵,包含 N * M 个整数,和一个包含 K 个整数的数组。 现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数。 输入描述 第一行输入两个正整数 N,M,表示矩阵大小。 接下来 N …...
【Vue3】标签的 ref 属性
【Vue3】标签的 ref 属性 背景简介开发环境开发步骤及源码 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。…...
llama-factory 系列教程 (六),linux shell 脚本自动实现批量大模型的训练、部署与评估
背景 最近在做大模型微调训练的评估,每次都要手动训练大模型,手动评估。 发现这样太浪费时间了,于是就尝试着使用linux shell 脚本,利用 for 循环自动实现大模型的训练、部署与评估。 实验:在不同的文本分类数据集尺…...
python安全脚本编写之流量泛洪
多线程与流量泛洪 并发操作 如果一个单核的cpu,是并不存在严格意义的并发,只是因为处理时间极短,所以感觉上是并发操作的。 针对多核CPU,4核CPU,严格意义上的并发处理是4个 线程和进程 每一个应用程序,至少…...
一文看懂Java反射、注解、UML图和Lambda表达式
反射 定义: 反射是 java 开发语言的特征之一,它允许 java 程序对自身进行检查(自审),并能直接操作程序内部属性,即就是将类中的各种成分映射成一个 java 对象,利用反射技术可以对一个类进行解剖,将各个组成部分映射成…...
【漏洞复现】搜狗输入法简单绕过Windows锁屏机制
免责申明 本公众号的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息…...
JAVA Spring学习Day1
Maven Maven配置: Maven是Java项目的构建工具,使用pom.xml配置文件管理项目依赖、插件和构建目标。Spring Boot项目搭建: Spring Boot是基于Spring框架的快速开发框架,通过约定大于配置的理念简化了Spring应用的搭建和开发。 …...
linux常见面试题(三)
18 什么事SQL注入 由于程序员的水平及经验参差不齐,大部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断。 应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据…...
【JS】ES6新类型Map与Set
一、Map Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值)都可以作为键或值。 描述 Map 对象是键值对的集合。Map 中的一个键只能出现一次;它在 Map 的集合中是独一无二的。 Map 对象按键值对迭代——…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
