C++函数重载

目录

函数重载的用法

函数重载的剖析


函数重载的用法

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

要点概括:

  1. 发生函数重载的条件是:参数的类型、个数、顺序不同。而且,返回值不同的情况不能发生重载,这并不是因为技术层面做不到,而是因为太容易发生歧义了。参考:为什么函数重载不可以根据返回类型区分? - 知乎 (zhihu.com)
  2. 函数的重载只发生在同一个作用域内(因为每一个作用域都是相互独立的)
  3. 缺省值作为函数重载的条件时需要注意二义性。
  4. 引用作为函数重载的条件时需要注意二义性。

这里的二义性不是说不能发生重载,而是发生重载之后在实际使用的过程中会造成冲突。

函数重载的剖析

理解函数重载的原理之前,我们需要先认识三个东西:符号表、函数签名、函数名修饰。

符号表是在计算机科学中用于存储程序中定义的标识符(例如变量、函数、类名等)及其相关信息的数据结构。符号表通常是一个类似于字典或映射的数据结构,其中每个标识符都与其关联的信息(如类型、作用域、地址等)相关联。符号表的目的是跟踪程序中的标识符,以便在需要时能够快速索引到它们。

在编译过程中,编译器使用符号表来进行语义分析和类型检查。

函数签名是指函数的类型及其参数的类型和顺序。它描述了函数的输入参数和返回值的特征,以及函数名。函数签名用于区分不同的函数并确保在调用函数时正确匹配参数。

函数签名通常由函数名和参数列表组成,参数列表包括参数的类型、顺序和个数。函数签名不包括函数的实现细节,只关注函数的接口,它是函数的抽象表示。

函数签名的重要性在于它允许编译器、解释器和其他代码使用者在编译或运行时检查函数调用的正确性。通过匹配函数签名,可以确保传递给函数的参数类型与函数定义中的参数类型相匹配,并且可以检查函数的返回值类型是否与期望的类型相符。

在C++中,允许定义具有相同名称但参数类型或数量不同的多个函数。编译器可以通过函数签名来区分这些函数,以便在调用时选择正确的函数。

函数名修饰规则是一种命名约定或规则,用于在编译器中对函数名进行转换,以便区分具有相同名称但不同参数列表或不同作用域的函数。

函数名修饰规则通常在编译过程中使用,特别是在支持函数重载和命名空间的编程语言中。

函数名修饰通常涉及以下几个方面:

        1. 参数列表:函数名修饰规则会根据参数的类型、顺序和个数来创建唯一的函数名。这样可以确保具有不同参数的函数在编译后具有不同的名称。

        2. 命名空间:函数名修饰规则还会考虑函数所属的命名空间,以避免命名冲突。

        3. 作用域:如果同一作用域内存在具有相同名称但参数列表不同的函数,此时函数名修饰规则可以使用作用域的信息来区分它们。

函数名修饰规则的具体实现因编程语言而异。不同的编译器和语言可能采用不同的函数名修饰方案。例如,C++编译器使用一种称为"Name Mangling"的技术来修饰函数名,将其转换为唯一的符号名称,以便在链接时进行正确的函数匹配。可以说,函数名修饰规则就是根据函数签名来的。

函数重载的底层原理就与符号表、函数签名以及函数名修饰等息息相关。

函数签名是区分不同函数的关键因素之一。函数签名包括函数的名称、参数的类型和顺序,但不包括返回值类型(这就是为什么返回值不同不能发生重载)。在支持函数重载的编程语言中,可以定义具有相同名称但参数列表不同的多个函数。编译器根据函数签名来识别和区分这些函数,以确保在函数调用时能够选择正确的函数。
函数名修饰规则在编译器中用于生成唯一的函数标识符,以便区分具有相同名称但不同参数列表的函数。函数名修饰规则根据参数的类型、顺序和个数来创建唯一的函数名。这样可以确保具有不同参数的函数在编译后具有不同的名称,以避免函数名冲突。函数名修饰规则在函数重载的实现中起到关键作用,它确保了函数重载的正确性和可用性。
而符号表中会记录具有相同名称但不同参数列表的多个函数的信息。符号表中的条目包含函数的名称、修饰后的函数名、参数类型信息等。在编译或运行时,符号表用于匹配函数调用的函数签名和函数定义,以选择正确的函数进行调用。

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

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

相关文章

Java监听器与观察者模式

Java监听器与观察者模式 Java中的监听器(Listener)和观察者模式(Observer Pattern)都是用于处理对象间的事件通知和响应的设计模式。它们的目的是在对象之间建立一种松散的耦合,使得一个对象的状态变化可以通知到其他…

使用工具 NVM来管理不同版本的 Node.js启动vue项目

使用工具如 NVM(Node Version Manager)来管理不同版本的 Node.js。NVM 允许你在同一台计算机上安装和切换不同版本的 Node.js。以下是一些步骤,以便同时在你的系统中安装两个 Node.js 版本: 安装 NVM: 首先,你需要安装…

vue中element-ui日期选择组件el-date-picker 清空所选时间,会将model绑定的值设置为null 问题 及 限制起止日期范围

一、问题 在Vue中使用Element UI的日期选择组件 <el-date-picker>&#xff0c;当你清空所选时间时&#xff0c;组件会将绑定的 v-model 值设置为 null。这是日期选择器的预设行为&#xff0c;它将清空所选日期后将其视为 null。但有时后端不允许日期传空。 因此&#xff…

linux设置环境变量

linux设置环境变量 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; Linux设置环境变量&#xff1a;打造个性化开发环境 在Linux系统中&#xff0c;环境变量是一项…

Kubernetes 容器编排(1)

前言 知识扩展 早在 2015 年 5 月&#xff0c;Kubernetes 在 Google 上的搜索热度就已经超过了 Mesos 和 Docker Swarm&#xff0c;从那儿之后更是一路飙升&#xff0c;将对手甩开了十几条街,容器编排引擎领域的三足鼎立时代结束。 目前&#xff0c;AWS、Azure、Google、阿里云…

使用 PyTorch FSDP 微调 Llama 2 70B

引言 通过本文&#xff0c;你将了解如何使用 PyTorch FSDP 及相关最佳实践微调 Llama 2 70B。在此过程中&#xff0c;我们主要会用到 Hugging Face Transformers、Accelerate 和 TRL 库。我们还将展示如何在 SLURM 中使用 Accelerate。 完全分片数据并行 (Fully Sharded Data P…

深入学习 C++编程,数据结构与算法关系

数据结构是计算机科学中非常重要的概念之一。它是一种组织和存储数据的方式&#xff0c;能够有效地操作和管理数据&#xff0c;以便提高算法的效率。 以下是一些为什么要有数据结构的原因&#xff1a; (1) 数据组织&#xff1a;数据结构可以帮助我们组织和管理大量的数据。通过…

【elementui笔记:el-table表格的输入校验】

之前做得比较多的校验是在el-form表单里做的&#xff0c;但有时也遇到&#xff0c;需要在table内输入数据&#xff0c;然后校验输入的数据是否符合要求的情况。因此记录一下。 思路&#xff1a; 1.需要借助el-form的校验&#xff0c;el-table外层嵌套一层el-form&#xff0c;使…

什么是数据分析?

定义 一般我们想要学习某个东西&#xff0c;都是从定义开始的。那么什么是数据分析呢&#xff1f; 数据分析翻过来其实就可以当作它的定义了&#xff0c;即分析数据。 百科上面的解释也很类似&#xff0c;即分析数据、找规律&#xff0c;用以指导决策。 商业意义 那么数据…

世界5G大会

会议名称:世界 5G 大会 时间:2023 年 12 月 5 日-12 月 8 日 地点:河南郑州 一、会议简介 世界 5G 大会,是由国务院批准,国家发展改革委、科技部、工 信部与地方政府共同主办,未来移动通信论坛联合属地主管厅局联合 承办,邀请全球友好伙伴共同打造的全球首个 5G 领域…

CleanMyMac X2024值不值得下载?

macOS已经成为最受欢迎的桌面操作系统之一&#xff0c;它提供了直观、简洁的用户界面&#xff0c;使用户可以轻松使用和管理系统。macOS拥有丰富的应用程序生态系统&#xff1b;还可以与其他苹果产品和服务紧密协作&#xff0c;如iPhone、iPad&#xff0c;用户可以通过iCloud同…

# 和 $ 的区别②

上节博客说了使用 # 的时候,如果参数为 String ,会自动加上单引号 但是当参数为String 类型的时候,也有不需要加单引号的情况,这时候用 # 那就会出问题 比如根据 升序(asc) 或者 降序(desc) 查找的时候,加了单引号那就会报错 这个时候我们就只能使用 $ 如果看不懂代码,就去…

jmeter,同一线程组内,调用cookie实现接口关联

取cookie方式参考上一篇&#xff1a;jemeter&#xff0c;取“临时重定向的登录接口”响应头中的cookie-CSDN博客 元件结构 登录后要执行的接口为“api/get_event_list/”&#xff0c;在该HTTP请求下创建HTTP信息头管理器&#xff0c;配置如下&#xff1a; 执行测试后&#xff0…

mysql比较varchar值大小_Mysql varchar大小长度问题

1、限制规则 字段的限制在字段定义的时候有以下规则&#xff1a; a) 存储限制 varchar 字段是将实际内容单独存储在聚簇索引之外&#xff0c;内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节)&#xff0c;因此最大长度不能超过65535。 b) 编码长度限制 字符类…

Spark on Yarn 安装配置实验(3.1.1)

子任务二: Spark on Yarn 安装配置 本任务需要使用 root 用户完成相关配置, 已安装 Hadoop 及需要配置前置环境,具体要求如下: 1 、从宿主机 /opt 目录下将文件 spark-3.1.1-bin-hadoop3.2.tgz 复制到容器 Master 中的 /opt/software (若 路径不存在,则需新…

Docker网络模式:深度理解与容器网络配置

Docker 的网络模式是容器化应用中一个关键而复杂的方面。本文将深入讨论 Docker 的网络模式&#xff0c;包括基本概念、常用网络模式以及高级网络配置&#xff0c;并通过更为丰富和实际的示例代码&#xff0c;帮助读者全面掌握如何理解和配置容器网络。 Docker网络基础 1 Doc…

Android--Jetpack--Navigation详解

须知少日拏云志&#xff0c;曾许人间第一流 一&#xff0c;定义 Navigation 翻译成中文就是导航的意思。它是谷歌推出的Jetpack的一员&#xff0c;其目的主要就是来管理页面的切换和导航。 Activity 嵌套多个 Fragment 的 UI 架构模式已经非常普遍&#xff0c;但是对 Fragmen…

力扣63. 不同路径 II

动态规划 思路&#xff1a; 假设 dp[i][j] 是到达第 i 行、第 j 列的路径数量&#xff1b;因为只能向右或者向下移动&#xff0c;所以状态转移方程&#xff1a; 当v[i][j] 0时&#xff0c;dp[i][j] dp[i - 1][j] dp[i][j - 1]&#xff1b;当v[i][j] 1时&#xff0c;dp[i][…

C#调用zlib1.dll错误排查

C#编写64位程序&#xff0c;使用下列代码调用程序时出现 试图加载格式不正确的程序 报错&#xff0c;排查发现zlib1.dll文件为32位的&#xff0c;找了64位的替换一下就行了。&#xff08;PS&#xff1a;在我开发电脑上就没有任何问题&#xff0c;在部署电脑上就会报错&#xff…

Sql标准梳理

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库管理系统&#xff08;RDBMS&#xff09;的标准化语言。SQL标准由国际标准化组织&#xff08;ISO&#xff09;和美国国家标准化组织&#xff08;ANSI&#xff09;制定和维护&#xff0c;旨在提供…