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

         💓 博客主页:倔强的石头的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.rhkb.cn/news/397840.html

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

相关文章

使用 Vue 官方脚手架初始化 Vue3 项目

Vite 官网&#xff1a;https://cn.vitejs.dev/ Vue 官网&#xff1a;https://vuejs.org/ Vue 官方文档&#xff1a;https://cn.vuejs.org/guide/introduction.html Element Plus 官网&#xff1a;https://element-plus.org/ Tailwind CSS 官网&#xff1a;https://tailwindcss.…

Xilinx课程,就这么水灵灵地上线了~

如果你想了解&#xff1a; 如何利用精通流水线&#xff08;Pipeline&#xff09;技术&#xff0c;让电路设计效率倍增&#xff1f; 如何掌握利用性能基线指导设计流程的方法&#xff1f; 如何理解集成电路设计中的UltraFast Design Methodology Implementation设计方法学中的…

100 Exercises To Learn Rust 挑战!准备篇

公司内部的学习会非常活跃&#xff01;我也参与了Rust学习会&#xff0c;并且一直在研究rustlings。最近&#xff0c;我发现了一个类似于rustlings的新教程网站&#xff1a;Welcome - 100 Exercises To Learn Rust。 rustlings是基于Rust的权威官方文档《The Rust Programming…

docker技术中docker-compose与harbor技术

docker-composeharbor docker网络概念 当大规模使用docker时&#xff0c;容器间通信就成了一个问题。 docker支持的四种网络模式在run时指定 host模式 --nethost 容器和宿主机共享一个网络命名空间 container模式 --net{容器id} 多个容器共享一个网络 none模式 --netnone …

【深度学习】TTS,CosyVoice,推理部署的代码原理讲解分享

文章目录 demo代码加载配置文件speech_tokenizer_v1.onnx(只在zero_shot的时候使用)campplus.onnx(只为了提取说话人音色embedding)`campplus_model` 的作用代码解析具体过程解析总结示意图CosyVoiceFrontEndCosyVoiceModel推理过程总体推理过程推理速度很慢: https://git…

基于Python爬虫+机器学习的长沙市租房价格预测研究

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

数据库(三):DML

DML&#xff0c;全称Data Manipulation Language&#xff08;数据操作语言&#xff09;&#xff0c;用来对数据库中表的数据记录进行增、删、改、查。 一、添加数据&#xff08;INSERT&#xff09; 注意事项&#xff1a; ①插入数据时&#xff0c;指定的字段顺序需要与值的顺序…

手机在网时长查询接口如何对接?(二)

一、什么是手机在网时长查询接口&#xff1f; 传入手机号码&#xff0c;查询该手机号的在网时长&#xff0c;返回时间区间&#xff0c;支持携号转网号码查询。 二、手机在网时长查询接口适用于哪些场景&#xff1f; 比如&#xff1a;信用评估辅助 &#xff08;1&#xff09…

二叉树建堆全过程(数组实现)

定义 typedef int HPDataType;typedef struct Heap {HPDataType* a;//用数组存数据int size;//当前数组存放数据的数量int capacity;//数组容量}HP; 即将要实现的功能 void HPInit(HP* php);//初始化 void HPPush(HP* php, HPDataType x);//堆尾插入数据&#xff08;数组尾部…

论文阅读:Efficient Core Maintenance in Large Bipartite Graphs | SIGMOD 2024

还记得我们昨天讨论的《Querying Historical Cohesive Subgraphs over Temporal Bipartite Graphs》这篇论文吗? https://blog.csdn.net/m0_62361730/article/details/141003301 这篇(还没看的快去看) 这篇论文主要研究如何在时间双向图上查询历史凝聚子图&#xff0c;而《E…

深度学习入门指南(1) - 从chatgpt入手

2012年&#xff0c;加拿大多伦多大学的Hinton教授带领他的两个学生Alex和Ilya一起用AlexNet撞开了深度学习的大门&#xff0c;从此人类走入了深度学习时代。 2015年&#xff0c;这个第二作者80后Ilya Sutskever参与创建了openai公司。现在Ilya是openai的首席科学家&#xff0c;…

手机误操作导致永久删除照片的恢复方法有哪些?

随着手机功能的不断增强和应用程序的不断丰富&#xff0c;人们越来越依赖手机&#xff0c;离不开手机。但有时因为我们自己的失误操作&#xff0c;导致我们手机上重要的照片素材被永久删除&#xff0c;这时我们需要怎么做&#xff0c;才能找回我们被永久删除的照片素材呢&#…

Langchain框架深度剖析:解锁大模型-RAG技术的无限潜能,引领AI应用新纪元

文章目录 前言一、Langchain 框架概述二、大模型-RAG技术原理三、应用示例1.RAG案例一&#xff08;私有文档直接读取-问答&#xff09;2.RAG案例二&#xff08;Vue上传文件结合文件内容回答问题&#xff09;3.RAG案例三&#xff08;Vue秒传文件结合文件内容回答问题&#xff09…

无字母数字webshell命令执行

<?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); }限制&#xff1a; 1.webshell长度不超过…

【海思SS626 | 内存管理】海思芯片的OS内存、MMZ内存设置

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

基于jsp的宠物领养与服务管理系统(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…

【SpringBoot】自定义注解<约定式i18n国际化>终极升级版方案源码Copy

零、前言 在后端对于 SpringBoot 的 数据库数据&#xff0c;需要国际化的字段和主要显示字段是分离的&#xff0c;为了避免大耦合性&#xff0c;与用户端的国际化字段处理问题&#xff0c;统一采用主要显示数据的实体字段。为此&#xff0c;我设计了一套解决方案&#xff0c;通…

el-form-item,label在上方显示,输入框在下方展示

本来是两排展示去写&#xff0c;设计要求一排展示&#xff0c;label再上方&#xff0c;输入框、勾选框在下方&#xff1b;只能调整样式去修改&#xff1b;参考label-position这个属性 代码如下&#xff1a; <el-form ref"form" :model"formData" clas…

React应用(基于react脚手架)

react脚手架 1.xxx脚手架&#xff1a;用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置&#xff08;语法检查&#xff0c;jsx编译&#xff0c;devServer&#xff09;下载好了所有相关的依赖可以直接运行一个简单结果 2.react提供了一个用于创建react项目…

AWVS——Web 应用漏洞扫描的强大工具

一、引言 在网络安全日益重要的今天&#xff0c;Web 应用的安全性备受关注。Acunetix Web Vulnerability Scanner&#xff08;简称 AWVS&#xff09;作为一款知名的 Web 应用漏洞扫描工具&#xff0c;为保障 Web 应用的安全发挥了重要作用。本文将详细介绍 AWVS 的功能、特点、…