【C++指南】函数重载:多态性的基石

news2025/1/10 1:37:06

         💓 博客主页:倔强的石头的CSDN主页 

           📝Gitee主页:倔强的石头的gitee主页

            ⏩ 文章专栏:《C++指南》

                                  期待您的关注

 

1b7335aca73b41609b7f05d1d366f476.gif

目录

引言

一、函数重载的概念

二、函数重载的原理

三、函数重载的应用场景

四、函数重载的规则

五、函数重载的示例

 1. 参数类型不同

2.  参数个数不同

3.  参数类型顺序不同

4.返回值不同不能作为重载条件

5.默认参数不能用于区分重载函数

六、函数重载的使用建议

总结


 

 

引言

在C++编程中,函数重载(是一项核心特性,它允许在同一作用域内定义多个同名的函数,只要这些函数的参数列表(包括参数的数量、类型或顺序)不同即可。

 

这一特性极大地增强了C++语言的表达力和灵活性,是C++多态性概念的重要体现之一。

 

本文将深入探讨C++函数重载的概念、原理、应用场景以及最佳实践,旨在帮助读者更好地理解和应用这一特性。

 

一、函数重载的概念

  • 函数重载是指允许存在多个同名函数,只要它们的参数列表不同即可
  • 编译器会根据函数调用时提供的参数类型、数量或顺序来确定具体调用哪个函数。
  • 这种机制使得函数名能够承载更多的意义,同时避免了通过改变函数名来实现类似功能所带来的命名混乱问题。

 

二、函数重载的原理

C++编译器在编译时,会根据函数调用的上下文(即函数调用时提供的参数),来确定应该调用哪个具体的函数。

这一过程是通过名称修饰函数签名匹配来实现的。

  • 名称修饰是编译器在编译时将函数名与参数类型信息结合起来,生成一个唯一的标识符,以便在链接阶段区分不同的函数。
  • 而函数签名则是由函数返回类型、函数名和参数列表共同构成的,但在函数重载中,返回类型并不参与重载决策,只有参数列表是判断依据。文章后面也会讲到,返回类型不会作为函数重载的依据

 

简单来说,函数重载是通过函数名相同+参数列表不同来实现的

 

 

三、函数重载的应用场景

函数重载在C++编程中有着广泛的应用场景,包括但不限于以下几个方面:

  1. 运算符重载:通过重载运算符,可以为自定义类型提供类似于内置类型的运算能力,如+-*/等。

  2. 输入输出流的重载:为自定义类型重载<<>>运算符,实现与标准输入输出流的交互。

  3. 构造函数重载:为类定义多个构造函数,允许以不同的方式初始化对象。

  4. 通用函数:设计一组功能相似但处理不同类型数据的函数,通过函数重载提高代码的可读性和可维护性。 ——本文主要讲解的是这一种函数重载,其他三种函数重载因为涉及到更多的知识点,会放在类和对象的相关文章中讲解,随后会附上相关文章链接

 

四、函数重载的规则

  1. 函数名称必须相同:重载的函数必须具有相同的名称,这是重载的基础。

  2. 参数列表必须不同:参数列表的不同可以体现在参数的类型、数量或顺序上。具体来说:

    • 参数类型不同:例如,void func(int x); 和 void func(double x); 是重载函数。
    • 参数数量不同:例如,void print(); 和 void print(int x); 是重载函数。
    • 参数顺序不同(本质是类型不同):例如,void swap(int& x, double& y); 和 void swap(double& a, int& b); 是重载函数。
  3. const和引用限定符不影响重载const限定符或引用限定符(如&&&)可以作为函数重载的区分条件,但它们本身并不直接决定重载,而是作为参数类型的一部分来考虑。例如,void print(const int& x); 和 void print(int& y); 是重载函数。

  4. 返回类型不参与重载决策:函数的返回类型不能作为重载的依据。即使两个函数的返回类型不同,只要它们的参数列表相同,它们就不是重载函数。

  5. 编译器通过参数列表区分重载函数:在调用重载函数时,编译器会根据实参的类型和数量来匹配最合适的重载版本。

 

五、函数重载的示例

 1. 参数类型不同

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;
}

 

2.  参数个数不同

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

 

3.  参数类型顺序不同

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

 

4.返回值不同不能作为重载条件

/ 返回值不同不能作为重载条件,因为调用时无法区分

void fxx()
{}

int fxx()
{
    return 0;
}

 

5.默认参数不能用于区分重载函数

如果两个函数仅在默认参数上有所不同,那么它们将不构成重载,而是会导致编译错误。

// f1()调用时,会报错,存在歧义,编译器不知道调用谁

void f1()
{
	cout << "f()" << endl;
}

void f1(int a = 10)
{
	cout << "f(int a)" << endl;
}

 

 

 

六、函数重载的使用建议

  1. 保持函数功能的一致性:虽然函数名相同,但不同重载版本的函数应该执行相似或相关的任务,避免引起混淆。

  2. 清晰区分参数列表:通过合理的参数设计,确保每个重载版本的函数都有独特的参数列表,避免因为参数列表过于相似而导致的调用错误。

  3. 注意返回类型:虽然返回类型不参与函数重载的决策,但应保持一致性或遵循一定的逻辑,以便读者理解。

  4. 避免过度重载:虽然函数重载提供了很大的灵活性,但过度重载可能会导致函数名承载过多的意义,降低代码的可读性。

  5. 使用默认参数代替某些重载:在某些情况下,可以考虑使用默认参数来代替某些参数列表相似的重载版本,以减少函数数量并简化代码。

 

总结

C++函数重载是C++多态性概念的重要体现之一,它允许在同一作用域内定义多个同名的函数,只要它们的参数列表不同即可。这一特性极大地增强了C++语言的表达力和灵活性,使得程序员能够编写出更加清晰、简洁和可维护的代码。然而,在使用函数重载时,也需要注意保持函数功能的一致性、清晰区分参数列表、避免过度重载等最佳实践,以确保代码的质量和可维护性。

 

 

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

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

相关文章

springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice

一、 背景 因为项目中需要使用word转pdf功能&#xff0c;因为转换速度原因&#xff0c;最后选用了libreoffice&#xff0c;原因及部署请参考 linux ubuntu环境安装libreoffice&#xff0c;word转pdf 远程调用的话可选docker部署&#xff0c;请看2.3.1 二、springboot整合libr…

AT指令处理框架

<AT框架>做什么 <AT框架>介绍 ATFrame 流程 开启AT流程: ATCommandRegister(CSQ,EXEXCMD,NULL); 发送消息队列xQueueSend(ATcmdQueue,(void *) &RegcommandInfo,(TickType_t)100) AT主流程 ATCommandSendScheduler 等待开启xQueueReceive(ATcmdQueue, (voi…

详细分析python下载文件的两种方式(附Demo)

目录 前言1. 接口方式2. Nginx 前言 基本项目的构建推荐阅读&#xff1a;构建Flask前后端不分离项目&#xff08;附Python Demo&#xff09; 对于Java的基本知识&#xff0c;推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&…

Unknown input format pdf Pandoc can convert to PDF, but not from PDF.解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【Lua运行环境安装及配置】

首先在百度搜索“Lua菜鸟教程” 网址&#xff1a;Lua 教程 | 菜鸟教程 (runoob.com) 找到环境安装 点击Github下载地址&#xff0c;GitHub可以在正规上网下进入网址&#xff08;页面更新不出来多试几次&#xff09; 点击.exe安装 下载完成后进行安装 可自定义磁盘 项目文件很…

线程局部变量(ThreadLocal)

线程局部变量&#xff08;ThreadLocal&#xff09; 1、什么是ThreadLocal&#xff1f;2、基本用法3、注意事项 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、什么是ThreadLocal&#xff1f; ThreadLocal 是 Java 中用于实现线程局部变…

IEC 61850标准协议解读 1.建模讲解

IEC61850协议标准和之前的101、104协议最大的区分就是在模型这里&#xff0c;模型可以说是一个变电站里面的智能设备的定义&#xff0c;里面定义了网络连接信息、数据上报方式、设备访问控制点等&#xff0c;所以说在不同系统的对接过程中&#xff0c;有了这么一个基于标准定义…

sqliabs靶场练习

关卡 熟悉Mqsql相关命令Less-1Less-2Less-3Less-4Less-5Less-6Less-7Less-8Less-9Less-10 熟悉Mqsql相关命令 首先先熟悉一下Mysql的相关命令&#xff0c;可能在SQL注入的时候会用到。 1.查询服务器主机信息 HOSTNAME 主机名称 datadir——数据库路径 version_compile_os—…

JavaDS —— 红黑树

前言 还是一样&#xff0c;这里的红黑树重点讲述插入代码的实现&#xff0c;如果对红黑树的删除感兴趣&#xff0c;可以去翻阅其他资料。 在数据结构专栏中已经对 AVL 树的旋转调整做了分析和讲解&#xff0c;这里红黑树也会使用到旋转调整的代码&#xff0c;就不讲述旋转代码…

成都云飞浩容文化传媒有限公司怎么样可靠吗?

在数字经济浪潮汹涌的今天&#xff0c;电商行业作为推动经济高质量发展的关键引擎&#xff0c;正以前所未有的速度重塑着商业版图。在这场变革中&#xff0c;成都云飞浩容文化传媒有限公司凭借其专业的电商服务能力和前瞻性的市场洞察&#xff0c;成为了众多品牌商家信赖的合作…

助力草莓智能自动化采摘,基于嵌入式端超轻量级模型LeYOLO全系列【n/s/m/l】参数模型开发构建果园种植采摘场景下草莓成熟度智能检测识别系统

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经渗透到我们生活的方方面面&#xff0c;从智能家居到自动驾驶&#xff0c;再到医疗健康&#xff0c;其影响力无处不在。然而&#xff0c;当我们把目光转向中国的农业领域时&#xff0c;一个令人惊讶的…

Git分布式版本控制--2+day018 LeetCode235 701 450

基础操作: 1.分支: 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离 开来进行重大的Bug修改、开发新的功能&#xff0c;以免影响开发主线。 2.指令操作: 2.1 查看本地分支: git branch 2.2 创建本地分支: git branch 分支名…

Spring Boot 3.3 新特性介绍

1. 引言 Spring Boot 3.1.x 停止维护了&#xff0c;而 3.3.x 作为最新发布的版本&#xff0c;带来了许多新特性和改进。本篇文章将详细介绍这些新特性&#xff0c;并通过样例代码加以解释&#xff0c;帮助开发者更好地掌握和应用这些新功能。 Spring Boot 3.3现已正式发布&…

RNN循环网络层

文章目录 1、简介2、RNN 网络原理3、PyTorch RNN 层的使用3.1、RNN送入单个数据3.2、RNN层送入批量数据 4、RNN三个维度4.1、解释4.2、输入数据的组织4.3、示例4.4、为什么需要这种格式&#xff1f;4.5、小结 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&a…

【博士每天一篇文献-算法】持续学习经典算法之LwF: Learning without forgetting

1 介绍 年份&#xff1a;2017 作者&#xff1a;Zhizhong Li&#xff0c;Amazon AWS Rekognition&#xff1b;Derek Hoiem&#xff0c;伊利诺伊大学计算机科学教授 会议&#xff1a;IEEE transactions on pattern analysis and machine intelligence 引用量&#xff1a;4325 Li…

【NXP-MCXA153】开发板救砖教程

前言 新手接触到NXP的板子时&#xff0c;一个不留神把调试的GPIO&#xff08;RXD、TXD&#xff09;改掉&#xff0c;很容易出现MDK Keil无法识别CMSIS-DAP调试器的情况&#xff1b;主控进入了莫名其妙模式导致调试器无法识别了&#xff0c;你根本无法下载程序&#xff0c;想改…

大数据-67 Kafka 高级特性 分区 分配策略 Ranger、RoundRobin、Sticky、自定义分区器

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

虚拟机Centos7 minimal版本安装docker

1、在 CentOS 7 上启用 EPEL 软件包存储库&#xff1b; &#xff08;删除epel软件包和其他操作可参考&#xff1a;如何在 CentOS 7 上使用 EPEL (linux-console.net)&#xff09; 1.1&#xff1a; 要安装epel前会报错&#xff0c;如下所示&#xff1a; 先参照这个链接安装&a…

【python】OpenCV—Image Super Resolution

文章目录 1、背景介绍2、准备工作3、EDSR4、ESPCN5、FSRCNN6、LapSRN7、汇总对比8、参考 1、背景介绍 图像超分&#xff0c;即图像超分辨率&#xff08;Image Super Resolution&#xff0c;简称SR&#xff09;&#xff0c;是指由一幅低分辨率图像或图像序列恢复出高分辨率图像…

HTML基础 - HTML5

目录 一. 简介 二. 新增元素 三. 拖放 地理定位 A、HTML5 拖放&#xff08;Drag and Drop&#xff09; B.HTML5 地理定位&#xff08;Geolocation&#xff09; 四. input 五. web存储 webSQL 六. 应用程序缓存 web workers 七. web socket 可以先看上篇HTML基础再来看…