【C++】函数重载
🦄个人主页:修修修也
🎏所属专栏:C++
⚙️操作环境:Visual Studio 2022

目录
📌函数重载的定义
📌函数重载的三种类型
🎏参数个数不同
🎏参数类型不同
🎏参数类型顺序不同
📌重载函数调用歧义
📌函数重载的原理
结语
📌函数重载的定义
重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。不能只有函数返回值类型不同。
📌函数重载的三种类型
两个重载函数必须在下列一个或多个方面有所区别:
- 函数的参数个数不同。
- 函数的参数类型不同。
- 参数类型顺序不同。
C++的这种编程机制给编程者极大的方便,不需要为功能相似、参数不同的函数选用不同的函数名,也增强了程序的可读性。
C++运算符重载的相关规定如下:
- 不能改变运算符的优先级;
- 不能改变运算符的结合型;
- 默认参数不能和重载的运算符一起使用;
- 不能改变运算符的操作数的个数;
- 不能创建新的运算符,只有已有运算符可以被重载;
- 运算符作用于C++内部提供的数据类型时,原来含义保持不变。
下面我们举几个函数重载的例子:
🎏参数个数不同
如下,我们创建两个同名函数f(),其中第一个函数不需要参数,第二个函数需要一个整形作为参数,因为这两个函数参数个数不同,因此构成函数重载:
#include<iostream> using namespace std;// 1、参数个数不同 void f() {cout << "f()" << endl; } void f(int a) {cout << "f(int a)=" << a <<endl; }int main() {f();f(10);return 0; }
在主函数中调用f()函数,但给它们传不同的参数,运行程序,查看结果:
可以看到,因为在主函数调用f()函数时,我们分别给f()函数传0个参数和一个整形参数,因为构成函数重载,所以这两条语句分别调用执行了不同的函数.
🎏参数类型不同
如下,我们创建两个同名函数Add(),其中第一个函数需要两个整形作为参数,第二个函数需要两个双精度浮点数作为参数,因为这两个函数参数类型不同,因此构成函数重载:
#include<iostream> using namespace std;// 2、参数类型不同 int Add(int left, int right) {cout << "int Add(int left, int right)=" << left+right << endl;return left + right; } double Add(double left, double right) {cout << "double Add(double left, double right)=" << left + right << endl;return left + right; }int main() {Add(10, 20);Add(10.1, 20.2);return 0; }
在主函数中调用Add()函数,但给它们传不同的参数,运行程序,查看结果:
可以看到,因为在主函数调用Add()函数时,我们分别给Add()函数传两个整形参数和两个双精度浮点型做为参数,因为构成函数重载,所以这两条语句分别调用执行了不同的函数.
🎏参数类型顺序不同
如下,我们创建两个同名函数f(),其中第一个函数第一个参数是整形,第二个参数是字符型,第二个函数第一个参数是字符型,第二个参数是整形,因为这两个函数参数类型顺序不同,因此构成函数重载:
#include<iostream> using namespace std;// 3、参数类型顺序不同 void f(int a, char b) {cout << "f(int a,char b) = " << a << b << endl; } void f(char b, int a) {cout << "f(char b,int a) = " << b << a << endl; } int main() {f(10, 'a');f('a', 10);return 0; }
在主函数中调用f()函数,但给它们传不同的参数,运行程序,查看结果:
可以看到,因为在主函数调用f()函数时,我们分别给f()函数传第一个参数是整形,第二个参数是字符型以及第一个参数是字符型,第二个参数是整形做为参数,因为构成函数重载,所以这两条语句分别调用执行了不同的函数.
📌重载函数调用歧义
在之前,我们一起学习过C++中缺省参数的概念:【C++】缺省参数(默认参数),而在使用缺省参数构成重载函数时,要特别注意其是否会引起以下函数调用歧义的情况:
#include<iostream> using namespace std;//重载缺省参数函数调用歧义 void f() {cout << "f()" << endl; } void f(int a = 10) {cout << "f(int a)=" << a <<endl; } int main() {f();return 0; }当我们仅仅是构建上述两个函数而不调用它们时,这两个函数确实是构成函数重载的,如下,编译是可以正常通过的:
而当我们一旦像下面这样调用函数时,则会导致其出现函数调用歧义:
这是由于编译器无法判断到底应该调用哪个函数的原因。
📌函数重载的原理
要知道函数重载的原理,我们首先要理解C程序运行的过程:
编译链接过程:
了解了编译链接的过程,我们可以发现,将函数调用部分和函数定义部分连接在一起的是链接的过程,而链接时,面对f()函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则。
如下是windows环境下vs2022中的函数名修饰后的函数名:具体的windows下vs对函数名修饰规则细节如下图:
通过这里我们就可以理解C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
但需要注意的是,如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。
结语
希望这篇关于函数重载的博客能对大家有所帮助,欢迎大佬们留言或私信与我交流.
学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!
相关文章推荐
【C++】什么是类与对象?
【C++】“Hello World!“
【C++】命名空间
【C++】缺省参数(默认参数)

相关文章:
【C++】函数重载
🦄个人主页:修修修也 🎏所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 📌函数重载的定义 📌函数重载的三种类型 🎏参数个数不同 🎏参数类型不同 🎏参数类型顺序不同 📌重载…...
【深度学习模型】6_3 语言模型数据集
注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 6.3 语言模型数据集(周杰伦专辑歌词) 本节将介绍如何预处理一个语言模型数据集,并将其转换成字符级…...
技术选型思考:分库分表和分布式DB(TiDB/OceanBase) 的权衡与抉择
码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 在当今数据爆炸的时代,数据库作为存储和管理数据的核心组件,其性能和扩展性成为了企业关注的重点。随着业…...
React改变数据【案例】
State传统方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>React Demo</title> <!--…...
ChatGPT Plus 自动扣费失败,如何续订
ChatGPT Plus 自动扣费失败,如何续订 如果您的 ChatGPT Plus 订阅过期或扣费失败,本教程将指导您如何重新订阅。 本周更新 ChatGPT Plus 是一种每月20美元的订阅服务。扣费会自动进行,如果您的账户余额不足,OpenAI 将在一次扣费…...
Rust: Channel 代码示例
在 Rust 中,通道(Channel)通常使用 std::sync::mpsc(多生产者单消费者)或 tokio::sync::mpsc(在异步编程中,特别是使用 Tokio 运行时)来创建。下面是一个使用 std::sync::mpsc 的简单…...
基于华为atlas的unet分割模型探索
Unet模型使用官方基于kaggle Carvana Image Masking Challenge数据集训练的模型。 模型输入为572*572*3,输出为572*572*2。分割目标分别为,0:背景,1:汽车。 Pytorch的pth模型转化onnx模型: import torchf…...
机器学习--循环神经网络(RNN)1
一、简介 循环神经网络(Recurrent Neural Network)是深度学习领域中一种非常经典的网络结构,在现实生活中有着广泛的应用。以槽填充(slot filling)为例,如下图所示,假设订票系统听到用户说&…...
基于java+springboot+vue实现的学生信息管理系统(文末源码+Lw+ppt)23-54
摘 要 人类现已进入21世纪,科技日新月异,经济、信息等方面都取得了长足的进步,特别是信息网络技术的飞速发展,对政治、经济、军事、文化等方面都产生了很大的影响。 利用计算机网络的便利,开发一套基于java的大学生…...
【漏洞复现】Linksys E2000 position.js 身份验证绕过漏洞(CVE-2024-27497)
0x01 产品简介 Linksys E2000是一款由思科(Cisco)品牌推出的无线路由器,它是一款支持2.4GHz和5GHz双频段的无线路由器,用户可以避开拥挤的2.4GHz频段,独自享受5GHz频段的高速无线生活。 0x02 漏洞概述 Linksys E200…...
小白跟做江科大51单片机之DS1302可调时钟
原理部分 1.DS1302可调时钟介绍 单片机定时器主要占用CPU时间,掉电不能继续运行 图1 2.原理 图2 内部有寄存器,寄存的时候以时分秒寄存,以通信协议实现数据交互,就可以实现对数据进行访问和读写 3.主要寄存器定义 CE芯片使能…...
2024蓝桥杯每日一题(归并排序)
一、第一题:火柴排队 解题思路:归并排序 重点在于想清楚是对哪个数组进行归并排序求逆序对 【Python程序代码】 from math import * n int(input()) a list(map(int,input().split())) b list(map(int,input().split())) na,nb [],[] for …...
生成对抗网络 (GAN)
生成对抗网络(Generative Adversarial Networks,GAN)是由Ian Goodfellow等人在2014年提出的一种深度学习模型。GAN由两部分组成:一个生成器(Generator)和一个判别器(Discriminator)&…...
QGridLayout网格布局和QVBoxLayout垂直布局有着非常大的差别
QGridLayout网格布局:1.把这块控件划分成一个个的 单元格 2.把你的控件填充进入 单元格 3.这些有关限制大小的函数接口统统失效 setMaximumWidth() setMinimumWidth() setPolicySize()图示:我是用的网格布局,左边放QT…...
HCIA-HarmonyOS设备开发认证V2.0-习题2
目录 习题一习题二坚持就有收获 习题一 # 判断题## 1.PWM占空比指的是低电平时间占周期时间的百分比。(错误)正确(True)错误(False)解题: - PWM占空比指的是高电平时间占周期时间的百分比## 2.UART是通用异步收发传输器,是通用串行数据总线,…...
【npm】前端工程项目配置文件package.json详解
简言 详细介绍了package.json中每个字段的作用。 package.json 本文档将为您介绍 package.json 文件的所有要求。它必须是实际的 JSON,而不仅仅是 JavaScript 对象文字。 如果你要发布你的项目,这是一个特别重要的文件,其中name和version是…...
Python快速入门系列-2(Python的安装与环境设置)
第二章:Python的安装与环境设置 2.1 Python的下载与安装2.1.1 访问Python官网2.1.2 安装Python对于Windows用户对于macOS用户对于Linux用户 2.2 集成开发环境(IDE)的选择与设置2.2.1 PyCharm2.2.2 Visual Studio Code2.2.3 Jupyter Notebook2…...
Linux的环境安装以及项目部署
LInux软件安装 是在发行版是CentOS下安装 通常使用yum安装,可以在rpm上增加了自动解决依赖的功能 传输安装包方式安装JDK与tomcat 安装JDK ●安装包:将.gz文件通过Xftp传输到/opt目录下准备安装 ●解压:进入/opt目录,使用命令tar -zxvf 压缩包名称 (名称…...
ASUS华硕天选2锐龙版笔记本电脑FA506ICB/FA706IC原装出厂Windows11系统,预装OEM系统恢复安装开箱状态
链接:https://pan.baidu.com/s/122iHHEOtNUu4azhVPnxNuA?pwdsqk7 提取码:sqk7 适用型号: FA506IM、FA506IE、FA506IC、FA506IHR FA506IR、FA506IHRB、FA506ICB、FA506IEB FA706IM、FA706IE、FA706IC、FA706IHR FA706IR、FA706IHRB、F…...
登录校验认证
会话技术 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。 会话跟踪: 一种维护浏览器状态的方法,服务器需要识别多次请…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...









