【C++】函数重载详解

📢博客主页:https://blog.csdn.net/2301_779549673
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 JohnKi 原创,首发于 CSDN🙉
📢未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

在这里插入图片描述

文章目录

  • 📢前言
  • 🏳️‍🌈函数重载的概念
    • ❤️ 1、与原型的匹配原则
    • 🧡 2、匹配函数时,不区分const和非const变量
    • 💛 3、返回类型与特征标
    • 💚 4、重载引用参数
  • 🏳️‍🌈何时使用函数重载


📢前言

函数多态是C++在C语言的基础上新增的功能。

默认参数让您能够使用不同数目的参数调用同一函数,而函数多态(函数重载)让您能够使用多个同名的函数。术语“多态”指的是有多种形式,因函数多态允许函数可以有多种形式。类似地,术语“函数重载”指的是可以有多个同名的函数,因此名称进行了重载。这两个术语指的是同一回事,但我们通常使用函数重载。

可以通过函数重载来设计系列函数–它们完成相同的工作,但使用不同的参数列表。


🏳️‍🌈函数重载的概念

函数重载的关键是函数的参数列表–也称为函数特征标(inctionsienture)。如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,则它们的特征标相同,而量名是无关紧要的。C++允许定义名称相同的函数,条件是它们的特征标不同。如果参数数目和/或参数类型不同,则特征标也不同。例如,可以定义一组原型如下的print()函数;

void print(const char* str, int width);//#1
void print(double d, int width);//#2
void print(long l, int width);//#3
void print(int i, int width);//#4
void print (const char *str);//#5

使用print函数时,编译器将根据所采取的用法使用有相应特征标的原型

函数的名字仅仅是让编译器知道它调用的是哪个函数,而函数重载可以在一定程度上减轻程序员起名字、记名字的负担。

main函数不能重载。

❤️ 1、与原型的匹配原则

例如,print(“Pancakes”,15);使用一个字符串和一个整数作为参数,这与#1 原型匹配。

使用被重载的函数时,需要在函数调用中使用正确的参数类型。例如,对于下面的语句:

unsigned int year = 3210; 
print(year, 6);//ambiguous cal1

print()调用与哪个原型匹配呢?它不与任何原型匹配!

没有匹配的原型并不会自动停止使用其中的某个函数,因为C++将尝试使用标准类型转换强制进行匹配。

如果#2原型是prin()唯一的原型,则函数调用print(year,6)将把year 转换为 double 类型。但在上面的代码中,有3个将数字作为第一个参数的原型,因此有3种转换year的方式。在这种情况下,C++将拒绝这种函数调用,并将其视为错误。

一些看起来彼此不同的特征标是不能共存的。例如,请看下面的两个原型:

double cube(double x); 
double cube(double& x);

您可能认为可以在此处使用函数重载,因为它们的特征标看起来不同。然而,请从编译器的角度来考虑这个问题。假设有下面这样的代码:

cout << cube (x);

参数xdouble x原型和double &x原型都匹配,因此编译器无法确定究竟应使用哪个原型。为避免这种混乱,编译器在检查函数特征标时,将把类型引用和类型本身视为同一个特征标。

🧡 2、匹配函数时,不区分const和非const变量

请看下面原型

void dribble(char* bits);
void dribble(const char* cbits); 
void dabble(char* bits);
void drivel(const char* bits);

下面列出了各种函数调用对应的原型:

const char p1【20] = "How's the weather?"; 
char p2[20] = "How's business?"; 
dribble(p1);    //dribble(const char *);
dribble(p2);    // dribble(char *);
dabble(p1);    // no match
dabble(p2);    // dabble(char *);
drivel(p1);     //drivel(const char*);
drivel(p2);     //drivel(const char*);

dribble()函教有两个原型,一个用于 const指针,另一个用于常规指针,编译器将根据实参是否为const决定使用哪个原型。

dabble()函数只与带非const参数的调用匹配

drivel()函数可以与带const 或非const参数的调用匹配

dabble()函数drivel()函数之所以再行为上有这种差异,主要是由于将非const值赋给const变量时合法的,反之不合法

💛 3、返回类型与特征标

对于特征标我们可以简单地理解为形参的类型、数量及排列顺序。

long gronk(int n,float m);
double gronk(int n,float m);

比如说这两个参数的特征标就是一样的

long gronk(int n,float m);
double gronk(double n,float m);

这两个就是不一样的

请记住,是特征标,而不是函数类型使得可以对函数进行重载。例如,下面的两个声明是互斥的

因此,C+不允许以这种方式重载gronk()。返回类型可以不同,但特征标也必须不同

所以上面第一种写法就不行的,但第二种可以

💚 4、重载引用参数

类设计和 STL 经常使用引用参数,因此知道不同引用类型的重载很有用。请看下面三个原型.

void sink(double& rl);
void sank(const double& r2);
void sunk(double&& r3);

左值引用参数r1与可修改的左值参数(如double变量)匹配;
const左值引用参数r2与可修改的左值参数、const 左值参数和右值参数(如两个 double值的和)匹配;
最后,左值引用参数r3与左值匹配。注意到与r1或 r3匹配的参数都与r2匹配。这就带来了一个问题:如果重载使用这三种参数的函数,结果如何?答案是将调用最匹配的版本:

void staff(double& rs); 
void staff(const double& rcs); 
void stove(double& rl); 
void stove(const double& r2); 
void stove(double&& r3);

这让您能够根据参数是左值、const还是右值来定制函数的行为:

double x = 55.5; 
const double y = 32.0; 
stove(x);         // calls stove(double &)
stove(y);         //calls stove(const double &)
stove(x + y);   // calls stove(double &&)

如果没有定义函数 stove(double &&),stove(x+y)将调用函数 stove(const double &)

🏳️‍🌈何时使用函数重载

虽然函数重载很吸引人,但也不要滥用。仅当函数基本上执行相同的任务,但使用不同形式的数据才应采用函数重载。另外,您可能还想知道,是否可以通过使用默认参数来实现同样的目的。例如,可用两个重载函数来代替面向字符串的lef()函数:

char* left(const char* str, unsigned n);
char* left(const char* str);

使用一个带默认参数的函数要简单些。只需编写一个函数(而不是两个函数),程序也只需为一个函(而不是两个)请求内存;需要修改函数时,只需修改一个。然而,如果需要使用不同类型的参数,则默认参数便不管用了,在这种情况下,应该使用函数重载。


本篇博文对 函数重载 做了一个较为详细的介绍,不知道对你有没有帮助呢

觉得博主写得还不错的三连支持下吧!会继续努力的~

请添加图片描述

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

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

相关文章

【LLM大模型】Langchain 介绍与入门

官方介绍 LangChain 是一个利用LLM开发应用程序的框架。它让应用程序具备&#xff1a; 上下文感知能力&#xff1a;将LLM连接到上下文源&#xff08;提示说明、少量示例、用以形成其响应的内容等&#xff09;推理&#xff1a;依靠LLM进行推理&#xff08;例如根据提供的上下文…

全网最详细单细胞保姆级分析教程

各位读者,好久不见,我又归来了,之后的一段时候我将以Rstudio分析单细胞的RNA-seq流程为主,希望各位读者朋友多多支持! 1. pbmc单样本分析 1.包的加载 library(multtest) library(dplyr) library(Seurat) library(patchwork) library(R.utils)2. 清除环境变量 rm(list ls))…

深度解析蚂蚁 SEO 蜘蛛池:提升网站流量的有效利器

在当今数字化时代&#xff0c;网站流量对于企业和个人的在线业务成功至关重要。为了在竞争激烈的网络环境中脱颖而出&#xff0c;众多站长和 SEO 从业者不断探索各种优化策略&#xff0c;其中蚂蚁 SEO 的蜘蛛池成为备受关注的工具之一。 蚂蚁 SEO 蜘蛛池是一种创新的技术手段&a…

HarmonyOS鸿蒙开发入门 , ArkTS语言的了解

鸿蒙&#xff08;即HarmonyOS&#xff0c;开发代号Ark&#xff0c;正式名称为华为终端鸿蒙智能设备操作系统软件&#xff09;是由华为公司2012年以来开发的分布式操作系统&#xff0c;并于2019年8月正式发布。该系统利用“分布式”技术&#xff0c;将手机、电脑、平板、电视、汽…

画封装步骤

parameter参数 1.打开pad designer 2.设计单位mils改为millimeter&#xff0c;保留decimal layers 3.勾选☑️single layer mode

游戏厅ps5体验馆计时收费软件 佳易王电玩馆计时器定时语音提醒系统操作教程

前言&#xff1a; 游戏厅ps5体验馆计时收费软件 佳易王电玩馆计时器定时语音提醒系统操作教程 以下软件操作教程以&#xff0c;佳易王游戏厅电玩店计时计费管理系统软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 一、软件操作教程 1、计…

【Python】人生重开模拟器(实现代码)

一、游戏背景介绍 这是一款文字类小游戏。玩家输入角色的初始属性之后&#xff0c;就可以开启不同的人生经历。 完整的程序代码较多&#xff0c;此这里只实现其中的一部分逻辑&#xff08;主要目的&#xff1a;巩固前面学习的 Python 语法基础&#xff09;。 二、设置初始属性…

springboot企业人力资源管理系统-计算机毕业设计源码29005

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…

Redis 主从复制,哨兵与集群

目录 一.redis主从复制 1.redis 主从复制架构 2.主从复制特点 3.主从复制的基本原理 4.命令行配置 5.实现主从复制 6.删除主从复制 7.主从复制故障恢复 8.主从复制完整过程 9.主从同步优化配置 二.哨兵模式&#xff08;Sentinel&#xff09; 1.主要组件和概念 2.哨…

基于复旦微V7 690T FPGA +ARM/海光X86+AI的全国产化数据采集人工智能平台

国产化FPGA&#xff1a;JFM7VX690T80主机接口&#xff1a;PCIe Gen3 x88Gbps/lane光纤通道&#xff1a;前面板4路SFP光纤&#xff0c;后面板1路QSFP光纤2组独立的DDR3 SDRAM 缓存&#xff0c;工作时钟频率800MHz2个FMC接口扩展&#xff1a;每个支持16路GTH&#xff0c;线速率10…

提示词工程(Prompt Engineering)是什么?

一、定义 Prompt Engineering 提示词工程&#xff08;Prompt Engineering&#xff09;是一项通过优化提示词&#xff08;Prompt&#xff09;和生成策略&#xff0c;从而获得更好的模型返回结果的工程技术。 二、System message 系统指令 System message可以被广泛应用在&am…

ORB-slam3 安装教程

1. 官网下载源码&#xff1a;GitHub - UZ-SLAMLab/ORB_SLAM3: ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM 2. 根据官网下载依赖&#xff1a; &#xff08;1&#xff09;eigen3:Eigen 解压后进入源码目录进行编译&#xff1a…

ensp实验:防火墙安全策略用户认证综合策略

实验要求&#xff1a; 示例图&#xff1a; 设备配置&#xff1a; LSW5 vlan配置&#xff1a; 防火墙网络配置&#xff1a; 安全区域配置&#xff1a; 地址组配置&#xff1a; 时钟配置: 一&#xff1a; 办公区策略&#xff1a; 生产区策略&#xff1a; 二&#xff1a; 游客区…

医院健康宣教二维码如何制作?以及应用案例分享

医院正在广泛应用二维码来向患者展示健康宣传教育方面的信息&#xff0c;从疾病预防内容、术后康复训练知识&#xff0c;到日常保健视频&#xff08;如八段锦&#xff09;、饮食注意事项…… 这些内容都能够以二维码的形式呈现&#xff0c;方便患者随时扫码查看获取健康知识&am…

plt.subplot2grid创建N行M列的子图网格,N不等于M

以下代码是实现不同频率的余弦信号绘制&#xff0c;并将它们显示在一个 3x2 的子图网格中。 import numpy as np import matplotlib.pyplot as pltfig plt.figure(figsize(10, 10)) a1 plt.subplot2grid((3, 2), (0, 0), colspan2) a2 plt.subplot2grid((3, 2), (1, 0)) a3…

C++技能基础:提升C++程序运行效率的方法总结

以下是一些编程方面的建议&#xff0c;目的是为了提升C程序的效率&#xff08;这里的效率以时间为评判标准&#xff09;&#xff0c;欢迎指正和补充 场景&#xff1a;当设计方法时&#xff0c;将方法设计成值传递还是引用或者指针传递建议&#xff1a;当变量所占内存大小与指针…

SpringBoot整合XXL_JOB示例

XXL-JOB 是一个分布式任务调度平台&#xff0c;主要用于管理和执行定时任务。它适用于各种场景&#xff0c;例如定时任务、批处理任务、分布式任务等。XXL-JOB 提供了丰富的功能&#xff0c;使得任务调度变得简单、高效和可靠。以下是 XXL-JOB 的一些主要功能和特点&#xff1a…

暑假第一次作业

第一步&#xff1a;给R1,R2,R3,R4配IP [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 24 [R1-Serial4/0/0]ip address 15.0.0.1 24 [R2-GigabitEthernet0/0/0]ip address 192.168.2.1 24 [R2-Serial4/0/0]ip address 25.0.0.1 24 [R3-GigabitEthernet0/0/0]ip address 192.…

程序员标准简历模板

链接: https://pan.baidu.com/s/1yMXGSSNba15b9hMXjA39aA?pwdb4ev 提取码: b4ev 3年工作经验简历 链接: https://pan.baidu.com/s/1OO7n1lRL6AkhejxYC9IyDA?pwdfmvv 提取码: fmvv 优秀学员简历 链接: https://pan.baidu.com/s/106Vkw_ulOInI47_5mDySSg?pwduudc 提取码: uu

Spring Expression表达式使用

Spring Expression 简介 Spring Expression Language&#xff08;简称 “SpEL”&#xff09;是一种功能强大的表达式语言&#xff0c;支持在运行时查询和操作对象图。其中最显著的是&#xff1a;方法调用和基本的字符串模板功能。 虽然SpEL是Spring产品组合中表达式评估的基础…