C++函数重载的简单介绍

news2024/11/24 11:01:10

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++之路】
在这里插入图片描述

中华文化博大精深,我们知道在我们的汉语中,每个词语都有着其不同的含义,甚至是一个词语中有多个含义,我们把它称之为一词多义。比如说加油一词,我们可以理解为给汽车加油,当然也可以在小伙伴进行运动会比赛时给我们的小伙伴喊加油,所以加油在不用的情形却有着不一样的含义。在C++中,也会有类似的现象—重载函数

目录

  • 重载函数概念
    • 参数类型不同
    • 参数个数不同
    • 参数顺序不同

重载函数概念

重载函数:是函数的一种特殊情况,在C++中允许同一作用域中声明一个功能类似的同名函数。这些同名函数的形参列表(参数个数或类型或类型顺序)不同。一般用来处理功能类似但数据类型不同的问题。说白了就是一个函数有多个意思

还是来进行举例:

#include<iostream>
using namespace std;

int Add(int left, int right)
{
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}

double Add(double left, double right)
{
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}

int main()
{
	cout << Add(10, 20) << endl;
	cout << Add(10.10, 20.20) << endl;
	return 0;
}

在这里插入图片描述
要注意一个点:构不构成重载对函数的返回值没有任何要求,比如:
在这里插入图片描述
我们可以看到当返回值不同是不会构成重载。上面定义的同名函数的函数名虽然相同但是参数不同,既然上图不构成重载函数的话当然就不能编译通过了,所以就会报错即仅仅是函数的返回值不同的话是不构成函数重载的。而参数不同主要分为三种类型的参数不同:参数个数、参数类型、参数顺序。上面演示的是参数类型不同,同时再次强调函数重载对函数的返回值是没有要求的(比如两个函数的函数相同,参数也相同,但是函数的返回值不同,此时这两个函数是不构成函数重载的)。所有对于构成函数重载的话一定是函数的参数(分为三种)不同。

参数类型不同

参数类型不同的话我们刚刚已经看到了,即int Add(int left, int right)和double Add(double left, double right)就属于参数类型不同的情况,这里构成重载。现在我们来看看当函数的类型不同时会不会构成函数重载:

int Add(int left, int right)
{
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}

double Add(double left, double right)
{
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}

在这里插入图片描述

参数个数不同

参数个数不同的情况如下:

void func()
{
	cout << "func()" << endl;
}

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

我们来看看什么当一个参数也不传的时候运行起来会怎么样:
在这里插入图片描述
在来看看传一个参数时又会是怎么样呢?请看:
在这里插入图片描述
这里当参数个数不同时也会构成函数重载,这里很好理解,就不过多赘述了。

参数顺序不同

我们现在来看看当函数的参数顺序不同时是否会构成函数重载。

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

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

上图算不算构成函数重载呢?不妨我们来运行一下:
在这里插入图片描述
呵呵,好可惜,编译器直接给我们报错了,那到底时什么原因导致编译器给我们报错呢?我们现在知道参数顺序不同时可以进行构成函数重载。好了,重点来了:上图代码中我们对两个函数中参数类型的顺序是没有发生改变的,我们改变的仅仅是函数参数的名字的顺序而已。所以如果我们仅仅是改变函数参数的名字的顺序的话,这里是不构成函数重载的,仔细观察我们可以看到。我们可以想一想如果我们真的传参给这个同名函数的形参的话,我们应该调用哪一个函数呢(由于函数参数类型的顺序是一样的,所以编译器不知道我们要调用哪一个函数,所以就报错了,说白了就是存在歧义,编译器不知道该调用哪个函数了)。所以这就会给我们的编译器带来很大的麻烦。那到底是怎样的函数顺序不同才可以构成函数重载呢?事实上只有函数参数的类型顺序不同才可以构成函数重载。
既然我们现在知道只有函数参数的类型发生顺序不同的时候才会构成函数重载,
下面我们就来正式的看看函数参数类型的顺序是不同的时候,是如何构成函数重载的,请看下面代码:

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

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

我们在这里可以清楚的看到上面代码中两个函数的参数类型的顺序是不一样的,运行结果如下:
在这里插入图片描述
所以这才是函数参数类型的顺序发生改变是构成的函数重载。
现在我们在来看一看下面的代码是否会构成函数重载呢?

#include<iostream>
using namespace std;

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

void func(int a = 0)
{
	cout << "func(int a,char b)" << endl;
}
int main()
{
	//func('a', 1);
	//func(2, 'b');
	func();
	return 0;
}

首先:

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

void func(int a = 0)
{
	cout << "func(int a,char b)" << endl;
}

这段代码中的函数的确构成了函数重载,但是与此同时存在这一个潜在的问题,那就是当我们无参函数的时候会出现问题,请看:
在这里插入图片描述
问题就出现在无参调用的时候会出现问题,即编译器(出现歧义)会进行报错,编译器不知道我们要调用哪个函数(不明确的调用),即如上图所示。

好了,以上就是对C++中函数重载的简单认识。
就到这里吧,再见啦各位!!!

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

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

相关文章

毫米波雷达将被颠覆?楚航科技发布隐形雷达ART

4月19日上海车展现场&#xff0c;楚航科技首次对外展示最新的前瞻性研发第N代创新产品——隐形雷达ART。 楚航科技本次发布的科技隐形雷达ART&#xff0c;打破一体式封装设计&#xff0c;重新定义车载毫米波雷达物理形态&#xff0c;为行业提供全新的颠覆性产品设计新路线。 资…

LeetCode 1000. Minimum Cost to Merge Stones【记忆化搜索,动态规划,数组】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

【C++类和对象】类和对象(中):析构函数 {析构函数的概念及特性,编译器自动生成的析构函数,构造析构的顺序}

三、析构函数 3.1 概念 通过前面构造函数的学习&#xff0c;我们知道一个对象是怎么来的&#xff0c;那一个对象又是怎么没呢的&#xff1f; 析构函数&#xff1a;与构造函数功能相反&#xff0c;析构函数不是完成对对象本身的销毁&#xff0c;局部对象随函数栈帧的销毁而销毁…

chatGpt自动写文章-chatGpt自动写文章软件

怎么用GPT写文章 使用GPT写文章需要按照以下步骤进行&#xff1a; 确定文章主题&#xff1a;首先需要明确文章的主题&#xff0c;这有助于GPT更好地了解你想要表达的内容&#xff0c;并生成更有针对性的文本。 准备开头和结尾&#xff1a;根据文章主题&#xff0c;准备好文章开…

【参考文献不爆红】Word的多个参考文献连续交叉引用([1] [3]改为[1-3])

文章目录 1. 参考文献格式2. 引入参考文献3. Word的多个参考文献连续交叉引用&#xff08;[1] [3]改为[1-3]&#xff09;3.1引入两个参考文献3.2 引入三个参考文献3.3 知识科普 1. 参考文献格式 参考教程 全选参考文献–>编号的小三角–>自定义编号&#xff0c;修改为[]…

PostMan笔记(三)自动化测试

1. 简介 Postman是一款功能强大的API开发工具&#xff0c;也是一款流行的自动化测试工具。它提供了多种测试功能&#xff0c;包括测试脚本、预请求脚本和测试集合等。 1.1 测试脚本 测试脚本是Postman中用于自动化测试的核心部分。它可以使用JavaScript语言编写&#xff0c;…

使用VScode编写C语言程序 环境安装配置 保姆级教程

Visual Studio Code可通过安装插件来支持C、C#、Python、PHP等语言&#xff0c;使用的工程师越来越多&#xff0c;本文介绍如何使用VS Code进行C语言的编译与调试 目录 一 vsCode配置C/C环境 1. vsCode下载和安装 2. 安装vsCode 二 MinGW编译器下载和配置 1. 下载编译器M…

c++积累8-右值引用、移动语义

1、右值引用 1.1 背景 c98中的引用很常见&#xff0c;就是给变量取个别名&#xff0c;具体可以参考c积累7 在c11中&#xff0c;增加了右值引用的概念&#xff0c;所以c98中的引用都称为左值引用 1.2 定义 右值引用就是给右值取个名字&#xff0c;右值有了名字之后就成了普通…

【达摩院OpenVI】基于流感知的视频目标检测网络LongShortNet

论文&代码 论文链接&#xff1a;[arxiv]代码&应用&#xff1a; 开源代码&#xff1a;[github code]开源应用&#xff1a;[modelscope] 背景介绍 传统视频目标检测&#xff08;Video Object Detection, VOD&#xff09;任务以一段视频作为输入&#xff0c;利用视频的…

项目上线|慕尚集团携手盖雅工场,用数字化推动人效持续提升

过去十年&#xff0c;中国零售业以前所未有的速度被颠覆、被重塑&#xff0c;数字化则是其中重要的推动要素。 随着数字化转型的深入&#xff0c;零售企业的数字化不再局限于布局线上渠道&#xff0c;且更关乎其背后企业核心运营能力的全链路数字化改造。而贯穿于运营全链路的…

mybatis缓存的详细理解和使用

mybatis缓存的简单理解和使用 mybatis缓存数据的介绍 缓存是存在于内存中的临时数据&#xff0c;使用缓存的目的是减少和数据库的数据进行交互的次数&#xff0c;提高执行效率。像很多持久化框架一样&#xff0c;Mybatis也提供了缓存策略&#xff0c;通过缓存策略来减少数据库…

RflySim平台使用篇 | Coptersim系列教程(三)

# 导读 # CopterSim作为RflySim平台核心仿真软件&#xff0c;其主要实现两部分功能&#xff1a;模型和通信&#xff0c;掌握CopterSim使用方法即可轻松运行多旋翼运动动态模型&#xff0c;并连同其他软件构成软/硬件在环仿真。本篇教程将详细介绍coptersim仿真log数据获取。 Co…

webpack plugin源码解析(六) CompressionWebpackPlugin

文章目录 作用涉及 webpack API处理 asset 钩子compilation.hooks.processAssets返回或新建缓存&#xff1a;compilation.getCache返回 asset 文件信息&#xff1a;compilation.getAsset文件名匹配函数&#xff1a;compiler.webpack.ModuleFilenameHelpers.matchObject模版字符…

科研热点|8本期刊被剔除SCIE,4月最新SCIE/SSCI目录已更新 (附下载)~

2023年4月18日&#xff0c;科睿唯安更新了Web of Science核心期刊目录&#xff0c;此次更新后SCIE期刊目录共包含9505本期刊&#xff0c;SSCI期刊目录共包含3557本期刊。此次4月SCIE & SSCI期刊目录更新&#xff0c;与3月更新相比 (警惕&#xff01;多达50本SCI/SSCI被剔除…

Kafka中时间轮分析与Java实现

仿kafka实现java版时间轮_java实现时间轮算法_Hekliu的博客-CSDN博客 https://www.cnblogs.com/softlin/p/7426083.html https://blog.csdn.net/happyjacob/article/details/128518700 一、背景 在Kafka中应用了大量的延迟操作但在Kafka中 并没用使用JDK自带的Timer或是Dela…

m3u8转mp4下载,有URL,IV

1、背景 在线m3u8现在是主流加密方式的视频。 2、下载m3u8视频难点 首先需要连接m3u8文件格式,这个自行百度,其次加密方式确定和key以及iv。如果没有加密直接找一个在线的m3u8转mp4就可以,但是问题就是很多带加密,而且key不是m3m8中key URL返回的数据,市面上软件无法直…

基于matlab评估机场监控雷达上 5G 新无线电 (NR) 信号的干扰

一、前言 随着5G NR系统的频率范围超出LTE中使用的频段&#xff0c;频谱管理变得更加复杂。对扩大5G覆盖范围的需求是由更高的数据速率和更低的延迟的好处推动的。新5G基站的实施反过来又推动了了解这些信号如何影响在相同频段上运行的已安装系统的需求。其中一个系统是空中交通…

类对象

一、类初识 类&#xff1a;表示一种事物所具有的共同特征和行为 对象&#xff1a;一个类的实例 如下图&#xff0c;通过狗这个类进行详解 这是一个Dog类 对象&#xff1a;斗牛犬、小猎犬、牧羊犬 类中的属性&#xff1a;breed(品种)、size(大小)、color(颜色)、age(年龄)、 …

OpenCv基础之绘图及几何变换实例

文章目录 OpenCv基础之绘图及几何变换实例创建背景图线段绘制矩形绘制圆绘制椭圆绘制绘制多边形添加文字 几何变换图像平移图像缩放图像旋转仿射变换透视变化 OpenCv基础之绘图及几何变换实例 绘图在图像处理中&#xff0c;主要是在处理完图像后&#xff0c;将图像中的目标进行…

Python算法设计 - 哈夫曼编码

目录 一、哈夫曼树二、哈夫曼编码三、Python算法实现四、作者Info 一、哈夫曼树 上图是根据“this is an example of a huffman tree”中得到的字母频率来建构的哈夫曼树 二、哈夫曼编码 多年来&#xff0c;哈夫曼编码在统计数据压缩方面是非常先进的&#xff0c;应当指出&am…