【C++】函数重载详解

news2024/9/22 19:31:37

📢博客主页: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.coloradmin.cn/o/1921490.html

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

相关文章

Python面试全攻略:基础知识、特性、算法与实战解析

随着Python的普及&#xff0c;越来越多的人开始学习Python并尝试在面试中展示自己的技能。在这篇文章中&#xff0c;我们将探讨Python面试需要注意的问题以及一些经典的Python算法。 一、Python面试需要注意的问题 基础知识 在Python面试中&#xff0c;基础知识是非常重要的。…

开源浪潮:助力未来科技的飞速发展

文章目录 开源项目有哪些机遇与挑战&#xff1f;开源项目的发展趋势发展现状开源社区的活跃度 我是如何参与开源项目的经验分享选择开源项目贡献代码 开源项目的挑战开源项目面临的挑战 开源项目有哪些机遇与挑战&#xff1f; 随着全球经济和科技环境的快速变化&#xff0c;开源…

设计模式 - 最简单最有趣的方式讲述

别名《我替你看Head First设计模式》 本文以故事的形式带你从0了解设计模式&#xff0c;在其中你仅仅是一名刚入职的实习生&#xff0c;在项目中摸爬滚打。&#xff08;以没有一行真正代码的形式&#xff0c;让你无压力趣味学习&#xff09; 设计模式 策略模式观察者模式装饰者…

【简历】重庆某一本大学:JAVA简历指导,中厂通过率较低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份重庆某一本大学Java同学的简历。那么因为学校是一个一本的学校&#xff0c;就先要确定就业层次在中厂或者大厂&#xff0c;但是…

Zed 编辑器发布了原生 Linux 版本

由 Rust 编写、GPU 加速的 Zed 文本编辑器终于提供了正式的 Linux 原生版本&#xff01;在过去的几个月里&#xff0c;Zed 的 Linux 支持取得了长足的进步&#xff0c;现在已经进入了更正式的阶段。 今天&#xff0c;这款由前 Atom 开发人员创建的现代开源代码编辑器现在在 Li…

算法的几种常见形式

算法&#xff08;Algorithm&#xff09; 算法&#xff08;Algorithm&#xff09;是指解决问题或完成任务的一系列明确的步骤或规则。在计算机科学中&#xff0c;算法是程序的核心部分&#xff0c;它定义了如何执行特定的任务或解决特定的问题。算法可以用多种方式来表示和实现…

如何在小红书上面有效地种草?

文末领取小红书电商开店运营教程&#xff01; 小红书是一个以内容分享为主的社交平台&#xff0c;大家喜欢在这里分享自己的生活体验和心得&#xff0c;其中就包括各种产品的使用感受。 那么我们要想在小红书上有效地种草&#xff0c;首先就需要了解并掌握小红书的种草文化。 …

JavaScript(8)——函数

函数 function,是被设计执行特定任务的代码块。 函数可以把具有相同或相似逻辑的代码包裹起来&#xff0c;通过函数调用执行这些代码&#xff0c;这么做的优势有利于精简代码方便复用。类似于alert(),prompt()和console.log()&#xff0c;这些都是js函数&#xff0c;不过已经…

C++学习书籍推荐

第一本&#xff1a;C Primer CPrimer&#xff1a;主要讲解语法&#xff0c;经典的语法书籍&#xff0c;前后中期都可以看&#xff0c;前期如果⾃学看可能会有点晦涩 难懂&#xff0c;能看懂多少看懂多少&#xff0c;就当预习&#xff0c;中后期作为语法字典&#xff0c;⾮常好⽤…

Android11 SplashScreen 的显示和退出流程

应用的启动到显示到屏幕是需要一定的时间的&#xff0c;为了提升用户的体验&#xff0c;google加入了启动窗口&#xff0c;也就是SplashScreen SplashScreen显示流程 在应用的启动过程中&#xff0c;会调用到ActivityStarter的startActivityInner方法&#xff0c;具体可参考&a…

STM32HAL库+ESP8266+cJSON+微信小程序_连接华为云物联网平台

STM32HAL库ESP8266cJSON微信小程序_连接华为云物联网平台 实验使用资源&#xff1a;正点原子F407 USART1&#xff1a;PA9P、A10&#xff08;串口打印调试&#xff09; USART3&#xff1a;PB10、PB11&#xff08;WiFi模块&#xff09; DHT11&#xff1a;PG9&#xff08;采集数据…

【JavaEE精炼宝库】文件操作(2)——文件内容读写 | IO流

文章目录 一、输入流1.1 InputStream 概述&#xff1a;1.2 read 方法详解&#xff1a;1.3 close 方法&#xff1a;1.4 利用 Scanner 进行读操作&#xff1a;1.5 Reader&#xff1a; 二、输出流2.1 OutputStream 概述&#xff1a;2.2 write 方法详解&#xff1a;2.3 利用 PrintW…

【Sql Server】sql server 2019设置远程访问,外网服务器需要设置好安全组入方向规则

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言1、无法链接…

47、lvs之DR

1、DR模式&#xff1a; 1.1、lvs三种模式&#xff1a; nat 地址转换 DR 直接路由模式 tun 隧道模式 1.2、DR模式的特点&#xff1a; 调度器在整个lvs集群当中是最重要的&#xff0c;在nat模式下&#xff0c;即负载接收请求&#xff0c;同时根据负载均衡的算法转发流量&…

2024 China Joy 前瞻 | 腾讯网易发新作,网易数智携游戏前沿科技、创新产品以及独家礼盒,精彩不断!

今年上半年&#xff0c;CES、MWC和AWE三大国际科技展轮番轰炸&#xff0c;吸引全球科技爱好者的高度关注&#xff0c;无论是新潮的科技产品&#xff0c;还是对人工智能的探索&#xff0c;每一项展出的技术和产品都引起了市场的热议。而到了下半年&#xff0c;一年一度的China J…

springboot商城综合项目自动化系统-计算机毕业设计源码051018

摘 要 目前电商系统商城项目管理极其频繁,迫切地需要自动化测试来代替人工繁琐而又重复的劳动。自动化测试相关的研究已经很多,但多数只是针对某一方面,比如单一接口或者单一页面或者性能等,而缺乏将接口、页面、持续集成系统和缺陷管理系统整合的自动化测试平台。本研究采用混…

ROS——六轴机械臂建模

创建工作空间及目录&#xff08;my_arm&#xff09; 创建launch、urdf文件夹 urdf launch Arm_Model.xacro <?xml version"1.0"?> <robot name"marm" xmlns:xacro"http://www.ros.org/wiki/xacro"><!-- Defining the c…

【Python3】自动化测试_Playwright的安装教程

安装playwright库&#xff1a; pip install playwright 安装内置浏览器&#xff1a; # Install All playwright install# Install chromium playwright install chromium# Install firefox playwright install firefox# Install WebKit playwright install webkit 安装系统…

32.同步FIFO-IP核的调用

&#xff08;1&#xff09;FIFO&#xff08;First In First Out&#xff0c;即先进先出&#xff09;&#xff0c;是一种数据缓冲器&#xff0c;用来实现数据先入先出的读写方式。 &#xff08;2&#xff09;FIFO存储器主要是作为缓存&#xff0c;应用在同步时钟系统和异步时钟系…

深入解析发生 OOM 的三大场景

深入解析 OOM 的三大场景 什么是 OOM&#xff1f;一、堆内存溢出 ( Heap OOM )原因分析解决方案 二、栈内存溢出&#xff08;Stack OOM&#xff09;原因分析解决方案 三、方法区内存溢出&#xff08;Metaspace OOM&#xff09;原因分析解决方案 在Java应用程序开发中&#xff0…