当前位置: 首页 > news >正文

探索C嘎嘎的奇妙世界:第三关---缺省参数与函数重载

        在c语言中,我们常常在对有参函数进行传参,这样的繁琐过程,C++祖师爷对此进行了相关改进,多说无益,上干货:

1 缺省参数:

        缺省参数是指在声明或定义函数时为函数的形参指定一个默认值(默认参数)。在调用该函数时,如果没有指定实参,则采用该形参的缺省值;否则使用指定的实参。缺省参数主要分为两种类型:全缺省参数半缺省参数

1.1 全缺省参数:       

        全缺省参数是指函数的所有参数都具有默认值。以下是一个全缺省参数的示例代码:

// 全缺省
void F2(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}int main()
{F2(1, 2, 3);F2(1, 2);F2(1);F2();return 0;
}

        在上述代码中,我们会发现,有所不同的是在形参的位置上,我们给予了赋值,这样写又什么作用呢?唉~这样写当我们在调用的时候,少给参数的时候,编译器也不会报错,会自动给上默认值.同时也可以多种方式调用函数了.比如在上述代码中:F2(1,2,3)这样的调用时,上面形参的默认值就不会起作用了,而当我们F2(1,2)这样传参的时候,也不会报错,这是编译器会把a和b的值变为,1和2,而c的值就使用我们给的默认参数进行赋值30.同理可以去理解后两个调用,也可以一个都不传哦,这样形参用的全是我们所给的默认值.

1.2 半缺省参数:

        半缺省参数是指从右往左连续地为函数的部分参数提供默认值。以下是一个半缺省参数的示例代码:

// 半缺省,从右往左缺省
void F3(int a, int b = 20 , int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}int main()
{F3(1);F3(1, 2);F3(1, 2, 3);
}

        在上述代码中,我们只是缺省了b和c,同样可以进行赋值,但是这时我们就不能一个参数也不传了,因为这时我们如果一个都不传的话,这时a是没有默认值的,编译器就会报错,半缺省参数必须从右往左依次提供默认值,不能间隔着给。为什么呢?请看下面的代码:

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

        这时我们这样给默认值的时候,用F3(1,2)进行传参时,2可以赋值给c,但是这个1会赋值给谁呢?是a还是b呢?这是编译器就会存在歧义,就会报错喽,所以,我们平时在写半缺省参数的时候,应该极为注意.细心使用~

1.3 缺省参数的注意事项:

注意:

使用缺省参数可以提高代码的灵活性和可读性,减少函数调用时的参数传递数量。但需要注意以下几点:

1. 半缺省参数必须 从右往左依次 来给出,不能间隔着给
2. 缺省参数不能在函数声明和定义中同时出现,如果要给,只能在声明的时候给缺省值
3. 缺省值必须是常量或者全局变量
4. C 语言不支持(编译器不支持)
5. 如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该
用那个缺省值。
6.缺省参数在后续的使用中尤为重要,尤其是数据结构中.

2 函数重载:

        在C语言中,不支持重名函数存在,这就让一些程序很麻烦,比如要写一个整形数据的交换和浮点数的交换就不行,那么C++祖师爷就改进了这一点---函数重载

        在同一作用域内,可以有多个具有相同函数名但参数列表不同(参数的类型、个数或顺序不同)的函数。这些函数就被称为重载函数

        那么具体什么是重载函数呢?请看代码:

namespace bit1
{void Swap(int* pa, int* pb){cout << "void Swap(int* pa, int* pb)" << endl;}
}namespace bit2
{void Swap(int* px, int* py){cout << "void Swap(int* pa, int* pb)" << endl;}
}

        这样的两个函数构不构成重载呢?

        显然它们在不同的命名空间中,不符合重载函数中的属于同一作用域这一条件,所以上述两个函数不构成函数重载.让我们来看一下另一个示例:

        

namespace bit1
{void Swap(int* pa, int* pb){cout << "void Swap(int* pa, int* pb)" << endl;}
}namespace bit2
{void Swap(int* px, int* py){cout << "void Swap(int* pa, int* pb)" << endl;}
}using namespace bit1;
using namespace bit2;

        如果把它们两个的命名空间展开,是否构成函数重载呢?

        显然也是不构成重载的,因为"using namespace"只是把他们展开供全局可以使用这两个命名空间中的成员,并不意味着它们合并同一个作用域,所以还是不符合重载函数中的属于同一作用域这一条件,不构成函数重载,那么怎么才能构成呢?请看正确示例:

2.1 类型一:参数类型不同:

void Swap(int* pa, int* pb)
{cout << "void Swap(int* pa, int* pb)" << endl;
}void Swap(double* pa, double* pb)
{cout << "void Swap(double* pa, double* pb)" << endl;
}

        上述代码就满足了重载函数的条件:参数类型不同.可以看到上述代码中,形参的类型不同,一个是int,一个是double,当然还可以写其他类型等等等...这样就可以使函数的功能变得更加丰富!

2.2 类型二:参数个数不同:

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

        在上述代码中:显而易见这两个函数的参数个数不同,第一个函数无参,第二个函数有一个整形参数a,可以构成重载函数.

2.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 a,char b),第二个函数参数是(char b,int a)这样也是可以构成函数重载的哦~

2.4 函数重载的注意事项:

1. 参数类型必须不同:重载的函数之间参数的类型要有明显区别,不能仅通过可隐式转换的类型差异来重载。
2. 参数个数不同:这是常见的重载方式之一。
3. 参数顺序不同:也可以作为重载的依据,但要注意使用时的清晰性。
4. 不能仅靠返回值不同来重载:因为调用时通常不关心返回值来确定调用哪个重载函数。
5. 作用域要明确:确保重载的函数都在同一个合理的作用域内,避免混淆。
6. 避免过度重载:过多的重载可能导致代码复杂难以理解和维护。
7. 注意歧义:确保参数的组合不会导致调用时产生歧义,编译器能明确地选择正确的重载函数。
8. 考虑可读性:重载函数的命名和功能设计要符合逻辑,便于其他开发者理解和使用。

3 C++支持函数重载的原理---名字修饰原则:(选看)

为什么C++ 支持函数重载,而 C 语言不支持函数重载呢?
这是因为 C/C++ 中,一个程序要运行起来,需要经历以下几个阶段: 预处理、编译、汇编、链接
1. 实际项目通常是由多个头文件和多个源文件构成,而通过 C 语言阶段学习的编译链接,我们
可以知道,【当前 a.cpp 中调用了 b.cpp 中定义的 Add 函数时】,编译后链接前, a.o 的目标
文件中没有 Add 的函数地址,因为 Add 是在 b.cpp 中定义的,所以 Add 的地址在 b.o 中。那么
怎么办呢?
2. 所以链接阶段就是专门处理这种问题, 链接器看到 a.o 调用 Add ,但是没有 Add 的地址,就
会到 b.o 的符号表中找 Add 的地址,然后链接到一起 ( 老师要带同学们回顾一下 )
3. 那么链接时,面对 Add 函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的
函数名修饰规则。
4. 由于 Windows vs 的修饰规则过于复杂,而 Linux g++ 的修饰规则简单易懂,下面我们使
用了 g++ 演示了这个修饰后的名字。
5. 通过下面我们可以看出 gcc 的函数修饰后名字不变。而 g++ 的函数修饰后变成【 _Z+ 函数长度
+ 函数名 + 类型首字母】。
结论: linux 下,采用 gcc 编译完成后,函数名字的修饰没有发生改变。 采用 C++ 编译器编译后结果.
结论: linux 下,采用 g++ 编译完成后,函数名字的修饰发生改变,编译器将函数参 数类型信息添加到修改后的名字中。
Windows 下名字修饰规则:
对比 Linux 会发现, windows vs 编译器对函数名字修饰规则相对复杂难懂 ,但道理都
是类似的,我们就不做细致的研究了。
6. 通过这里就理解了 C 语言没办法支持重载,因为同名函数没办法区分。而 C++ 是通过函数修
饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载
7. 如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办
法区分。
        到此有关缺省参数和函数重载的只是就讲解到这啦~希望这篇博客能给您带来一些启发和思考!那我们下次再一起探险喽,欢迎在评论区进行讨论~~~

相关文章:

探索C嘎嘎的奇妙世界:第三关---缺省参数与函数重载

在c语言中,我们常常在对有参函数进行传参,这样的繁琐过程,C祖师爷对此进行了相关改进,多说无益,上干货: 1 缺省参数: 缺省参数是指在声明或定义函数时为函数的形参指定一个默认值&#xff08;默认参数&#xff09;。在调用该函数时&#xff0c;如果没有指定实参&#xff0c;则…...

docker拉取镜像太慢解决方案

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 创建daemon.json文件,输入以下信息 vim /etc/docker/daemon.json{"registry-mirrors": ["https://9cpn8tt6.mirror…...

仅凭一图,即刻定位,AI图像定位技术

AI图像定位技术&#xff0c;解锁空间密码&#xff01;仅凭一图&#xff0c;即刻定位&#xff0c;精准至经纬度坐标&#xff0c;让世界无处不晓。 试试看能否猜中这张自拍照的背景所在&#xff1f;可别低估了A的眼力&#xff0c;答案说不定会让你大吃一惊呢。 近期&#xff0c;…...

跟着刘二大人学pytorch(第---12---节课之RNN基础篇)

文章目录 0 前言0.1 课程视频链接&#xff1a;0.2 课件下载地址&#xff1a; 1 Basic RNN1.1 复习DNN和CNN1.2 直观认识RNN1.3 RNN Cell的内部计算方式 2 具体什么是一个RNN&#xff1f;3 使用pytorch构造一个RNN3.1 手动构造一个RNN Cell来实现RNN3.2 直接使用torch中现有的RN…...

父亲节 | 10位名家笔下的父亲,读懂那份孤独而深沉的父爱

Fathers Day 母爱如水&#xff0c;父爱如山。 相对于母爱的温柔&#xff0c;父亲的爱多了几分静默和深沉。 读完10位名家笔下的父亲&#xff0c;我们就会明白&#xff0c;到底亏欠了父亲多少。 不要让自己有“子欲养而亲不待”的后悔和遗憾&#xff0c; 多给父亲一些爱的表示&a…...

股市中的牛市和熊市是什么?它们是怎么来的?

中文版 股市中的牛市和熊市 定义 牛市&#xff1a; 牛市指的是金融市场中证券价格普遍上升或预期上升的时期。这个术语最常用于股票市场&#xff0c;但也可以适用于交易的其他资产&#xff0c;如债券、货币和商品。特征&#xff1a; 投资者信心增加。交易量上升。积极的经济指…...

基于51单片机万年历设计—显示温度农历

基于51单片机万年历设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 本系统采用单片机DS1302时钟芯片LCD1602液晶18b20温度传感器按键蜂鸣器设计而成。 1.可以显示年月日、时分秒、星期、温度值。…...

springboot-自定义properties文件

在springboot中&#xff0c;如果我们想加载外部的配置文件&#xff0c;但是又不想与其他的配置文件产生明显的耦合&#xff0c;那么我们可以把这些配置文件&#xff0c;单独弄成一个独立的配置文件&#xff0c;比如下面的配置文件&#xff0c;我们想把这些配置移动到user.prope…...

java类的访问权限

在java中&#xff0c;针对类&#xff0c;成员方法和属性&#xff0c;java提供了4种访问控制权限&#xff0c;分别是private,default,protected和public。 这四种访问控制权限按级别由低到高的次序排列分别是privae,default,protected,public private:私有访问权限&#xff0c…...

【SpringBoot + Vue 尚庭公寓实战】标签和配套管理接口实现接口实现(六)

【SpringBoot Vue 尚庭公寓实战】标签和配套管理接口实现接口实现&#xff08;六&#xff09; 文章目录 【SpringBoot Vue 尚庭公寓实战】标签和配套管理接口实现接口实现&#xff08;六&#xff09;1、保存或更新标签信息2、根据id删除标签信息3、根据类型查询配套列表4、新…...

Web前端中横线:深入探索与实际应用

Web前端中横线&#xff1a;深入探索与实际应用 在Web前端开发的广袤领域中&#xff0c;中横线这一看似简单的元素&#xff0c;实则蕴含着丰富的设计哲学和技术实现。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;对中横线在Web前端中的应用进行深入剖析&#x…...

鸿蒙 游戏来了 鸿蒙版 五子棋来了 我不允许你不会

团队介绍 作者:徐庆 团队:坚果派 公众号:“大前端之旅” 润开鸿生态技术专家,华为HDE,CSDN博客专家,CSDN超级个体,CSDN特邀嘉宾,InfoQ签约作者,OpenHarmony布道师,电子发烧友专家博客,51CTO博客专家,擅长HarmonyOS/OpenHarmony应用开发、熟悉服务卡片开发。欢迎合…...

国产MCU芯片(2):东软MCU概览及触控MCU

前言: 国产芯片替代的一个主战场之一就是mcu,可以说很多国内芯片设计公司都打算或者已经在设计甚至有了一款或多款的量产产品了,这也是国际大背景决定的。过去的家电市场、过去的汽车电子市场,的确国产芯片的身影不是很常见,如今不同了,很多fabless投身这个行业,一种是…...

气膜馆的保温措施—轻空间

气膜馆是一种新型的建筑形式&#xff0c;广泛应用于体育场馆、仓储、展览等多个领域。其主要特点是通过气体压力支撑膜结构&#xff0c;实现大跨度无柱空间。为了保证气膜馆在不同气候条件下的使用舒适性和能源效率&#xff0c;保温措施至关重要。以下是气膜馆常见的保温措施及…...

UniVue更新日志:使用Carousel组件实现轮播图效果

github仓库 稳定版本仓库&#xff1a;https://github.com/Avalon712/UniVue 开发版本仓库&#xff1a;https://github.com/Avalon712/UniVue-Develop UniVue扩展框架-UniVue源生成器仓库&#xff1a;https://github.com/Avalon712/UniVue-SourceGenerator 更新说明 今天的更…...

docker和docker compose 部署

一. 将微服务运行在docker上&#xff1a; 1.新建一个空文件夹docker-demo&#xff0c;在里面再新建文件夹app&#xff0c;在app目录下新建一个名为Dockerfile的文件。 2.编写Dockerfile文件 3.构建镜像 4.启动镜像 5.可以访问了。 二使用Dockerfile构建微服务镜像 1.将j…...

鸿蒙轻内核A核源码分析系列六 MMU协处理器(2)

3、MMU汇编代码 在arch\arm\arm\include\arm.h文件中&#xff0c;封装了CP15协处理器相关的寄存器操作汇编函数。我们主要看下MMU相关的部分。 3.1 CP15 C2 TTBR转换表基地址寄存器 代码比较简单&#xff0c;结合下图&#xff0c;自行查看即可。该图来自《ARM Cortex-A9 Tec…...

C# 集合(一) —— Array类

总目录 C# 语法总目录 集合一 Array 集合1. Array 类1.1 搜索1.2 排序1.3 翻转1.4 转换 集合 1. Array 类 //创建方式 //方式一 Array arr Array.CreateInstance(typeof(string), 3); arr.SetValue("lisi", 0); arr.SetValue("zhangsan", 1); arr.SetVa…...

World Map Globe Edition 2

只需点击几下,World Political Map - Globe Edition 2就会在场景添加一个美丽且交互式的3D世界地图。将地球预制件拖动到场景中并自定义外观。 完整的资产,具有强大的可视化功能、示例和丰富的API,适用于构建VR、桌面和移动游戏和应用程序。 主要功能: - 在不访问互联网的情…...

人类重启计划---19500630

一、引言 随着人类社会的发展,我们面临着诸多全球性挑战,如气候变化、资源匮乏、疾病爆发等。为了应对这些挑战,确保人类的生存和发展,我们提出人类重启计划。该计划旨在建立一个可持续、安全和繁荣的新世界。 二、目标 建立可持续发展的社会经济模式,确保资源的有效利用…...

苹果WWDC 2024 带来的 AI 风暴:从生产力工具到个人助理,AI 将如何融入我们的生活?

2024年6月5日&#xff0c;苹果WWDC 2024全球开发者大会如约而至&#xff0c;带来了众多令人兴奋的新功能和新产品。其中&#xff0c;AI 技术的全面融入无疑是最引人注目的亮点。从 iOS、iPadOS 到 macOS&#xff0c;再到 Siri 和开发者工具&#xff0c;苹果正在将 AI 融入到其生…...

SE语法总结博文(附思维导图)

Java中的规范 注释 //单行注释 /*多行注释 */ /**文档注释 */命名规范 命名时可以包含&#xff1a;字母、数字以及 下划线和 $ 符号等等。 但是不能以数字开头&#xff0c;也不能是关键字&#xff0c;且严格区分大小写。 类名&#xff1a;每个单词的首字母大写(大驼峰)&…...

STM32面试题

STM32面试题通常涉及STM32微控制器的特性、功能、应用以及编程知识。以下是一些可能的面试问题: STM32微控制器的基本介绍: STM32微控制器是由哪家公司生产的?STM32微控制器主要应用于哪些领域?STM32的特性和功能: STM32微控制器有哪些主要特性?请描述STM32的GPIO(通用输…...

【单片机】DS2431芯片,读写128个字节,程序

ds2431pt&r stm32读写程序&#xff1a; 部分程序&#xff1a; #include "sys.h" #include "delay.h" #include "usart.h"#include <stdio.h> #include <stdlib.h> #include <string.h>#include "sys.h" #incl…...

[DDR4] DDR 简史

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR4》 存和硬盘&#xff0c;这对电脑的左膀右臂&#xff0c;共同扛起了存储的重任。内存以其超凡的存取速度闻名&#xff0c;但一旦断电&#xff0c;内存中的数据也会消失。它就像我们的工作桌面&…...

前端 CSS 经典:在 Vue3 中使用渐进式图片

1. 什么是渐进式图片 当我们网站会加载很多图片的时候&#xff0c;有些图片尺寸很大&#xff0c;加载就会很慢&#xff0c;会导致页面长时间陷入白屏状态&#xff0c;用户体验很不好。所以可以使用渐进式图片&#xff0c;先给用户展示模糊图&#xff0c;这些图尺寸小&#xff…...

毕业了校园卡怎么改套餐?

毕业了校园卡怎么改套餐&#xff1f; 毕业生校园卡99元套餐变更8元保号套餐教程 学弟学妹们恭喜毕业呀&#x1f393; 校园卡绑定了好多东西注销不掉又不想交高额月租的看过来。 今天一招教你更改校园卡套餐。 中国移动/电信/联通App 打开App&#xff0c;在首页右上角点击人工…...

每一个男人都曾有一个机器人的梦想

每一个男人都曾有一个机器人的梦想 我也有 每一个男人都曾有一个机器人的梦想。对于我来说&#xff0c;这个梦想始于童年时代&#xff0c;那时变形金刚风靡一时&#xff0c;几乎所有80后的孩子都为之疯狂。我是80后中的一员&#xff0c;那时候的科技还远没有如今这般发达&#…...

中望CAD 2025 (ZW3D2025) 简体中文修改版

名称&#xff1a;中望CAD 2025 (ZW3D2025) 简体中文修改版 描述&#xff1a;一款三维CAD设计工具&#xff0c;运行破解补丁ZW3D2025-2024-Patch执行修补。 链接&#xff1a;夸克网盘分享 &#x1f4c1; 大小&#xff1a;3.2GB &#x1f3f7; 标签&#xff1a;#PC软件 #CAD #设…...

CAN 通讯

波特率 波特率&#xff08;Baud Rate&#xff09;是指数据通信中每秒传输的符号&#xff08;或脉冲&#xff09;的数量。在CAN&#xff08;Controller Area Network&#xff09;通信中&#xff0c;波特率通常表示每秒传输的位数&#xff08;bit per second&#xff0c;bps&…...

wordpress 修改表前缀/网站seo推广优化教程

Saavedro再论TOEFL-iBT阅读做题方法论 (附上TPO19第一篇阅读题目详细分析)最近看见版上的考生们在对TPO19阅读部分喊难不止。我私下调查和询问了下各位现任 版主和正在准备考试的考生们,大家对TPO和真实托福考试的描述都是越来越难。尤其 是现阶段的托福考试几乎难度呈现指数型…...

外贸公司没网站/网络培训网站

在mybatis的mapper.xml和mapper文件映射时&#xff0c;注意返回为空的情况 这里写成对象不要写成int...

怎么做创意短视频网站/在哪里可以免费自学seo课程

目录1 训练集测试集的划分以及模型评估1.1 测试集是训练集的一部分1.2 训练集和测试集不相交2 评估指标2.1 回归准确率linear accuracy2.2 模型错误指标3 复合回归模型3.1 复合回归模型的例子3.2 复合回归预测连续值3.3 问答1 训练集测试集的划分以及模型评估 训练集和测试集的…...

忻州网站建设网站推广/微信搜一搜seo优化

1. 简介 对于cocos2dx的分辨率方案原来一知半解&#xff0c;终于今天有机会给搞清楚了。在cocos2d-x中的几种分辨率&#xff1a; 1.1 Framebuffer分辨率&#xff08;其大小依赖于硬件设备&#xff09; 保存在EGLViewProtocol类的Size _screenSize; 在nativeactivity.cpp的coco…...

网站如何做吸引人的项目/汕头seo托管

书上的代码已完全不可参考&#xff0c;只好按知识点从网上查资料一个一个实例 了。 <!DOCTYPE html> <html> <head><title>ExtJs</title><meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><link…...

有人做几个蝎子养殖门户网站/指数函数图像及性质

今天我很烦&#xff0c;昨天网站有问题&#xff0c;上午提交&#xff0c;下午恢复。今天一早又没了&#xff0c;说是没缴费的问题&#xff0c;打了无数客服电话非说是我的域名有问题&#xff0c;哦赛&#xff0c;真麻烦啊。本来想再置办一个&#xff0c;想想真是怕了&#xff0…...