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

目录

 C++/C语言 函数调用的工作原理:

函数调用一般分为两个部分:

缺省参数: 

缺省参数的分类: 

全缺省参数 

半缺省参数 

注意事项:

缺省参数与C语言的调用参数对比:

函数重载:

函数重载的工作原理:

函数重载的分类: 


 C++/C语言 函数调用的工作原理:

在讲诉缺省参数和函数重载之前我们首先要了解一下C语言/C++的 函数调用的工作原理。

函数调用一般分为两个部分:

  • 函数声明
  • 函数定义

函数声明主要是写在头文件中,而函数定义则写在.c或.cpp的源文件中,并且函数定义使用包含头文件的方式,对头文件进行连接。

而后通过Linux的翻译工作原理我们可以知道,编译器在执行代码之前会执行四个步骤,分别是:预处理、编译、汇编、链接

其中,在预处理阶段,函数定义中包含的头文件,会将头文件的内容完全展开并复制在定义代码的上方。

其次,在链接阶段,函数定义中的代码会变成一串机器代码以便编译器进行执行,而这一串机器代码在形成的过程中会将这一大串代码的首个元素的地址,发送到一共特点的函数中,最后这个函数同样会形成一个地址,发送到函数声明中,由函数声明调用。

  •  也就是说,函数调用的工作原理其实是:

函数声明------(中间函数地址)---->中间函数------(函数定义的首元素地址)------>函数定义代码

且需要注意一点的是,没有函数定义也就不会产生函数定义的代码,即使有函数声明也无法使用函数的调用

缺省参数: 

缺省参数通俗来讲就是默认参数,在函数调用的时候给予调用的参数一个默认值,当没有给予这个参数数值时,就调用这个默认值进行函数的运算或者执行函数。

void Func(int a = 0)
{cout<<a<<endl;
}
int main()
{Func();     // 没有传参时,使用参数的默认值Func(10);   // 传参时,使用指定的实参
return 0;
}

缺省参数的分类: 

  • 全缺省参数 

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;}

注意事项:

需要注意的是缺省参数的设置是从右往左,而非从左往右,且缺省参数必须是连续设置,中间不能突然断掉,就如图下面代码所示:

//下面代码是错误的!
void Func(int a = 10, int b, int c = 20){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}

同时还需要注意在使用新参数覆盖缺省参数时,也必须连续覆盖,而不能跳过覆盖!

void Func(int a = 5, int b = 10, int c = 20){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}
int main()
{Func();      //正确的Func(10);    //正确的Func(1,2);   //正确的Func(1,2,3); //正确的Func(1,,2);  //不正确的Func(,2,3);  //不正确的
return 0;
}

最后 需要注意,缺省参数最好在声明中出现,如果想要定义中也出现,最好函数定义部分的缺省参数必须和声明中的缺省参数保持一致!

//a.hvoid Func(int a = 10);// a.cppvoid Func(int a = 20){}// 注意:如果声明与定义位置同时出现//恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。

缺省参数与C语言的调用参数对比:

如下代码所示,当函数调用时没有使用缺省参数,则使用Func()和Func(10)会发生报错问题,而使用了缺省参数后 ,空出的部分或者说没有使用数值的部分默认使用了缺省参数,这就是缺省参数和普通调用参数的不同之处!

void Func(int a = 5, int b = 10, int c = 20){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}
int main()
{Func();      Func(10);    return 0;
}

函数重载:

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

简单来说,函数重载允许使用相同的函数名,但不同的是,内部的参数必须不一样! 

函数重载的工作原理:

上文讲诉过,函数在调用时,在链接的阶段会访问到中间函数,而中间函数的内部可能会有多个函数的地址,而链接编译器则会通过函数的名字来寻找他所对应的函数,从而找到函数定义的地址,

而C语言中函数不能同名的原因也是如此,连接编译器会分不清楚到底那个是它需要的地址。

但是c++就不会,因为在c++的默认规则中,每输入一共函数,这个函数就会被编译器默认的在内部修改名字,所以就不会有着函数名字重复的冲突了! 

函数重载的分类: 

#include<iostream>
using namespace std;// 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;
}// 2、参数个数不同
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int 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);Add(10.1, 20.2);f();f(10);f(10, 'a');f('a', 10);return 0;}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pve8.1 安装、创建centos7虚拟机及配置

之前创建虚拟机centos7时&#xff0c;硬盘分配太大了&#xff0c;做成模板后无法进行修改了&#xff0c;安装完pve8.1后&#xff0c;强迫症犯了重新创建一下顺便记录一下配置过程。由于目前centos7还是生产用的比较多的版本所以本次还是安装centos7.9版本。 一、下载镜像 下载…

利用Redis List实现数据库分页快速查询的有效方法

目录 引言 传统数据库分页查询的挑战 Redis List的优势 利用Redis List实现分页查询 1. 数据准备 2. 分页查询 3. 分页缓存 4. 分页处理 结论 引言 随着Web应用程序的发展和用户数量的增加&#xff0c;数据库分页查询变得越来越常见。分页查询允许用户在大型数据集中…

JVM/GC复习

JVM/GC JVM(java虚拟机)MATjstack(将正在运行的JVM的线程进行快照并且打印出来)死锁VisualVM工具(监控线程内存使用情况)JMX GC垃圾回收算法1.引用计数法2.标记清除发3.标记压缩算法4.复制算法5.分代算法 收集器1.串行垃圾收集器2.并行垃圾收集器2.CMS垃圾收集器 3.G1垃圾收集器…

JavaWeb,过滤器Filter和监听器Listener的学习

过滤器概述 Filter&#xff0c;即过滤器&#xff0c;是JAVAEE技术规范之一&#xff0c;作用于目标资源的请求进行过滤的一套技术规范 Filter接口定义了过滤器的开发规范,所有的过滤器都要实现该接口Filter的工作位置是项目中所有目标资源之前,容器在创建HttpServletRequest和…

营销一体化平台如何助力企业增长?3个案例深度解析

无论大家怎么想&#xff0c;反对和批评的声音有多大&#xff0c;还是有很多企业从组织层面为CMO下了很多需要及时转化的KPI要求。 原因无外乎是增长乏力。再加上外部环境处在产业升级换代、科技革命在即的当口&#xff0c;企业比以往任何时候都意识到营销变革的重要性。 然而…

两相步进电机驱动原理

两相步进电机驱动 前言什么是步进电机驱动器细分控制电机内部结构图片步进电机驱动原理&#xff08;重要&#xff09;步进电机参数&#xff11;、步距角&#xff1a;收到一个脉冲转动的角度&#xff12;、细分数 &#xff1a;&#xff11;&#xff0f;&#xff12;&#xff0c…

算法训练营Day50(动态规划11)

说明 较难&#xff0c;二刷再仔细打代码 123.买卖股票的最佳时机III 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 提醒 这道题一下子就难度上来了&#xff0c;关键在于至多买卖两次&#xff0c;这意味着可以买卖一次&#xff0c;可以买卖两次&a…

清华大学对港澳台华侨生新增额外招生项目来啦

导读 众所周知的是&#xff0c;港澳台和华侨生录取清华大学和北京大学&#xff0c;除了港澳台联考&#xff0c;DSE申请等形式之外&#xff0c;那只有和普通内地高中生混在一起的录取方式。但是其实近些年来&#xff0c;清华大学也为尖子生开辟了新的录取方式&#xff0c;我们一…

Qt Quick程序的发布|Qt5中QML和Qt Quick 的更改

# Quick程序的发布旧版做法 # Qt5中QML和Qt Quick 的更改 1.QML语言的更改(Qt4->Qt5) 在QML语言中,只有少量更改会影响QML代码的迁移:无法直接导入单独的文件(例如:import"MyType.qml”),需要导人该文件所在的目录; JavaScript文件中的相对路径被解析…

Python——Requests库笔记②

requests基本方法 requests.request(method, url, kwargs) requests.delete(url, kwargs) requests.get(url, params, kwargs) requests.head(url, kwargs) requests.patch(url, data, kwargs) requests.post(url, data, json, kwargs) requests.put(url, data, kwargs) 其中…

线性代数:矩阵的定义

目录 一、定义 二、方阵 三、对角阵 四、单位阵 五、数量阵 六、行&#xff08;列&#xff09;矩阵 七、同型矩阵 八、矩阵相等 九、零矩阵 十、方阵的行列式 一、定义 二、方阵 三、对角阵 四、单位阵 五、数量阵 六、行&#xff08;列&#xff09;矩阵 七、同型矩…

手写一个图形验证码

文章目录 需求分析 需求 使用 JS 写一个验证码&#xff0c;并在前端进行校验 分析 新建文件 VueImageVerify.vue <template><div class"img-verify"><canvas ref"verify" :width"state.width" :height"state.height&qu…

[开发语言][C++]:递增递减运算符

什么是递增递减运算符 递增运算符和递减运算符为对象的1和-1提供了简洁的书写形式。 自增自减运算符的应用&#xff1a; 这两个运算符除了应用在算术运算&#xff0c;还可应用于迭代器&#xff0c;因为很多迭代器并不支持算术运算。 递增和递减运算符有两种书写形式&#xff1a…

网络爬虫原理:探秘数字世界的信息猎手

欢迎来到这个关于网络爬虫原理的小小冒险之旅&#xff01;今天&#xff0c;我们将揭开数字世界的面纱&#xff0c;深入了解那些神秘的程序&#xff0c;它们如何在互联网的海洋中搜寻并捕获有用的信息。如果你对计算机世界的奥秘充满好奇&#xff0c;那么跟着我一起走进这个让人…

MicroPython核心:编写测试

在进行MicroPython移植的过程中&#xff0c;需要对目标开发板进行全面的测试&#xff0c;MicroPython中的测试位于 tests/ 路径下。下面列出了关键目录和run-tests.py 运行脚本&#xff1a; .├── basics├── extmod├── float├── micropython├── run-tests.py...…

河南嘉家购商贸有限公司获绿色积分信用认证

“实现绿色产业、打造完善的绿色产业链、走可持续发展共创共赢”。近日&#xff0c;河南嘉家购商贸有限公司获得绿色积分认证&#xff0c;确认了该企业在绿色消费积分领域的领先地位。 据了解&#xff0c;河南嘉家购商贸有限公司始终将绿色积分视为企业发展的核心要素。全面优化…

如何实现无公网ip远程访问本地websocket服务端【内网穿透】

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

G1与ZGC

G1垃圾收集器(-XX:UseG1GC)详解 G1(Garbage-First)是一款面向服务器的垃圾收集器&#xff0c;主要针对配备多颗处理器及大容量内存的机器。以极高概率满足GC停顿时间要求的同时&#xff0c;还具备高吞吐量性能特性。 G1把内存区域划分为小格子(Region)&#xff0c;最多可以有2…

java常见的面试问题

目录 一、异常 1、 throw 和 throws 的区别&#xff1f; 2、 final、finally、finalize 有什么区别&#xff1f; 3、try-catch-finally 中哪个部分可以省略&#xff1f; 4、try-catch-finally 中&#xff0c;如果 catch 中 return 了&#xff0c;finally 还会执行吗&#…

大创项目推荐 题目:垃圾邮件(短信)分类 算法实现 机器学习 深度学习 开题

文章目录 1 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器学习的垃圾邮件分类 该项目…