C++——函数重载及底层原理

news2024/11/25 4:38:09

函数重载的定义

函数重载:

是函数的一种特殊情况,C++允许在同一作用域重声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或者类型类型的顺序)不同,常用来处理实现功能类似数据结构不同的问题。

注意,构成函数重载的几个函数的返回值必须是同一类型的。

void Add(int a, int b)
{
	cout << a + b << endl;
}
void Add(double a, double b)
{
	cout << a + b << endl;
}
int main()
{
	Add(1, 2);
	Add(1.1, 2.2);
}

 但是,如果不再同一个域里就不存在函数重载问题了,如下:

namespace shunshun
{
   void Add(int a, int b)
   {
      cout << a + b << endl;
   }
}

namespace lili
{
   void Add(double a, double b)
   {
      cout << a + b << endl;
   }
}

稍作修改:

namespace shunshun
{
   void Add(int a, int b)
   {
      cout << a + b << endl;
   }
}

namespace shunshun
{
   void Add(double a, double b)
   {
      cout << a + b << endl;
   }
}

如上情况就会构成函数重载。

对于缺省参数:

如下,两个函数的参数个数不同,构成重载,但是会产生一定的问题。

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

void func(int a, int b = 1)
{
    cout << "void func(int a, int b)" << endl;
}

int main()
{
   func(1);//这里就会存在调用歧义,产生错误。
   return 0;
}

函数重载的原理

介绍完规则,我们来分析一下函数重载的底层原理,顺便解决一下几个问题:

1.为什么c语言不支持函数重载,而c++可以?

1.为什么函数同名而参数个数,类型,类型顺序不同就可以实现重载?

3.为什么返回值类型不同不能实现函数重载?

首先,我们得先了解一下文件的编译过程:详解编译过程(编译+链接)_LILI_Plusing的博客-CSDN博客

在编译环节,我们进行了语法,词法,语义分析并且进行了符号的汇总,以便到 汇编阶段生成符号表。

符号表是用来干什么的呢?

简单来说,就是我们调用函数时,要根据符号表,找到函数名,然后找到其地址,才能调用。

​​​​​​笔记-函数栈帧的创建和销毁_LILI_Plusing的博客-CSDN博客

 调用函数时,产生call指令,跳转到函数的第一句代码的地址处,即符号表中的函数弟子为函数定义中的第一句代码地址,即函数如果只声明不定义,就无法生成指令,没有地址。

c语言中的符号表生成时,按照函数名+地址进行生成,也就是说,如果两个函数名相同,则会导致符号表生成异常,这就是为什么c语言不支持函数重载。

 

 

但是c++为什么支持呢?

原因就是,其生成的符号表,不是按照函数名+地址的格式,而是对函数名进行一定的修饰,而且有自己的修饰规则

比如,LINUX下:

 函数名修饰为:_Z4funcid

 这里的修饰规则就是_Z+函数名所占字节数+函数名+参数类型的首字母

这就是为什么函数名相同,但是函数参数,参数类型和类型顺序不同就可以实现重载的原因。

最后一个问题,因为函数名修饰规则与函数的返回类型无关,所以如果只有返回类型不同,也不能实现函数重载。

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

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

相关文章

超好用的接口自动化框架,lemon-easytest内测版发布,赶紧用起来~

easytest easytest 是一个接口自动化框架。 功能特点&#xff1a; 支持 http 接口测试 支持 json&#xff0c;html,xml 格式的响应断言 支持数据库断言 支持用例标记筛选 支持用例失败重运行 支持多线程 安装 pip install lemon_easytest 快速使用 不需要写任何代码…

wsl没有响应,wsl启动失败,docker启动失败

wsl的相关问题记录和解决 问题一&#xff1a;cmd命令窗口输入wsl后没有响应&#xff0c;会卡住&#xff0c;类似如图 排查&#xff1a; 输入 wsl -l -v看是否有东西输出&#xff1b;我的电脑没有东西输出&#xff0c;依旧是卡住;有内容请重启试试从开始菜单打开&#xff0c;点…

【Git】大大大问题之syntax error near unexpected token `(‘ 的错误解决办法

话不多说&#xff0c;先上图&#xff1a; 如图&#xff0c;因为在linux环境里&#xff0c;文件路径中含有括号&#xff08;&#xff09;&#xff0c;因此报错&#xff01; 解决办法 等同于 &#xff1a;linux下解决bash: syntax error near unexpected token (’ 的错误&am…

【中危】Apache Airflow Drill Provider < 2.4.3 存在任意文件读取漏洞

漏洞描述 Apache Airflow Drill Provider 是 Apache Airflow 项目中的一个模块&#xff0c;用于提供与 Apache Drill 数据引擎的集成。 2.4.3 之前版本中&#xff0c;由于 drill#create_engine 方法未对用户传入的 url 参数进行过滤&#xff0c;攻击者可构造恶意的查询参数&a…

MYSQL-习题掌握

文章目录 SQL基本操作1 设计表操作1.1 关系表字段1.2 关系表创建1.3 关系表数据1.4 关系表关系 2 SQL操作2.1 SQL 1-102.2 SQL 11-202.3 SQL 21-302.4 SQL 31-402.5 SQL 41-50 SQL基本操作 1 设计表操作 1.1 关系表字段 1 学生表 student s_ids_names_births_sex学生编号学…

第二部分:AOP

一、AOP简介 AOP(Aspect Oriented Programming)面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结构。 AOP是OOP&#xff08;面向对象编程&#xff09;的进阶版。 作用&#xff1a;在不改变原始设计的基础上为其进行功能增强。 spring理念&#x…

STM32入门——USART

江科大STM32学习记录 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 串口通信 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、…

Web菜鸟教程 - Swagger实现自动生成文档

如果是一个人把啥都开发了&#xff0c;那用不到Swagger-UI&#xff0c;但一般情况是前后端分离的&#xff0c;所以就需要告诉前端开发人员都有哪些接口&#xff0c;传入什么参数&#xff0c;怎么调用&#xff0c;返回什么。有了Swagger-UI就能把这部分文档编写的业务给省去了。…

Wlan——CAPWAP隧道的建立过程

CAPWAP基本概念 CAPWAP全称为无线接入点的控制和配置协议&#xff08;Control And Provisioning of Wireless Access Points Protocol Specification&#xff09; CAPWAP协议主要作用 1、AP可以通过CAPWAP实现自动发现AC 2、AC通过CAPWAP协议对AP进行管理、业务配置下发 3…

一百五十二、Kettle——Kettle9.3.0本地连接Hive3.1.2(踩坑,亲测有效)

一、目的 由于先前使用的kettle8.2版本在Linux上安装后&#xff0c;创建共享资源库点击connect时页面为空&#xff0c;后来采用如下方法&#xff0c;在/opt/install/data-integration/ui/menubar.xul文件里添加如下代码 <menuitem id"file-openZiyuanku" label&…

CKEditor5 爬坑.

CKEditor5 爬坑 exportpdf.d.ts ChatGPT 推荐我使用CKEditor,确实比UEditor高不少档次。 但是如果你想使用控件中的 PDF导出,Word导入导出。 你可能需要三思。 因为其PDF导出是通过美国云服务的。 exportpdf.d.ts /*** license Copyright (c) 2003-2023, CKSource Holding sp.…

ROSpider机器人评测报告

ROSpider机器人评测报告 最近入手了一款ROSpider六足仿生机器人&#xff0c;ROSpider是一款基于ROS 操作系统开发的智能视觉六足机器人。 外观 外观上ROSpider六足机器人如同名字一样有六只机械腿&#xff0c;整体来看像一只六腿的蜘蛛。腿上的关节处用了明亮的橙黄色很是显…

小红书运营 公司账号怎么做?

大家好&#xff0c;我是网媒智星&#xff0c;今天跟大家讨论一下一个人如何运营公司小红书账号&#xff1f; 之前有位同事告诉我&#xff1a;“老板对小红书不太了解&#xff0c;所以我一个人负责整个新媒体部门的运营工作&#xff0c;包括小红书、公众号、微博和抖音。就像一个…

黑客必备的操作系统——kali linux安装

大家经常会在电视里面看到各种炫酷的黑客操作&#xff0c;那么黑客一般用什么操作系统呢&#xff1f;今天小训带大家来安装黑客必备的kali linux-2022操作系统&#xff0c;有兴趣的一起来学习下吧&#xff01; 1、安装前准备 1.1 VMware下载 VMware官网下载&#xff1a; ht…

租车服务小程序DIY,让你成为租车平台的主人

汽车租赁行业正迎来快速发展的时代&#xff0c;随着人们对出行方式需求的增加&#xff0c;汽车租赁成为了一种便捷、经济的选择。而随着移动互联网的普及&#xff0c;微信小程序成为了一种理想的平台&#xff0c;为汽车租赁企业打造一个高效的租车平台。 首先&#xff0c;我们需…

P1955 [NOI2015] 程序自动分析

题目 思路 第一眼&#xff1a;非常简单的并查集 看看标签 6 为什么离散化会WARE呢 首先&#xff0c;并查集是根据f数组来联系两点的&#xff0c;类似于f[x]y&#xff0c;但是在这个题中我们不能确定x是否为非负整数&#xff0c;而且x过大也会炸内存 那就加一个离散化吧 输入…

Linux服务使用宝塔面板搭建网站,通过内网穿透实现公网访问

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

案例16 基于Spring Boot实现学生新增案例

基于Spring Boot实现学生新增。 1. 创建Spring Boot项目 创建Spring Boot项目&#xff0c;项目名称为case16-springboot-student01。 ​ 2. 设置项目信息 ​ 3. 选择依赖 选择Lombok ​ 选择Spring Web ​ 4. 设置项目名称 ​ 5. Maven依赖 <?xml version"1.0&qu…

SyntaxError: Cannot use import statement outside a module

node环境运行报错&#xff1a; 解决步骤&#xff1a; 1. npm init -y 2. 在 package.json 文件中加入一条&#xff1a;"type": "module", 3. 保存后再执行即可 附&#xff1a;最好是不要在node用import&#xff0c;否则需要上次配置 建议1&#xff1a;用re…

【网络】传输层——TCP(滑动窗口流量控制拥塞控制延迟应答捎带应答)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 上篇文章对TCP可靠性机制讲解了一部分&#xff0c;这篇文章接着继续讲解。 &#x1f3a8;滑动窗口 在…