缺省参数-函数重载

news2024/11/20 15:25:59

缺省参数

缺省参数是声明或定义函数时为函数的参数指定一个默认值

有什么用?

更加灵活的增加默认值,或者手动给一个初始值,解决了C语言#define给死一个值的缺陷,C语言无法做到缺省参数这么灵活

struct Stack
{
	int* a;
	int top;
	int capacity;
};

//void StackInit(Stack* ps)
//{
//	ps->a = (int*)malloc(sizeof(int) * 4);
//	ps->capacity = 4;
//	ps->top = 0;
//}

//如果一开始明确知道要开辟100个,那么需要扩容
//如何更灵活控制初始空间?利用缺省参数

void StackInit(Stack* ps,int DefaultCapacity = 4)
{
	ps->a = (int*)malloc(sizeof(int) * DefaultCapacity);
	if (ps->a == NULL)
	{
		perror("malloc fail");
		return;
	}
	ps->capacity = DefaultCapacity;
	ps->top = 0;
}

int main()
{
	Stack st;
	StackInit(&st, 100);
	// 插入100个数据

	StackInit(&st);
	// 不知道要插入多少数据 StackInit(&st);-> StackInit(&st2, 4);
	return 0;
}

C喜欢玩的方式
#define DEFAULT_CAPACITY 100
void StackInit(struct Stack* pst)
{
pst->a = (int*)malloc(sizeof(int) * DEFAULT_CAPACITY);
if (pst->a == NULL)
{
perror(“malloc fail”);
return;
}

pst->top = 0;
pst->capacity = DEFAULT_CAPACITY;
}

使用注意

是否可以定义和声明同时出现?
否,不明确到底用哪个。

如果缺省单独出现在定义时,在编译时就会报错,编译时检查语法就会发现你少给了一个参数
在这里插入图片描述

在这里插入图片描述
所以需要再声明时给出缺省参数,定义不能给,定义不关心是否缺省
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

函数重载

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

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

编译链接过程

在这里插入图片描述
反汇编发现调用函数的call和jump到对应的地址
然而编译期间 拿不到函数定义所在的地址 只有声明的地址,更像是只得到了一个承诺
链接时 符号表合并和重定位 找到定义(兑现承诺)
并且如果直接在.c文件中定义函数,那么就不需要链接步骤了,在编译阶段就可以拿到函数定义地址
在这里插入图片描述

在这里插入图片描述

两次函数地址不一样,因为调试了2次,懒得改上面的图了

在这里插入图片描述
总体流程
在这里插入图片描述

发现C++ 两个重载函数StackPush()具有不同的地址,是因为函数名修饰规则

函数名修饰规则

从g++角度看,链接时
c++的函数名修饰区分了重载函数,不论是StackPush还是func的重载都可以区分
修饰名的规则拿<_Z4funci>来看 — int func(int a)
_Z是前缀
4是函数名个数,i是int的缩写

另一个是<_Z4funcid> — int func(int a,double d)
也就是int 和 double的缩写

c++的函数名修饰把形参类型的缩写带进来了,与返回值无关
这也是为什么返回值不同不构成重载的原因

在这里插入图片描述
在这里插入图片描述

C为什么不支持

在这里插入图片描述

C比较直接,上面两个蓝框里面的名字直接用的函数名,并没有C++的函数名修饰,所以如果有2个同名函数,就不确定是哪个,无论参数是否相同。
C不支持重载,再编译时 就报错,没法写2个同名函数,所以只用gcc来看一个函数调用时用的函数名
在这里插入图片描述
可以看到直接使用func,无法区分同名函数,所以不支持重载

编译器把函数返回值也带进函数名修饰规则能否实现重载呢?

也是不行的。
在这里插入图片描述
即使更改了函数名修饰规则,带入返回值,只是解决链接时找的问题
但是在编译时无法确定Func()调用哪一个函数,返回值在调用时无法体现

是不是所有函数都要链接

如果直接在.c文件中定义函数,那么就不需要链接步骤了,在编译阶段就可以拿到函数定义地址(直接兑现)

有问题的函数重载情况

情况一

 /*1、是否构成重载 -- 构成
 2、问题。无参调用存在歧义*/
void f()
{
	cout << "f()" << endl;
}

void f(int a = 0)
{
	cout << "f(int a)" << endl;
}

int main()
{
	f(); // “f”: 对重载函数的调用不明确

	return 0;
}

情况二

在这里插入图片描述

int Func();
double Func();

int main()
{
	Func(); // 调用歧义

	return 0;
}

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

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

相关文章

北邮22信通:(13)第三章 3.4 串的实现 KMP算法

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 上一篇文章&#xff1a; 下一篇文章&#xff1a; ***说明*** 1.本代码结合书上第二章线性表和4.3.3KMP算法结合书写。 2.加快匹配速度的根本原因&#xff1…

行业分析| 新的学习方式——在线自习室

互联网技术在快速革新中不断推动新应用、新场景、新模式和新业态的发展融通&#xff0c;如近年来不断催生的游戏直播、直播带货、户外直播等网络生态。随着互联网用户逐年增多&#xff0c;年轻化趋势明显&#xff0c;互联网直播内容逐渐向生活化、日常化拓展&#xff0c;加之“…

Linux 防火墙常用命令

目录 前文叙述 Linux 找不到 firewall 命令 firewalld 常用管理命令 firewall-cmd 常用命令参数说明 前文叙述 Linux 防火墙默认为开启状态&#xff0c;生产环境下 Linux 防火墙也肯定是开启状态。因此在生产环境下往往是开放特定端口让外部进行连接使用。 Linux 找不到 fir…

数字化时代,企业为什么越来越重视数据分析

自数据成为第五大生产要素后&#xff0c;其价值得到了越来越多企业的认可&#xff0c;也成为了各行各业企业的重要的资产。而信息化建设在企业中的发展更是给了数据增长的机会&#xff0c;随着业务信息系统在企业中成为基础建设&#xff0c;众多企业都通过业务系统沉淀了大量业…

JSP的基本使用总结

JSP的基本使用总结 &#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在…

海睿思分享 | 风控监管,守住企业生命线

1 企业如何应对市场风险 随着市场形势日益严峻&#xff0c;企业风险系数也在同步增加&#xff0c;一旦风险管理出现重大问题&#xff0c;将是致命的、灾难性的&#xff0c;可能导致企业出现生存危机。 风控监管的主要目的在于通过对各类风险进行识别、分析、监控&#xff0c…

【java web篇】MyBatis之Mapper代理

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

MacOS版本RedisDesktopManager源码编译

1. 克隆 : git clone --recursive https://github.com/RedisInsight/RedisDesktopManager.git 查看依赖模块: git submodule 编译注意事件,部分源码的子仓库依赖没有下载完整的,要手动下载 brotli子模块 编译brotli子模块 $ mkdir out && cd out $ ../configure-c…

助力春耕:数智驱动现代农业高质量发展

最近有部很有意思的综艺《种地吧&#xff01;少年》&#xff0c;节目内容就是十个少年要用192天的时间在142亩土地上&#xff0c;完成抢收水稻&#xff0c;抢种小麦&#xff0c;并在6月份完成小麦的收割&#xff0c;这样一个内容。 这个节目没有流量明星&#xff0c;而被吸引去…

MyBatis(十六)MyBatis使用PageHelper

一、limit分页 mysql的limit后面两个数字&#xff1a; 第一个数字&#xff1a;startIndex&#xff08;起始下标。下标从0开始。&#xff09; 第二个数字&#xff1a;pageSize&#xff08;每页显示的记录条数&#xff09; 假设已知页码pageNum&#xff0c;还有每页显示的记录…

K8s集群搭建-Kubeadm方式搭建集群【1.23.0版本】

文章目录 一、初始化准备二、安装kubeadm三、初始化Master集群四、将新的Node节点加入集群五、部署CNI网络插件六、其他配置 Kubernetes1.24(包括1.24)之后不在兼容docker,如果有需要兼容docker的需求&#xff0c;则安装一个 cri-docker的插件&#xff0c;本文使用的是kuberne…

【技巧】如何在微信与企业微信端实现自动化ChatGPT智能机器人服务?(WorkTool)

场景描述 对于使用企业微信办公协作的公司/团体/组织等&#xff0c;在工作的时候&#xff0c;经常需要通过群机器人的方式&#xff0c;回答群内成员的问题。 基于此&#xff0c;一些企业想要将ChatGPT的智能对话能力与企业微信群机器人的回复能力结合&#xff0c;在企业微信群…

VMware Site Recovery Manager 8.7 (for vSphere 8 U1) - 数据中心灾难恢复 (DR)

请访问原文链接&#xff1a;https://sysin.org/blog/vmware-srm-8/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Site Recovery Manager 8.7 | 18 APR 2023 | Build 21590800 什么是 Site Recovery Manager (SRM)&#xff1…

【网络安全】CVE漏洞分析以及复现

漏洞详情 Shiro 在路径控制的时候&#xff0c;未能对传入的 url 编码进行 decode 解码&#xff0c;导致攻击者可以绕过过滤器&#xff0c;访问被过滤的路径。 漏洞影响版本 Shiro 1.0.0-incubating 对应 Maven Repo 里面也有 【一一帮助安全学习&#xff0c;所有资源获取一…

GrapeCity Documents for Imaging

GrapeCity Documents for Imaging 现在可以使用高斯模糊效果在整个输入图像或部分图像上基于高斯函数创建模糊。 在GcBitmap类中添加了IsBlackAndWhite和IsGrayscale。这些方法可以更快地检查图像是由黑白像素组成还是仅由灰度组成。 IsBlackAndWhite方法检查所有图像像素是不透…

回炉重造八--系统启动和内核管理

系统启动和内核管理 1、系统启动 1.1 centos7启动的过程 UEFI或BIOS初始化&#xff0c;运行post开机自检选择启动的设备&#xff08;USB、硬盘、本地光盘&#xff09;引导装载程序&#xff0c;centos7是给grub2加载装载程序的配置文件&#xff1a; /etc/grub.d/ /etc/default…

使用 Amazon Step Functions 和 Amazon Athena 实现简易大数据编排

很多公司都在亚马逊云上围绕 Amazon S3 实现了自己的数据湖。数据湖的建设涉及到数据摄入、清洗、转换&#xff0c;以及呈现等多个步骤&#xff0c;还需要对这些步骤进行编排&#xff0c;这对很多人手不足或者初识数据湖的团队形成了挑战。 在本篇文章中&#xff0c;我将介绍一…

可以一口气读完的算法书

算法&#xff01;Algorithms&#xff01; 咳咳&#xff01;很多人一听到这个词&#xff0c;估计脑袋就要炸了&#xff1a;一定又是复杂极了的东西&#xff0c;看来此书必定翻不过第一节&#xff0c;就要睡着了。 没错&#xff0c;很多算法书虽然写得很精妙&#xff0c;但凭我…

【OpenLayers】VUE+OpenLayers+ElementUI加载WMS地图服务

【OpenLayers】VUEOpenLayersElementUI加载WMS地图服务 准备工作安装vue创建vue项目安装OpenLayers安装ElementUI加载wms地图服务 准备工作 需要安装好nodejs&#xff0c;nodejs下载地址&#xff0c;下载对应的版本向导式安装即可。 安装完成后&#xff0c;控制台输入node -v…

OAID解密场景和对应策略,淘宝订单解密接口,淘宝订单明文接口

OAID解密场景和对应策略 场景编码 场景名称 返回的隐私字段 1001 顺丰电子面单发货 消费者手机号&#xff0c;姓名&#xff0c;详细地址 1002 4通一达电子面单发货 消费者手机号&#xff0c;姓名&#xff0c;详细地址 1003 EMS电子面单发货 消费者手机号&#xff0c…