浅谈C++的函数重载

今天我们来谈谈C++的函数重载😊😊😊,对于函数重载,我们首先需要理解几个问题:

  • 1、什么是函数重载 ?
  • 2、函数重载需要注意什么 ?
  • 3、为什么C语言不支持函数重载,而C++支持 ?

接下来我们将会对此进行一一讲解

浅谈C++的函数重载——三个问题

    • 一、什么是函数重载?
    • 二、函数重载需要注意什么?
    • 三、为什么C语言不支持函数重载,而C++支持 ?

一、什么是函数重载?

对于一组函数,在其函数名都相同、参数列表的数目或类型不同的前提下,加上它们都属于同一个作用域中,那么我们就可以把它们称作函数重载。即,如下常见的比较重载函数,分别用于intdoubleconst char* 之间的大小比较

bool compare(int a, int b) //compare_int_int
{
	cout << "compare_int_int" << endl;
	return a > b;
}

bool compare(double a, double b) //compare_double_double
{
	cout << "compare_double_double" << endl;
	return a > b;
}

bool compare(const char* a, const char* b) //compare_char*_char*
{
	cout << "compare_char*_char*" << endl;
	return a > b;
}

二、函数重载需要注意什么?

  • 声明的位置: 编译器会优先在离函数调用点最近的作用域寻找是否有对应函数的声明,一旦找到则会立即调用该函数,如若我们在全局范围内定义了相关函数重载的内容,同时又在即将调用重载函数的局部作用域中声明了同名、同参数列表的函数声明,编译器则会之间使用局部作用域的函数声明,而忽略了之前我们在全局范围写的
... compare(int a, int b)
... compare(double a, double b)
... compare(const char* a, const char* b)

int data = 10;

int main()
{
	int data = 10;
	int a = ::data;  //作用域不同

	bool compare(int a, int b); //函数声明

	compare(10, 2);
	compare(1.0, 2.0);
	compare("aaa", "bbb"); 
	//编译器在离他最近的作用域找是否有函数的声明,一旦找到,就直接调用

	return 0;
}

假如我们直接在全局写两个函数重载,一个参数为const int,另一个为int;获取将它们换为一个参数为const int*,另一个为int*,会发生什么???🤔🤔(这里涉及到const 和 volatile 对形参的影响,以后再讲)

void func(int a) {}  //int  符号一模一样
void func(const int a) {} //int  

int main()
{
	int a = 10; const int b = 10;
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	return 0;
}

这里还涉及到一个问题:C++与C语言代码之间是不能够随意调用的,放在下面(第三点)讲

三、为什么C语言不支持函数重载,而C++支持 ?

  • C语言在生成函数符号时,只有函数名决定,若出现多个函数名相同的情况,会导致链接错误
  • 而C++代码在产生函数符号时,由函数名名和参数列表决定,由不同的参数列表而来的函数符号各不相同,因此C++语言支持函数重载,同时也因为这个,仅仅是靠返回值不同的函数不能称作重载函数

情况一:C++调用C代码,需要使用 extern "C" 将函数声明括起来,这是为了使之以C语言的规则来生成函数符号,防止出现无法解析的外部符号 "int __cdecl sum(int,int)" (? sum@@YAHHH@Z),函数 main 中引用了该符号
在这里插入图片描述


在使用了 extern "C"
在这里插入图片描述


情况二:C语言调用C++代码(有人可能会问,同样在C语言中使用extern,但其关键字是C++里面的,它不可在C语言中出现,那么我们需要得把它的定义写在 extern "C" 里)
在这里插入图片描述

实际上,我们可以通过一个预处理指令 #ifdef 来处理C代码和C++代码之间调用可能会出现的问题,如下代码所示:

#ifdef __cplusplus  //C++文件
extern "C" {
#endif
	int sum(int a, int b)  
	{
		return a + b;
	}
#ifdef __cplusplus   //C++文件
}
#endif

如若是C++代码文件,则会将整段代码执行一遍,按C语言的标准来生成函数符号;如若是C代码文件,则直接定义相关函数即可。这里就实现了C++与C语言之间通用的代码调用


🌻🌻🌻以上就是有关浅谈C++的函数重载的内容,如果聪明的你浏览到这篇文章并觉得文章内容对你有帮助,请不吝动动手指,给博主一个小小的赞和收藏 🌻🌻🌻

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity在UGUI上通过绘制网格顶点自由画线

该插件的实现是使用UI组件的绘图API来动态生成和修改几何形状&#xff0c;可自由动态更改画线的粗细、拐角圆滑度、颜色&#xff0c;自由增减节点&#xff0c;不额外增加gameobject&#xff0c;并且在原生的UGUI上以ScreenSpace-Overlay的状态下&#xff0c;显示效果如下所示 …

【PyTorch】基础学习:一文详细介绍 load_state_dict() 的用法和应用

【PyTorch】基础学习&#xff1a;一文详细介绍 load_state_dict() 的用法和应用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#…

【AI】Ubuntu系统深度学习框架的神经网络图绘制

一、Graphviz 在Ubuntu上安装Graphviz&#xff0c;可以使用命令行工具apt进行安装。 安装Graphviz的步骤相对简单。打开终端&#xff0c;输入以下命令更新软件包列表&#xff1a;sudo apt update。之后&#xff0c;使用命令sudo apt install graphviz来安装Graphviz软件包。为…

使用 GitHub Actions 通过 CI/CD 简化 Flutter 应用程序开发

在快节奏的移动应用程序开发世界中&#xff0c;速度、可靠性和效率是决定项目成功或失败的关键因素。持续集成和持续部署 (CI/CD) 实践已成为确保满足这些方面的强大工具。当与流行的跨平台框架 Flutter 和 GitHub Actions 的自动化功能相结合时&#xff0c;开发人员可以创建无…

网络安全实训Day5

写在前面 昨天忘更新了......讲的内容不多&#xff0c;就一个NAT。 之前记的NAT的内容&#xff1a;blog.csdn.net/Yisitelz/article/details/131840119 网络安全实训-网络工程 NAT 公网地址与私网地址 公网地址 可以在互联网上被寻址&#xff0c;由运营商统一分配全球唯一的I…

GAN及其衍生网络中生成器和判别器常见的十大激活函数(2024最新整理)

目录 1. Sigmoid 激活函数 2. Tanh 激活函数 3. ReLU 激活函数 4. LeakyReLU 激活函数 5. ELU 激活函数 6. SELU 激活函数 7. GELU 激活函数 8. SoftPlus 激活函数 9. Swish 激活函数 10. Mish 激活函数 激活函数(activation function)的作用是对网络提取到的特征信…

字母异位词分组【每日一题】

可以通过案例找到规律&#xff0c;每个词排序完后是同一个&#xff0c;所以通过hasmap存储排序过的值做key&#xff0c;值是存储单词集合。 package HasTable;import java.util.*;class Solution {static List<List<String>> groupAnagrams(String[] strs) {Map&l…

(官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell

前言 查了很多资料都不靠谱&#xff0c;在安装过程中遇到很多的坑&#xff0c;mangoDB 服务重视起不来&#xff1b;出现了很多难以解决的报错&#xff0c;现在把安装过程中遇到的问题&#xff0c;和如何闭坑说一下&#xff0c;很多时候都是准备工作不足导致的&#xff1b;很多方…

瑞_Redis_短信登录_Redis代替session的业务流程

文章目录 项目介绍1 短信登录1.1 项目准备1.2 基于Session实现登录流程1.3 Redis代替session的业务流程1.3.1 设计key的结构1.3.2 设计key的具体细节1.3.3 整体访问流程1.3.4 代码实现 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《Redis》的实战篇的短信登录章节的R…

论文阅读_参数微调_P-tuning_v2

1 P-Tuning PLAINTEXT 1 2 3 4 5 6 7英文名称: GPT Understands, Too 中文名称: GPT也懂 链接: https://arxiv.org/abs/2103.10385 作者: Xiao Liu, Yanan Zheng, Zhengxiao Du, Ming Ding, Yujie Qian, Zhilin Yang, Jie Tang 机构: 清华大学, 麻省理工学院 日期: 2021-03-18…

电脑文件误删除如何恢复?分享三个简单数据恢复方法

在日常使用电脑的过程中&#xff0c;文件误删除的情况时有发生。无论是由于操作失误还是病毒感染&#xff0c;丢失的文件都可能对我们的工作和学习造成极大的影响。因此&#xff0c;掌握文件恢复的方法显得尤为重要。下面围绕“电脑文件误删除如何恢复”这一主题&#xff0c;给…

小狐狸ChatGPT智能聊天系统源码v2.7.6全开源Vue前后端+后端PHP

测试环境包括Linux系统的CentOS 7.6&#xff0c;宝塔面板&#xff0c;PHP 7.4和MySQL 5.6。网站的根目录是public&#xff0c; 使用thinkPHP进行伪静态处理&#xff0c;并已开启SSL证书。 该系统具有多种功能&#xff0c;包括文章改写、广告营销文案创作、编程助手、办公达人…

AI 初创公司趋势:Y Combinator 最新批次的见解

总部位于硅谷的著名创业加速器 Y Combinator (YC) 最近宣布了其 2023 年冬季队列&#xff0c;不出所料&#xff0c;约 31% 的初创公司&#xff08;269 家中有 80 家&#xff09;拥有自我报告的 AI 标签。在这篇文章中&#xff0c;我分析了这批 20-25 家初创公司&#xff0c;以了…

kafka集群介绍

介绍 kafka是一个高性能、低延迟、分布式的消息传递系统&#xff0c;特点在于实时处理数据。集群由多个成员节点broker组成&#xff0c;每个节点都可以独立处理消息传递和存储任务。 路由策略 发布消息由key、value组成&#xff0c;真正的消息是value&#xff0c;key是标识路…

【C语言】九九乘法表

1&#xff0c;确定每一行何时结束 2&#xff0c;确定该定义哪些变量&#xff08;i,j&#xff09; 3&#xff0c;确定变量该如何取值&#xff08;1~9&#xff09; 代码如下&#xff1a; #include<stdio.h> int main() { for (int i 1;i < 9;i) { for (…

LabVIEW提升舱救援通讯监测系统

LabVIEW提升舱救援通讯监测系统 随着科技的进步&#xff0c;煤矿救援工作面临着许多新的挑战。为了提高救援效率和安全性&#xff0c;设计并实现了一套基于LabVIEW的提升舱救援通讯监测系统。该系统能够实时监控提升舱内的环境参数和视频图像&#xff0c;确保救援人员和被困人…

使用map和set实现简单的词频统计

一、运行效果图 二、代码示例 #include <iostream> #include <fstream> #include <sstream> #include <string> #include <map> #include <set> #include <vector> #include <algorithm> using namespace std;class TextQuer…

Vue2(四):Vue监测数据的原理

一、先来看一个问题 添加一个按钮点击更新马冬梅的信息&#xff1a; <button click"gengxin">点击更新马冬梅的信息</button> methods:{gengxin(){this.person[1].name马老师,this.person[1].age50,this.person[1].sex男}} 下面这种方式就不能奏效&a…

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充 code review! —— 杭州 2024-03-17 夜 文章目录 操作系统笔记之进程调用API中的getpid、fork、wait、exec补充1.getpid()2.fork()3.wait()4.exec()5.通常&#xff0c;exec() 调用与 fork() 调用一起使用&#xff…

CentOS 7 编译安装 Git

CentOS 7 编译安装 Git 背景来源删除旧版本 Git安装依赖包下载 Git 源代码检验相关依赖&#xff0c;设置安装路径编译安装添加 Git 环境变量重新加载配置文件查看版本号参考文献 背景来源 为什么要安装新版本呢&#xff1f; 因为无聊&#xff0c;哈哈哈&#xff0c;其实也不是…