C++——函数重载及底层原理
函数重载的定义
函数重载:
是函数的一种特殊情况,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+函数名所占字节数+函数名+参数类型的首字母
这就是为什么函数名相同,但是函数参数,参数类型和类型顺序不同就可以实现重载的原因。
最后一个问题,因为函数名修饰规则与函数的返回类型无关,所以如果只有返回类型不同,也不能实现函数重载。
相关文章:

C++——函数重载及底层原理
函数重载的定义 函数重载: 是函数的一种特殊情况,C允许在同一作用域重声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或者类型,类型的顺序)不同,常用来处理实现功能类似数据结构…...

Ceph入门到精通-Aws Iam(user,role,group,policy,resource)架构图和快速入门
-- Aws Iam(identity,user,role,group,policy,resource,)架构图和快速入门. 【官网】:Cloud Computing Services - Amazon Web Services (AWS) 应用场景 aws 云服务运维,devops过程中经常涉及各项服务,权限,角色的处理。 为了更好的使用各项…...

【kubernetes】k8s高可用集群搭建(三主三从)
目录 【kubernetes】k8s高可用集群搭建(三主三从) 一、服务器设置 二、环境配置 1、关闭防火墙 2、关闭selinux 3、关闭swap 4、修改主机名(根据主机角色不同,做相应修改) 5、主机名映射 6、将桥接的IPv4流量…...

凸优化基础学习——凸集
凸优化基础学习——凸集 文章内容全部来自对Stephen Boyd and Lieven vandenberghe的Convex Optimization的总结归纳。 电子书资源: 链接:https://pan.baidu.com/s/1dP5zI6h3BEyGRzSaJHSodg?pwd0000 提取码:0000 基本概念 仿射集合 **…...
oracle 19c环境常见问题汇总
1、rman备份时会消耗这么多临时表空间 参考MOS: RMAN-08132: Warning: Cannot Update Recovery Area ORA-01652: unable to extend temp segment by 64 in tablespace TEMP (Doc ID 2658437.1) Known RMAN Performance Problems (Doc ID 247611.1) 处理办法&…...
django实现悲观锁乐观锁
前期准备 # 线上卖图书-图书表 图书名字,图书价格,库存字段-订单表: 订单id,订单名字# 表准备class Book(models.Model):name models.CharField(max_length32)price models.IntegerField() #count models.SmallIntegerField…...

vector【2】模拟实现(超详解哦)
vector 引言(实现概述)接口实现详解默认成员函数构造函数析构函数赋值重载 迭代器容量size与capacityreserveresizeempty 元素访问数据修改inserterasepush_back与pop_backswap 模拟实现源码概览总结 引言(实现概述) 在前面&…...

金融助贷公司怎么获客——大数据获客
2023年已过去大半,整个贷款领域遭遇的现象仍然是拓客难、拓客贵、顾客精确度不高难题。从业者工作压力与日俱增,每日遭遇各种各样考评,因此大家并不是在开发客户便是在开发客户的路上。贷款市场销售艰难变成一个问题,很多贷款营销…...

Java进阶-Oracle(二十一)(2)
🌻🌻 目录 一、Oracle 数据库的操作(DDL DML DQL DCL TPL)1.1 标识符、关键字、函数等1.1.1 数值类型:1.1.2 字符串类型:1.1.3 日期类型1.1.4 大的数据类型--适合保存更多的数据 1.2 运算符1.3 函数---预定义函数、自定义函数&…...

SpringCloud实用篇4——MQ RabbitMQ SpringAMQP
目录 1 初识MQ1.1 同步和异步通讯1.1.1 同步通讯1.1.2 异步通讯 1.2 技术对比 2.快速入门2.1 安装RabbitMQ2.1.1 单机部署2.1.2集群部署 2.2 RabbitMQ消息模型2.3.导入Demo工程2.4 入门案例2.4.1 publisher实现2.4.2 consumer实现 3 SpringAMQP3.1 Basic Queue 简单队列模型3.1…...

【BASH】回顾与知识点梳理(二十二)
【BASH】回顾与知识点梳理 二十二 二十二. Linux 账号管理22.1 Linux 的账号与群组使用者标识符: UID 与 GID使用者账号/etc/passwd 文件结构/etc/shadow 文件结构 关于群组: 有效与初始群组、groups, newgrp/etc/group 文件结构有效群组(effective grou…...

shell脚本之正则表达式
目录 一.常见的管道命令1.1sort命令1.2uniq命令1.3tr命令1.4cut命令1.5实例1.5.1统计当前主机连接状态1.5.2统计当前主机数 二.正则表达式2.1正则表达式的定义2.2常见元字符(支持的工具:find,grep,egrep,sed和awk&…...

将SM2根证书预置到chromium中
最近花了很多精力在做chromium的GmSSL适配,协议和算法都已经完成,这篇文章是关于将SM2根证书预置到chromium中 我的开发测试环境是macos12.4,从chromium的代码和文档中得知证书获取和校验都是通过操作系统以及native api接口完成,…...

linux安装mysql-8.0.33正确方式及常见问题
目录 获取mysql下载地址链接 解压安装包 复制文件到安装目录 添加用户和用户属组修改权限 创建存储数据的文件夹/usr/local/mysql 初始化安装 修改配置文件 创建日志文件并赋予对应权限 启动成功编辑 创建软链接 之前安装过mysql,时间比较长忘记安装步骤了今天…...

Vim的插件管理器之Vundle
1、安装Vundle插件管理器 Vim可以安装插件,但是需要手动安装比较麻烦,Vim本身没有提供插件管理器,所以会有很多的第三方的插件管理器,有一个vim的插件叫做 “vim-easymotion”,在它的github的安装说明里有列出对于不同…...

机器学习丨1. 机器学习概述
Author:AXYZdong 硕士在读 工科男 有一点思考,有一点想法,有一点理性! 定个小小目标,努力成为习惯!在最美的年华遇见更好的自己! CSDNAXYZdong,CSDN首发,AXYZdong原创 唯…...

清除pip安装库时的缓存
目录 1、命令清除缓存 2、路径手动清除 在使用pip安装Python库时,如果之前已经下载过该库,pip会默认使用缓存来安装库,而不是重新从网络上下载。缓存文件通常存储在用户目录下的缓存文件夹中,具体位置因操作系统和Python版本而异…...

gitee上传一个本地项目到一个空仓库
gitee上传一个本地项目到一个空仓库 引入 比如,你现在本地下载了一个半成品的框架,现在想要把这个本地项目放到gitee的仓库上,这时就需要我们来做到把这个本地项目上传到gitee上了。 具体步骤 1. 登录码云 地址:https://gite…...

力扣:63. 不同路径 II(Python3)
题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从…...

【C语言】每日一题(多数元素)
多数元素,链接奉上 方法 1.摩尔投票2.合理但错误的方法2.1暴力循环2.2排序求出中间元素中间元素 1.摩尔投票 先来简单的介绍摩尔投票: 摩尔投票是一种用来解决绝对众数问题的算法。 什么是绝对众数呢? 在一个集合中,如果一个元素…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...