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++特有的即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用matplotlib和KNeighborsClassifier进行机器学习和预测数据

代码&#xff1a; # 声明 # -*- coding: utf-8 -*- """ Created on Mon May 13 12:16:01 2024author: admin """ # 导入库 import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np # 下面是两个机器学习的库 from sklea…

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

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

U盘打不开无法使用

我一个U盘通过window无法识别了&#xff0c;属性也打不开&#xff1b; 我这时候通过挂载U盘到我的centos虚拟机上&#xff0c;打开后&#xff0c;将其挂载 如有需要备份其中的文件 fdisk -L blkid mount /dev/sdc4 /UP cp -r /UP /opt/ umout /UP mkfs.xfs -f /dev/sdc4…

AXI Interconnect IP核的连接模式简介

AXI Interconnect IP核内部包含一个 Crossbar IP核&#xff0c;用于在 Slave Interfaces&#xff08;SI&#xff09;和 Master Interfaces&#xff08;MI&#xff09;之间路由传输。在连接 SI 或 MI 到 Crossbar 的每条路径上&#xff0c;可以选择性地添加一系列 AXI Infrastru…

一图看懂git merge和git rebase的区别!!

一图看懂git merge和git rebase的区别&#xff01;&#xff01; Git 是一个非常流行的版本控制系统&#xff0c;它帮助开发者管理代码的不同版本。在 Git 中&#xff0c;merge 和 rebase 是两种常用的将不同分支的更改合并到一起的方法&#xff0c;但它们在处理方式和结果上有…

一篇教你python网页自动化

一篇教你python网页自动化 网页自动化 一篇教你python网页自动化[TOC](网页自动化) 前言一、安装Python&#xff1f;二、安装Selenium库&#xff1a;1.下载WebDriver&#xff1a;2.第二部分&#xff1a;基本网页操作 三、元素定位与操作&#xff1a;图文演示获取选择器写的一个…

百面算法工程师 | 正则优化函数——BN、LN、Dropout

本文给大家带来的百面算法工程师是正则优化函数&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们将总结一些BN、LN、Dropout的相关知识&#xff0c;并提供参考的回答及其理论基础&#xff0c;以…

探秘原子写:为数据完整性再加一分!

对存储设备来说&#xff0c;确保数据的准确记录和读取是其核心使命。鉴于NAND Flash独特的工作原理&#xff0c;当数据需要更新时&#xff0c;SSD往往会将新的数据直接存储到空白的PBA物理块地址上&#xff0c;随后建立LBA逻辑块地址与PBA的映射关系&#xff0c;并将LBA原先指向…

2024中国(重庆)VR/AR科技展8月举办

2024中国(重庆)VR/AR科技展8月举办 邀请函 主办单位&#xff1a; 中国航空学会 重庆市南岸区人民政府 招商执行单位&#xff1a; 重庆港华展览有限公司 展会背景&#xff1a; 2024中国航空科普大会暨第八届全国青少年无人机大赛在重庆举办&#xff0c;同时举办第二届中国…

Jupyter配置

一、修改Jupyter打开界面 &#xff08;1&#xff09;打开【Anaconda Prompt】&#xff0c;输入【jupyter notebook --generate-config】命令 从运行结果可知【jupyter_notebook_config.py】的位置 &#xff08;2&#xff09;使用【记事本】打开 找到# c.NotebookApp.noteb…

【Qt】之【CMake】Error : The source.. does not match the soused

QT中cmak编译出现CMake Error: The source… does not match the soused 分析 前提是该项目是从另一个路径的项目复制过来的&#xff0c;编写代码时发现无论怎样修改代码&#xff0c;运行后都没有任何变化&#xff0c;以为是qtbug&#xff0c;重构重启都没用&#xff0c;最后…

【多电压流程 Multivoltage Flow】- 5.特定工具使用建议(5.使用ICC II以及FC进行物理实现)

使用IC Compiler II和Fusion Compiler进行物理实现 在完成带有行站点、电源规划和I/O放置的floorplan之后,可以继续进行物理综合和实现。Fusion Compiler提供了广泛的功能,以执行设计的平面物理实现。 图67显示了物理实现流程的一般步骤以及流程的低功耗支持特性。 图67 I…

PCL PolygonMesh数据结构

目录 一、函数源码二、主要函数三、读写数据四、代码案例五、结果展示六、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的GPT爬虫。 一、函数源码 #pragma once

Android Studio高版本安卓模拟器抓取https包

Android Studio avd 设置 证书生成 *.cer格式证书​ openssl x509 -inform DER -subject\_hash\_old -in charles-ssl-proxying-certificate.cer​ *.pem格式证书​ openssl x509 -inform PEM -subject\_hash\_old -in charles-ssl-proxying-certificate.pem会输出 2cb30a9e …

二叉树的四种遍历代码实现

二叉树的遍历大致能分为以下几种 1.前序&#xff1a;根 左 右 2.中序&#xff1a;左 根 右 3.后序&#xff1a;左 右 根 4.层序&#xff1a;从根开始一层一层的向下 如上图访问顺序: 前序&#xff1a;1 2 3 N N N 4 5 N N 6 N N 中序&#xff1a;N 3 N 2 N 1 N 5 N 4 N …

小成本大保障:中小企业的数据安全解决方案

在经营预算有限的情况下&#xff0c;中小企业面临着保障数据安全的巨大挑战。数据泄露不仅会导致财务损失&#xff0c;还会损害企业声誉&#xff0c;甚至可能违反数据保护法规。以下是一些成本效益高、实施简便的数据安全解决方案&#xff0c;帮助中小企业在小成本下实现大保障…

【爬虫】爬取股票历史K线数据写入数据库(三)

前几天有写过两篇&#xff1a; 【爬虫】爬取A股数据写入数据库&#xff08;二&#xff09; 【爬虫】爬取A股数据写入数据库&#xff08;一&#xff09; 现在继续完善&#xff0c;分析及爬取股票的历史K线数据通过ORM形式批量写入数据库。 2024/05&#xff0c;本文主要内容如下…

十五、Redis缓存常见问题

Redis作为最常用的缓存中间件&#xff0c;在使用过程中&#xff0c;必然会遇到过&#xff1b;**缓存穿透、缓存雪崩、缓存击穿。**这三个可以说是Redis缓存使用过程中&#xff0c;最常见的问题&#xff0c;且也是面试中最常闻到的问题。1、缓存穿透 **缓存穿透&#xff1a;**是…

【手势操作-复习前一天的内容-预习今天的内容 Objective-C语言】

一、昨天呢,我们学习的是这个,事件 1.事件这一块儿呢,iOS事件,分为三大类, 1)触摸事件 2)加速计事件 3)远程控制事件 2.这个里边呢,我们主要学习的是这个触摸事件,触摸事件里边,就是Touch,touchesBegan:方法里边,有一个touches参数,它是set类型的, 3.Set,…

启动项目时出现SELinux is preventing

问题描述 启动项目时出现SELinux is preventing**** SELinux正在阻止systemd对文件AB.sevice进行读取访问。 我的是启zabbix是报该错&#xff1a; 最终解决方案 方法一&#xff1a;暂时禁用SELinux setenforce 0 方法二&#xff1a;禁用SELinux 在配置文件/etc/sysconfig/…