C++ | 函数重载是什么意思?【面试题】C++支持函数重载的原理是什么?详细讲解

函数重载

一个词有多种含义,可以通过上下文来判断该词的真实含义,即该词被重载了。

“同一个函数名,由于参数个数不同、类型结构不同,在c++能够同时使用”

函数重载概念及分类

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

注:函数重载时返回值的类型可以相同也可以不同。

参数类型不同 
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;
}int main()
{Add(25, 10);Add(2.5, 3.0);return 0;
}
参数个数不同 
//2、参数个数不同
void f()
{cout << "f()" << endl;
}void f(int a)
{cout << "f(int a)" << endl;
}int main()
{f();f(2.5);return 0;
}
 参数类型顺序不同
//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()
{f(10, 'a');f('a', 10);return 0;
}

C++支持函数重载的原理

原因

在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。

在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参

数类型信息添加到修改后的名字中。

C++是通过函数修饰规则来区分的,只要参数不同,修饰出来的名字就不同,就支持了重载;

C语言是通过原本函数名称来查找的,因为同名函数没有办法区分。

原理分析

翻译的过程

gcc命令

说明

预处理

(进行宏替换)

gcc -E test.c -o test.i

-E 让gcc在预处理结束后,就停止编译

“从现在开始进行程序的翻译,预处理完成,就停下来”

宏替换

去注释

头文件展开

条件编译

编译

(生成编译)

gcc -S test.i -o test.s

-S 只进行编译不进行汇编,生成汇编代码

“从现在开始进行程序的编译,汇编完成就停下来”

检查代码规范性

检查语法错误

(确认无误后汇编)

C语言代码翻译成汇编语言

汇编

gcc -C test.o -o test.o

-C “从开始带现在进行程序的翻译”,汇编完成就停下来

将汇编语言编译成二进制目标文件

链接

gcc test.o -o my.exe

形成可执行程序

  1. 在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。
  2. 在实际的项目中,是有很多个源文件构成的;
  3. 例如,如果A.cpp调用了B.cpp文件中的某个函数时,因为这个函数是在B.cpp文件中定义的,所以这个函数的地址就在B.o这个文件中;
  4. 那么链接就是解决这个问题的;
  5. 链接器看到A.cpp调用了这个函数,但是没有这个函数的地址,就会到B.o的符号表中找到这个函数的地址,然后链接在一起;
  6. 那么是如何找到B.o的文件,再通过B.o文件找到这个函数的地址呢?
  7. 每个编译器都有自己的函数名修饰规则;
  8. “由于Windows下vs的修饰规则过于复杂,而Linux下g++的修饰规则简单易懂,下面我们使用了g++演示了这个修饰后的名字”;
  9. 通过下面我们可以看出:
  10. 在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。
  11. 在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中。
不同语言编译器函数修饰名字

通过gcc编译(C语言)的函数修饰后名字不变

通过g++编译(C++语言)的函数修饰后变成【_Z+函数长度+函数名+类型首字母】。

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

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

相关文章

IO多路复用-select(附通信代码)

IO多路复用-select 1. IO多路复用概述 I/O多路复用&#xff08;I/O Multiplexing&#xff09;是一种通过一种机制同时监听多个文件描述符&#xff08;sockets、文件、设备等&#xff09;的技术。它可以使一个进程在等待多个 I/O 操作完成时不会阻塞&#xff0c;从而提高程序的…

Golang 定时任务的几种实现方法

摘要&#xff1a;在 Golang 开发中&#xff0c;定时任务是常见的需求。本文将介绍几种在 Golang 中实现定时任务的方法&#xff0c;包括 time 包的定时器、ticker&#xff0c;以及第三方库 cron&#xff0c;并通过示例代码展示它们的使用方式。 一、time 包的定时器&#xff08…

luceda ipkiss教程 57:画微环调制器

案例分享&#xff1a;画微环调制器 全部代码如下&#xff1a; from si_fab import all as pdk from ipkiss3 import all as i3class DC(i3.PCell):straight_length i3.PositiveNumberProperty(default200)radius i3.PositiveNumberProperty(default50)spacing i3.Positive…

Spring Cloud Gateway 路由配置策略

Spring Cloud Gateway 路由配置策略 Spring Cloud Gateway 是一个基于 Spring Boot 2.x 和 Spring WebFlux 的轻量级网关服务&#xff0c;用于构建微服务架构中的 API 网关。它提供了一种简单、高效、灵活和可扩展的方式来路由请求到后端的微服务。 Spring Cloud Gateway 的核心…

幻兽帕鲁PalWorld服务器搭建详细教程

幻兽帕鲁PalWorld是一款由Pocketpair开发的游戏&#xff0c;融合了多种玩法&#xff0c;其独特的题材和画风吸引了很多玩家。为了更好地进行游戏体验&#xff0c;很多玩家选择自行搭建服务器。本文将详细介绍如何搭建幻兽帕鲁PalWorld服务器。 第一步&#xff1a;购买服务器 根…

Unity | 渡鸦避难所-8 | URP 中利用 Shader 实现角色受击闪白动画

1. 效果预览 当角色受到攻击时&#xff0c;为了增加游戏的视觉效果和反馈&#xff0c;可以添加粒子等动画&#xff0c;也可以使用 Shader 实现受击闪白动画&#xff1a;受到攻击时变为白色&#xff0c;逐渐恢复为正常颜色 本游戏中设定英雄受击时播放粒子效果&#xff0c;怪物…

verilog的模块参数定义

在Verilog中&#xff0c;模块参数定义的定义分为两种&#xff1a;模块声明时定义的参数和模块体内部定义的参数。 模块声明时定义的参数&#xff08;Module Parameter&#xff09;&#xff1a; 模块声明时定义的参数是在模块实例化时提供的常量值。它们是通过模块实例化语句的参…

小程序直播项目搭建

项目功能&#xff1a; 登录实时聊天点赞功能刷礼物取消关注用户卡片直播带货优惠券直播功能 项目启动&#xff1a; 1 小程序项目创建与配置&#xff1a; 第一步 需要登录小程序公众平台的设置页面进行配置&#xff1a; 首先需要是企业注册的才可以个人不能开通直播功能。服务类…

extends 和 implements

以下是 extends 和 implements 在Java代码中的区别和示例&#xff1a; 示例1&#xff1a;使用 extends 实现类继承 // 定义一个父类 Animal public class Animal {public void eat() {System.out.println("动物在吃东西");}public void sleep() {System.out.printl…

java获取一段视频/mp4的时长

引言 在日常开发中&#xff0c;经常会遇到产品经理提出一个需求“上传视频”&#xff0c;而且还得显示出视频的播放时长&#xff0c;我们直接上最简单的代码&#xff0c;必须是最简单&#xff0c;多一句啰嗦都不准点赞。 How to do 1.提前引入包 <!--视频多媒体工具包 包…

Java-Objec

Objec Class Object是类Object结构的根。 每个班都有Object作为超类。 所有对象&#xff08;包括数组&#xff09;都实现了这个类的方法。 一.构造 二.常用方法 Modifier and TypeMethod and Descriptionprotected Objectclone() 创建并返回此对象的副本。 booleanequals(Obj…

【typescript】记录typescript可运行的demo工程

ypescript可运行的工程&#xff08;本包不包含依赖&#xff09; 1、通过 yarn 自行 下载依赖 2、然后运行yarn serve https://download.csdn.net/download/HWTwilight/88778733

现在你还不知道怎么使用宝塔面板嘛,下面带你从某里云购域名开始

1. 注册阿里云账号 首先&#xff0c;你需要注册一个阿里云账号。访问阿里云官网&#xff0c;点击右上角的"注册"按钮&#xff0c;按照指示填写相关信息并完成注册。 2. 购买域名 在成功注册并登录后&#xff0c;点击顶部导航栏中的"域名"选项&#xff0…

嵌入式学习-网络编程-Day8

1.进程与线程区别 异 1.进程是资源分配的最小单位&#xff0c;线程是执行任务的最小单位 2.颗粒度不一&#xff0c;进程分配4G的虚拟内存&#xff0c;线程占用8K内存 3.进程创建后&#xff0c;进程之间的资源相互独立&#xff1b;同一进程中的线程共享进程的资源 4.线程是进程…

【Docker】Docker学习④ - Docker镜像与制作

【Docker】Docker学习④ - Docker镜像与制作 一、Docker简介二、Docker安装及基础命令介绍三、Docker镜像管理四、Docker镜像与制作1. 手动制作yum版nginx镜像2. DockerFile制作yum版nginx镜像3. 手动制作编译版本nginx镜像4. 自定义tomcat镜像5. 构建haproxy镜像6. 本地镜像上…

mybatisplus做SQL拦截添加自定义排序

前言 工作中写的一段代码&#xff0c;备个份&#xff0c;以后兴许能直接用 功能描述&#xff1a;如果前端传入了排序规则&#xff0c;则优先按传入的字段进行排序&#xff0c;SQL原有的排序规则追加到末尾 正文 定义拦截器 import cn.hutool.core.bean.BeanUtil; import cn.h…

应用实践|基于Python手把手教你实现雪花算法

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注、&#x1f44d;点赞、&…

【机器学习300问】17、什么是欠拟合和过拟合?怎么解决欠拟合与过拟合?

一个问题出现了&#xff0c;我们首先要描述这个问题&#xff0c;然后分析问题出现的原因&#xff0c;找到原因后提出解决方案。废话不多说&#xff0c;直接上定义&#xff0c;然后通过回归和分类任务的例子来做解释。 一、什么是欠拟合和过拟合&#xff1f; &#xff08;1&am…

文件上传技术总结

语言可解析的后缀 &#xff08;前提&#xff1a;在Apache httpd.conf 配置文件中有特殊语言的配置 AddHandler application/x-httpd-php .php 搭配大小写、双重、空格来进行 其中&#xff1a; phtml、pht、php3、php4和php5都是Apache和php认可的php程序的文件后缀 常见的…

解决vld内存泄露检测工具只支持到vs2015的问题,visual studio2015以上版本安装vld内存泄漏检测工具[实测vs2022生效]

目录 一.vld工具下载二.vld应用安装三.visual studio2022环境配置四.visual studio2022 vld内存检测测试 一.vld工具下载 Visual Leak Detector github链接: https://kinddragon.github.io/vld/ 下载直达链接: https://github.com/KindDragon/vld/releases/tag/v2.5.1 下拉至…