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

 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.mzph.cn/diannao/11442.shtml

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

相关文章

【Linux学习笔记】一篇文章彻底搞定“Linux生产者与消费者“!

本章重点 1.生产者消费者模型2.posix信号量&#xff0c;以及读写锁。3. 理解基于读写锁的读者写者问题。 一. 生产者消费者模型 为何要使用生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯&#xff0…

专业音频修复软件:iZotope RX 11 for Mac 激活版

iZotope RX 专为满足后期制作专业人士的苛刻需求而设计的一款专业音频修复软件。iZotope RX 10添加了新的特性和功能&#xff0c;以解决当今后期项目中存在的一些最常见的修复问题&#xff0c;使其成为音频后期制作的最终选择。虽然包含许多其他新功能&#xff0c;但这里是新的…

微信小程序的设计与实现

微信小程序的设计与实现 目录 1.系统简述&#xff1a; 2.开发工具及相关技术&#xff1a; 2.1 HTML、WXSS、JAVASCRIPT技术 2.2 Vanilla框架 2.3 uni-app框架 2.4 MYSQL数据库 3.工程结构及其说明&#xff1a; 4.主要功能展示 4.1登录 4.2 注册 4.3 首页…

【C++11】C++11类与模板语法的完善

目录 一&#xff0c;新的类功能 1-1&#xff0c;默认成员函数 1-2&#xff0c;强制生成关键字 二&#xff0c;可变参数模板 2-1&#xff0c;模板参数包 2-3&#xff0c;模板参数包的实际运用 2-2&#xff0c;STL容器empalce的相关接口 三&#xff0c;模板参数包和empla…

002.反应式编程的必要性

在实际应用程序中&#xff0c;您可以在许多情况下发现可能的时变变量—例如&#xff0c;GPS位置、温度、鼠标坐标&#xff0c;甚至文本框的内容。所有这些都有一个随时间变化的值应用程序会发生反应&#xff0c;因此是时变的。还有一点值得一提时间本身就是一个时变;它的值一直…

Unicode字符集和UTF编码

文章目录 前言一、字符集和编码方式二、unicode字符集utf32编码utf8编码utf8编码函数示例utf8解码函数示例 utf16编码utf16编码解码函数示例 总结 前言 本文详细介绍 u n i c o d e unicode unicode 字符集和其相关的三种编码方式&#xff1a; u t f 8 utf8 utf8&#xff0c;…

华为认证存储HCIE有用吗?

首先&#xff0c;对于个人来说&#xff0c;获得华为存储认证可以证明其具备信息存储技术的专业能力 1.专业认可&#xff1a;获得华为存储认证&#xff0c;尤其是HCIE-Storage级别的证书&#xff0c;意味着持有者对信息存储技术有着全面深入的理解&#xff0c;能够设计、部署、…

JPA@Entry报错Could not determine recommended JdbcType for Java type

问题很明显&#xff0c;无法自动决定类型&#xff0c;那就手动告诉该字段。 一、直接上解决方案 如果是一对一的关系用 OneToOne 如果是一对多的关系用 OneToMany 如果是多对一的关系用 ManyToOne 二、另一个无空构造函数的问题 使用注解后&#xff0c;注解报错找不到空的…

实训八:使用jQuery技术实现企业信息展示系统的相关功能

实训八:使用jQuery技术实现企业信息展示系统的相关功能 1.题目 使用jQuery技术实现企业信息展示系统的相关功能。 2.目的 (1)掌握jQuery的基本知识。 (2)掌握jQuery的应用方法。 (3)进一步理解Ajax程序的设计方法。 (4)会利用所学知识设计简单的应用程序。 3.内容 用jQuery技术…

【SpringBoot记录】从基本使用案例入手了解SpringBoot-数据访问-更改DataSource(2)

前言 通过上一个数据访问基本案例成功可以发现&#xff0c;SpringBoot在数据访问案例中也做了许多自动配置&#xff0c;上节只分析了其中的Properties。 而在自动配置包的jdbc下 还有其他配置文件。 根据名称可以大致了解他们的作用&#xff1a; DataSourceAutoConfiguration…

如何8步完成hadoop单机安装

前言 Hadoop是一个开源框架&#xff0c;用于存储和处理大规模数据集。 系统要求 Ubuntu 20.044GB&#xff08;建议8GB&#xff09;hadoop-3.3.6 步骤1&#xff1a;更新系统 打开终端并输入以下命令来更新您的系统&#xff1a; apt update 步骤2&#xff1a;安装Java Had…

uniapp 使用renderjs的一些详细介绍

一、简介 官方链接&#xff1a;uniapp官网中的renderjs方法的详细介绍 二、renderjs 定义 renderjs是一个运行在视图层的js。它比WXS更加强大。它只支持app-vue和web。 作用&#xff1a; 大幅降低逻辑层和视图层的通讯损耗&#xff0c;提供高性能视图交互能力。在视图层操作d…

.Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 发布到 Win7+

.Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 实测可以完整运行在 win7sp1/win10/win11. 如果用其他工具打包,还可以运行在mac/linux下, 传送门BlazorHybrid 发布为无依赖包方式 安装 WebView2Runtime 1.57 MB或136 MB 测试DEMO 发布为依赖包方式 安装 WebView2Runtime 1.…

python Pandas 操作

Pandas 介绍 Pandas 是一个功能强大的 Python 数据分析工具库&#xff0c;常用于数据处理与分析工作。它为 Python 提供了快速、灵活以及表达能力强的数据结构&#xff0c;旨在简化“实际工作中”的数据操作&#xff0c;使得 Python 成为一种强大而高效的数据分析环境。 核心特…

抱怨无用,行动破局

故事的开始 这个专栏&#xff0c;以及本文的目的&#xff0c;是为了记录我从创立盘多啦这个平台开始&#xff0c;到后续的发展历程的专栏。同时也是给自己一个坚持的动力和警醒的作用。 首先&#xff0c;我是一名程序员&#xff0c;并且对于自身感兴趣的东西&#xff0c;都有…

【仅1月出刊】普刊广涉计算机、社科、教育、法学等多领域!

【欧亚科睿学术】 1 EURASIA JOURNAL OF SCIENCE AND TECHNOLOGY 终审周期 仅1月出刊&#xff08;知网收录&#xff09; 《欧亚科学技术杂志》 Print ISSN&#xff1a;2663-1024 Online ISSN&#xff1a;2663-1016 出版社&#xff1a;UPUBSCIENCE 【简介】本刊致力于传播…

【C语言】指针(一)

目录 一、内存 1.1 ❥ 理解内存和地址的关系 1.2 ❥ 编址 二、指针变量 2.1 ❥ 取地址操作符&#xff08;&&#xff09; 2.2 ❥ 指针变量和解引用操作符&#xff08;*&#xff09; 2.3 ❥ 指针变量的大小 三、指针类型的意义 3.1 ❥ 指针的解引用 3.2 ❥ 指针-整数 3…

PCIE协议-2-事务层规范-TLP Prefix Rules

2.2.10 TLP前缀规则 以下规则适用于任何包含TLP前缀的TLP&#xff1a; 对于任何TLP&#xff0c;TLP中byte0的Fmt[2:0]字段中的值100b表示存在TLP前缀&#xff0c;并且Type[4]位指示TLP前缀的类型。 Type[4]位中的值0b表示存在本地TLP前缀。Type[4]位中的值1b表示存在端到端TL…

R语言数据分析案例-巴西固体燃料排放量预测与分析

1 背景 自18世纪中叶以来&#xff0c;由于快速城市化、人口增长和技术发展&#xff0c;导致一氧化二氮&#xff08;N2O&#xff09;、 甲烷&#xff08;CH4&#xff09;和二氧化碳&#xff08;CO 2&#xff09;等温室气体浓度急剧上升&#xff0c;引发了全球变暖、海平面上 升…