C++——缺省参数与重载函数

news2024/10/4 0:23:12

 fe594ea5bf754ddbb223a54d8fb1e7bc.gif

目录

​前言

一.缺省参数

1.1缺省参数概念

1.2缺省参数分类

注意事项:

二.函数重载

2.1函数重载概念

2.2c++支持函数重载原理——命名修饰


8fb442646f144d8daecdd2b61ec78ecd.png前言

本篇文章主要讲述c++中有关于缺少参数与函数重载的相关概念与实例,以下是本人拙见,如有错误敬请指教。

一.缺省参数

1.1缺省参数概念

缺省参数就是声明和定义函数时为函数的参数指定一个缺省值

简而言之就是应对没有传实参时的一种保底手段,若没有传实参缺省参数就会用自己的初始化数值,传实参则用实参的值忽略缺省值。

#include <iostream>
using namespace std;
void fun(int a = 0)
{
	cout << a << endl;
}

int main()
{
	int a = 1;
	fun();
	fun(a);
	return 0;
}

1.2缺省参数分类

  • 全缺省参数

顾名思义,对所有形参进行初始化

void fun(int a = 0,int b = 0,int c= 0)
{
	cout << a << b << c << endl;
}
int main()
{
	int a = 1;
	int b = 2;
	int c = 3;
	fun();
	fun(a, b, c);
	return 0;
}

  • 半缺省参数

对一部分形参进行初始化

void fun(int a, int b = 0, int c = 0)
{
	cout << a << b << c << endl;
}
int main()
{
	int a = 1;
	int b = 2;
	int c = 3;
	fun(a,b);
	fun(a, b, c);
	return 0;
}

注意事项:

  •  半缺省参数必须从右往左依次给出,不能间隔着给

如果是从左往右给出,那么会出现以下两种情况:

为了确保形参C能够接受到数值必须占用一个实参,那么1的指向反而乱套了无论是给a还是b都可以。

而从右往左就不会出现这种情况。这里就像是五线谱,实参与形参的位置顺序都是一一对应的。

  • 缺省参数不能在声明和定义中同时出现 (只能在声明中用)
//a.h
void fun(int a = 1);

//a.cpp
void fun(int a = 2)
{

}

这样编译器无法确定该用哪个值

  • 缺省值必须是全局变量或常量
  • C语言不支持

二.函数重载

2.1函数重载概念

即在同一作用域下——功能类似的同名函数(参数个数、类型、类型顺序不同),通俗点就是一词多义

//参数类型不同
int fun1(int a, int b)
{
	cout << "fun1(int a,int b)" << endl;
	return a + b;
}

double fun1(double a, double b)
{
	cout << "fun1(double a,double b)" << endl;
	return a + b;
}

//参数个数不同
void fun2()
{
	cout << "fun2()" << endl;
}

void fun2(int a)
{
	cout << "fun2(int a)" << endl;
}

//类型顺序不同
void fun3(int a, char b)
{
	cout << "fun3(int a,char b)" << endl;
}

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


int main()
{
	fun1(10,20);
	fun1(10.1, 20.2);

	fun2();
	fun2(10);

	fun3(10, 'a');
	fun3('a',10);

	return 0;
}

上述例子可以看到在有多个同名函数的情况下,编译器会根据参数个数、类型、类型顺序 进行相应的匹配。

不过当我们所用的实参对应不到相关的同名函数时就会报错。

确实是可以隐式转换,问题是int转double还是double转int呢?所以有时候存在多个重载函数时反而会有歧义。这时候只要去掉其中一个重载就可以隐式转换了。

我们再结合缺省参数时不传实参的重载函数也会发生歧义,编译器也不知道要调用哪个重载函数了,这种情况也需要注意。 

函数重载有利有弊吧,方便的同时也是要付出一些代价的~

2.2c++支持函数重载原理——命名修饰

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

  1. 预处理:生成Fun.i与Test.i文件,其中前者包含声明与定义,而后者只有Fun.h声明没有定义。
  2. 编译:生成Fun.s与Test.s文件,其中由main函数进行调用相关函数,但由于Test.i中的main函数只包含声明并没有定义,这意味着call不到地址,在这种情况下编译器只能先对照声明是否匹配,就算声明匹配成功这也只能算是个承诺先放你到下一阶段,最后还是要查地址的。
  3. 汇编:生成Fun.o与Test.o文件
  4. 链接:合并到一起并解决无法确定函数地址的问题,由于c语言在该阶段会生成一个符号表,可以在此去寻找函数名字与地址进一步验证之前的承诺。但c++不同,它不会生成符号表,而是有一套独特的命名规则。

归根结底就是在编译的时候c与c++都一样会有无法直接找到地址的问题,只不过最后在链接的时候双方的处理方式不同,c语言靠符号表,而c++靠独特的函数命名修饰原则。

这是在linux环境下由gcc编译完成的命名修饰样例。

当然我们不用这么去细究这些,只需要知道函数重载中是c++特有的即可。

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

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

相关文章

文件夹重命名高效批量技巧:轻松实现在文件夹名称左边添加关键字

在日常工作和生活中&#xff0c;我们经常需要对大量的文件夹进行重命名&#xff0c;以便更好地组织和管理文件。然而&#xff0c;手动一个接一个地修改文件夹名称既费时又费力。幸运的是&#xff0c;有一些高效的批量重命名技巧可以帮助我们快速实现这一目标&#xff0c;特别是…

算法学习笔记(3)-差分

#差分 差分和前缀和互为逆运算&#xff1a; 给定一个原数组s&#xff0c;差分数组h&#xff0c;两者的关系如下所示&#xff1a; s[i] h[1] h[2] h[3] …… h[i] 针对于上面的公式&#xff0c;由差分数组h推导而来 h[1] s[1] h[2] s[2] - s[1] h[3] s[3] - [2] …… h[…

vue前端时间段选择控件

实现效果: 可选具体的某天的某时某分某秒 vue前端代码: <el-form-item label"日期"><el-date-pickerv-model"daterangerq"style"width: 240px"value-format"yyyy-MM-dd HH:mm:ss"type"datetimerange"range-separat…

Spring,SpringMVC,SpringBoot知识总结

1.简述Spring,SpringMVC&#xff0c;SpringBoot各自特点及联系 Spring、Spring MVC 和 Spring Boot 是 Java 开发中常用的三个框架&#xff0c;它们之间有以下关系&#xff1a; Spring&#xff1a;是一个全功能的 JavaEE 应用程序框架。它提供了一系列的解决方案&#xff0c…

【管理咨询宝藏99】离散制造智能工厂战略规划方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏99】离散制造智能工厂战略规划方案 【格式】PDF版本 【关键词】智能制造、先进制造业转型、数字化转型 【核心观点】 - 推进EHS、品质一致性、生…

通配符证书260元

通配符SSL证书是一种特殊的数字证书&#xff0c;可以保护域名以及该域名下的所有子域名。不论是个人开发者还是企业开发者&#xff0c;只需要购买一个通配符SSL证书&#xff0c;就可以为多个子域名提供传输数据加密服务&#xff0c;降低了多子域名网站开发者购买SSL证书的成本。…

ArcGIS水文水环境数据编辑、管理、处理与分析;ArcGIS水文分析及流域特征提取;湖泊水库水环境监测及评价;河道水污染预测与水环境容量计算等案例实践

目录 专题一 ArcGIS&#xff1a;数据管理 专题二 ArcGIS&#xff1a;数据转换 专题三 ArcGIS&#xff1a;地图制作 专题四 水文水环境数据编辑与管理 专题五 水文水环境数据处理与分析 专题六 ArcGIS水文分析及流域特征提取 专题七 湖泊水库水环境监测及评价 专题八 河…

redis服务连接及常规操作和redis服务getshell

简介 Redis&#xff0c;英文全称是Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 redis服务于传统服务器不同&…

flink尚硅谷

flink 1 flink基础使用1.1 角色1.2 部署模式&#xff08;抽象&#xff09;1.2.1 会话模式1.2.2 单作业模式1.2.3 应用模式 1.3 运行模式&#xff08;实际 谁来管理资源&#xff09;1.3.1 Stand alone1.3.2 YARN运行模式&#xff08;重点&#xff09; 2. 运行时架构2.1 系统架构…

程序员如何避免35岁危机?

所谓的“35岁危机”通常是指在职业生涯中遇到的一个挑战阶段&#xff0c;这个概念在不同行业和个人中有不同的体现。对于程序员来说&#xff0c;这可能与技术更新迅速、工作强度大、职业发展路径的不确定性等因素有关。 以下是一些建议&#xff0c;帮助程序员避免或缓解这一危机…

三丰云免费虚拟主机与免费云服务器评测

三丰云是一家知名的云计算服务提供商&#xff0c;提供免费虚拟主机和免费云服务器的服务。今天我们就来为大家介绍一下三丰云的免费虚拟主机和免费云服务器的使用体验。首先&#xff0c;让我们来看看三丰云的免费虚拟主机服务。三丰云的免费虚拟主机提供了稳定可靠的空间和带宽…

智能优化算法 | Matlab实现KOA开普勒优化算法(内含完整源码)

智能优化算法 | Matlab实现KOA开普勒优化算法(内含完整源码) 文章目录 智能优化算法 | Matlab实现KOA开普勒优化算法(内含完整源码)文章概述源码设计文章概述 智能优化算法 | Matlab实现KOA开普勒优化算法(内含完整源码) 源码设计 %% clear all clc N=25; % Number of s…

【Java】:方法重写、动态绑定和多态

目录 一个生动形象的例子 场景设定 1. 方法重写&#xff08;Method Overriding&#xff09; 2. 动态绑定&#xff08;Dynamic Binding&#xff09; 3. 多态&#xff08;Polymorphism&#xff09; 归纳关系&#xff1a; 重写 概念 条件 重写的示例 重载与重写的区别 …

【必看】Spring系列面试题

Spring Core Container, AOP, Data Access, Web... 基础 1. 简单介绍Spring 一款开源的轻量级 Java 开发框架&#xff0c;旨在提高开发人员的开发效率以及系统的可维护性。Spring 支持 IoC&#xff08;Inversion of Control:控制反转&#xff09; 和 AOP(Aspect-Oriented Pro…

【JVM类加载机制】深度剖析JVM类加载机制

深度剖析JVM类加载机制 前言类加载运行全过程loadClass的类加载过程 类加载器和双亲委派机制类加载器的类型类加载器的初始化过程双亲委派机制为什么要设置双亲委派机制&#xff1f;全盘负责委托机制自定义类加载器实例打破双亲委派机制Tomcat打破双亲委派机制Tomcat自定义加载…

[华为OD]BFS C卷 200 智能驾驶

题目&#xff1a; 有一辆汽车需要从m*n的地图的左上角(起点)开往地图的右下角(终点)&#xff0c;去往每一个地区都需 要消耗一定的油量&#xff0c;加油站可进行加油 请你计算汽车确保从起点到达终点时所需的最少初始油量说明&#xff1a; (1)智能汽车可以上下左右四个方向…

Python中的`__init__.py`文件:它的作用和重要性

引言 在Python的世界里&#xff0c;__init__.py文件是一个特殊的存在。对于初学者来说&#xff0c;它可能看起来有些神秘&#xff0c;但对于理解Python的包和模块系统来说&#xff0c;它起着至关重要的作用。本文将详细解释__init__.py文件的功能、它在Python项目中的作用&…

Threejs实现PMD模型眨眼说话等功能

上个章节通过加载PMD模型和VMD的动作播放MMD的动画&#xff0c;这节通过js控制让模型实现眨眼&#xff0c;说话。我们还是拿上个模型来操作&#xff0c;首先是创建好Threejs的场景&#xff0c;包括灯光&#xff0c;相机&#xff0c;渲染器等。 initScene(){this.scene new THR…

【Linux】Centos7安装部署unimrcp,搭建MRCP服务器

yum install libtool yum install libtool-ltdl-devel yum install libsofia-sip-ua find / -name libsofia-sip-ua.so.0 2>/dev/null # 设置环境变量&#xff1a;如果库文件存在但不在默认搜索路径中&#xff0c;你可以通过设置 LD_LIBRARY_PATH 环境变量来告诉系统在哪…

语音转文字服务的调用接口

语音转文字&#xff08;Speech-to-Text&#xff0c;STT&#xff09;技术允许将口语化的语音转换成书面文字。以下是一些提供语音转文字服务的调用接口及其特点。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.讯飞开放平台语音转写…