【C++】函数重载

C++ 中的函数重载(Function Overloading)是指在同一个作用域内,可以定义多个名称相同但参数列表不同的函数。通过函数重载,可以根据传递给函数的参数类型或数量的不同,选择适当的函数来执行。

函数重载的条件

C++ 函数重载需要满足以下条件:

  1. 同一个作用域内存在多个同名函数。
  2. 函数名相同,但参数列表不同,包括参数的类型、顺序和数量。
  3. 函数的返回类型可以相同也可以不同。
#include<iostream>
using namespace std;// 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;
}int main()
{Add(10, 20);Add(10.1, 20.2);f();f(10);f(10, 'a');f('a', 10);return 0;
}

函数重载的示例

下面是一个函数重载的示例:

void printNumber(int num) {std::cout << "Integer: " << num << std::endl;
}void printNumber(float num) {std::cout << "Float: " << num << std::endl;
}void printNumber(double num) {std::cout << "Double: " << num << std::endl;
}

在上述示例中,我们定义了三个名为 printNumber 的函数,它们的参数分别是 intfloat 和 double 类型的数值。根据传递给函数的参数类型,编译器将自动选择最匹配的函数进行调用。

int main() {printNumber(10);       // 调用 printNumber(int)printNumber(3.14f);    // 调用 printNumber(float)printNumber(3.14159);  // 调用 printNumber(double)return 0;
}

函数重载的决策过程

函数重载的决策过程由编译器自动完成,它根据实参与形参之间的匹配情况来选择最佳匹配的函数。决策过程遵循以下规则:

  1. 编译器首先尝试找到完全匹配的函数。如果找到了参数类型完全匹配的函数,那就使用该函数进行调用。
  2. 如果没有找到完全匹配的函数,编译器将尝试进行隐式类型转换来寻找匹配,例如,从 int 到 float 的隐式转换。
  3. 如果仍然有多个函数能够匹配,则编译器将选择与形参更为接近的函数。较小的隐式类型转换和精度更高的匹配将被优先选择。

函数重载与返回值

在函数重载中,返回值类型不是重载函数的决策因素。也就是说,即使两个函数的返回值类型不同,只要它们的参数列表不同,仍然可以进行函数重载。

int max(int a, int b) {return (a > b) ? a : b;
}double max(double a, double b) {return (a > b) ? a : b;
}

在上面的示例中,即使两个 max 函数的返回值类型分别是 int 和 double,它们仍然可以进行函数重载。

函数重载与默认参数

函数重载与默认参数可以一起使用,但需要注意一些限制。如果有多个函数重载,其中一个使用了默认参数,而其他重载函数又不使用默认参数,那么在调用时可能会产生二义性错误。在这种情况下,编译器无法确定应该调用哪个函数。

void printNumber(int num, int base = 10) {std::cout << "Integer: " << num << ", Base: " << base << std::endl;
}void printNumber(float num) {std::cout << "Float: " << num << std::endl;
}int main() {printNumber(10);       // 编译通过,调用 printNumber(int, int)printNumber(3.14f);    // 编译错误!无法确定调用哪个函数return 0;
}

在上述示例中,调用 printNumber(3.14f)时会导致编译错误,因为编译器无法确定是调用printNumber(int, int)还是printNumber(float)。这是因为 printNumber(int, int)` 的第二个参数有一个默认值。

为了避免此类问题,可以通过显式地指定参数类型来解决二义性错误,或者通过对参数进行适当转换来选择具体的函数。

总结

函数重载是 C++ 中一个灵活强大的特性,允许我们使用相同的函数名来处理不同的参数类型和数量。通过函数重载,我们可以提高代码的可读性和可维护性,并避免命名冲突。需要注意的是,在函数重载使用中,应避免产生二义性错误,以确保编译器能够正确匹配函数。

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

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

相关文章

EasyDarwin计划新增将各种流协议(RTSP、RTMP、HTTP、TCP、UDP)、文件转推RTMP到其他视频直播平台,支持转码H.264、文件直播推送

之前我们尝试做过EasyRTSPLive&#xff08;将RTSP流转推RTMP&#xff09;和EasyRTMPLive&#xff08;将各种RTSP/RTMP/HTTP/UDP流转推RTMP&#xff0c;这两个服务在市场上都得到了比较多的好评&#xff0c;其中&#xff1a; 1、EasyRTSPLive用的是EasyRTSPClient取流&#xff…

信号量、互斥锁并发机制

区分&#xff1a; 信号&#xff1a;通讯机制 信号量&#xff1a;并发控制 一、信号量&#xff1a;基于阻塞的并发控制机制 a.定义信号量 struct semaphore sem; b.初始化信号量 void sema_init(struct semaphore *sem, int val); c.获得信号量P操作 int down(struct semap…

内网穿透的应用-如何使用Docker部署Redis数据库并结合内网穿透工具实现公网远程访问

文章目录 前言1. 安装Docker步骤2. 使用docker拉取redis镜像3. 启动redis容器4. 本地连接测试4.1 安装redis图形化界面工具4.2 使用RDM连接测试 5. 公网远程访问本地redis5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主要介绍如何在Ub…

QT中QApplication对象有且只有一个

QT中QApplication对象有且只有一个 QApplication对象 QApplication对象 QApplication是应用程序对象 #include <QApplication> int main(int argc,char* argv[]); {//a对象在一个程序中有且只有一个&#xff0c;QT中要求必须有一个QApplication a&#xff08;argc,argv…

RT-Thread 17. 中断发送信号量后线程去处理信号量

1. 代码 //sem.c #include <rtthread.h> #include <rtdevice.h> #include "drv_gpio.h"#define THREAD_PRIORITY 25 #define THREAD_TIMESLICE 5#define LED3_PIN GET_PIN(B, 3) ALIGN(RT_ALIGN_SIZE) static char thread3_stack[1024]; static struct…

【Spring 篇】MyBatis多表操作:编织数据的交响乐

欢迎来到MyBatis的多表操作世界&#xff01;在这个充满交响乐的舞台上&#xff0c;我们将探索如何巧妙地编织多个数据表的数据&#xff0c;创造出一场旋律动听的数据交响曲。无需繁琐的SQL拼接&#xff0c;MyBatis让多表操作变得优雅而简单。让我们一起进入这个音乐殿堂&#x…

司铭宇老师:房地产电话营销培训:房地产电话销售话术与销售技巧:打造高转化率的电话营销策略

房地产电话营销培训&#xff1a;房地产电话销售话术与销售技巧&#xff1a;打造高转化率的电话营销策略 在房地产销售中&#xff0c;电话销售是一种常见且有效的营销手段。它不仅可以快速触达潜在客户&#xff0c;还能够建立起销售人员与客户之间的初步信任关系。然而&#xff…

大模型学习之书生·浦语大模型6——基于OpenCompass大模型评测

基于OpenCompass大模型评测 关于评测的三个问题Why/What/How Why What 有许多任务评测&#xff0c;包括垂直领域 How 包含客观评测和主观评测&#xff0c;其中主观评测分人工和模型来评估。 提示词工程 主流评测框架 OpenCompass 能力框架 模型层能力层方法层工具层 支持丰富…

C++从小白到初级工程师【个人学习笔记】

目录 1.背景2.基础二维数组概念二维数组定义方式 二维数组数组名称概念例子 函数的分文件编写概念示例 指针指针的基本概念指针变量的定义和使用 空指针和野指针空指针实例野指针实例 const修饰指针概念const修饰指针 --- 常量指针 指针和数组作用示例 指针和函数作用示例 指针…

项目解决方案:某城区(区县)社会面视频监控资源接入汇聚解决方案

目 录 一、概述 二、建设目标及需求 1.建设目标 2.需求分析 2.1 总体需求 2.2 需求细化 三、方案设计 1.设计依据 2.设计原则 3.设计方案 3.1.方案描述 3.2.组网说明 四、产品介绍 1.视频监控综合资源管理平台介绍 2.视频录像服务器和存储 2.1…

Android studio 之 弹窗PopupWindow

1.准备弹窗视图 popuop_layout.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"horizontal"android:background"#00ffff&…

python算法与数据结构(搜索算法和拓扑排序算法)---深度优先搜索

课程目标 了解树/图的深度遍历&#xff0c;宽度遍历基本原理&#xff1b;会使用python语言编写深度遍历&#xff0c;广度遍历代码&#xff1b;掌握拓扑排序算法 搜索算法的意义和作用 搜索引擎 提到搜索两个子&#xff0c;大家都应该会想到搜索引擎&#xff0c;搜索引擎的基…

网络安全(初版,以后会不断更新)

1.网络安全常识及术语 资产 任何对组织业务具有价值的信息资产&#xff0c;包括计算机硬件、通信设施、IT 环境、数据库、软件、文档 资料、信息服务和人员等。 漏洞 上边提到的“永恒之蓝”就是windows系统的漏洞 漏洞又被称为脆弱性或弱点&#xff08;Weakness&#xff09;&a…

DC-7靶机做题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1w2c_QKd_hOoR2AzNrdZjMg?pwdtdky 提取码&#xff1a;tdky 参考&#xff1a; DC7靶机地址&#xff1a;http://www.five86.com/downloads/DC-7.zipDC7靶场介绍: https://www.vulnhub.com/entry/dc-7,356/…

AI+量化02_金融市场的基础概念

文章目录 问答之纯小白 vs GPT4Q1. 请用尽可能简短的语句或例子&#xff0c;给小白讲解宏观经济Q2. 给小白讲解资本边际效率Q3. 如果证券没有风险是否意味着没有收益&#xff1f;Q4. 芒格&#xff1a;教人炒股&#xff0c;犹如引人吸毒Q5. 给小白快速讲解&#xff1a;卡房统计量…

计算机速成课Crash Course - 21. 压缩

更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 21. 压缩 (qq.com) 今天继续计算机速成课Crash Course的系列讲解。 21. 压缩 上集我们讨论了文件格式&#xff0c;如何…

Java 8的新特性简单分享(后续有系列篇~敬请期待)

Java 8的新特性分享 Java 8是Java语言迎来的一次革命性的更新&#xff0c;引入了众多强大的新特性&#xff0c;使得Java开发变得更加现代化和便捷。在这篇博客中&#xff0c;我们将深入探讨Java 8的一些主要特性&#xff0c;并通过丰富的案例演示展示它们的用法。 1. Lambda表…

IN操作符

目录 IN NOT IN Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 IN IN 指的是根据一个指定的范围进行数据查询 1.查询出员工编号是 7369、7566、7788、9999 的员工信息 利用前面学的知识,得出: SQL> set linesize 250 SQL>…

快速了解spring boot中的@idempotent注解

目的&#xff1a;一定时间内&#xff0c;同样的请求(业务参数相同)访问同一个接口&#xff0c;则只能成功一次&#xff0c;其余被拒绝 幂等实现原理就是利用AOP面向切面编程&#xff0c;在执行业务逻辑之前插入一个方法&#xff0c;生成一个token&#xff0c;存入redis并插入到…

Docker(十一)Swarm mode

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Swarm mode Docker 1.12 Swarm mode 已经内嵌入 Docker 引擎&#xff0c;成为了 docker 子命令 docker swarm。请注意与旧的 Docker Swarm …