C++函数重载

2023-12-15 05:08:30

目录

函数重载的用法

函数重载的剖析


函数重载的用法

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

要点概括:

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

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

函数重载的剖析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

文章来源:https://blog.csdn.net/m0_73759312/article/details/135007432
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。