【问题标题】:Can we define two functions with same name but different parameters? [duplicate]我们可以定义两个同名但参数不同的函数吗? [复制]
【发布时间】:2020-12-23 10:17:30
【问题描述】:

当我们需要定义另一个函数时,我很困惑,我们可以给它一个不同的名字。但是在 LeetCode 的讨论中,我发现了一个流行的帖子,其中有两个函数名称相同,但参数不同。

int longestPalindromeSubseq(string s) {
    return longestPalindromeSubseq(0,s.size()-1,s); 
}
int longestPalindromeSubseq(int l, int r, string &s) {
    if(l==r) return 1;
    if(l>r) return 0;  //happens after "aa" 
    return s[l]==s[r] ? 2 + longestPalindromeSubseq(l+1,r-1, s) : 
        max(longestPalindromeSubseq(l+1,r, s),longestPalindromeSubseq(l,r-1, s)); 
}

【问题讨论】:

  • 因为你的历史是 javascript,我还要指出,在 javascript 中它通常通过接受单个参数对象来存档,而在 javascript 中你需要将它们分派为 self,在 c++ 编译器中将它们分派到不同的功能

标签: c++ algorithm function c++14


【解决方案1】:

当我们需要定义另一个函数时,我很困惑,我们可以给它一个不同的名字。

这是C++最基本的特性之一:函数重载。在 C 中,你根本不能有两个同名的函数。在 C++ 中,只要函数函数签名不同,即两个函数具有相同名称但参数集不同,这是完全可能的。

https://en.wikipedia.org/wiki/Function_overloading

【讨论】:

  • "甚至是相同的参数集但类型不同" - 你不能有两个函数,唯一的区别是它们的类型。如果参数相同,则 cv-qualification 或 ref-qualifiers 必须不同。
  • @TedLyngmo 我同意这令人困惑。我想说的是具有相同的参数名称集,但组合参数类型对于每个函数仍然应该是唯一的。该评论可能会增加更多混乱,因此已被删除。事实上,重要的是参数类型,而不是参数名称。
  • 为了增加混乱:我将“types”解释为函数类型而不是参数类型:-) 就像double foo()int foo() 这样不起作用但double foo() &int foo() && 会。
  • @TedLyngmo 是的,确实你对函数类型的解释是正确的。
【解决方案2】:

您所看到的在 C++ 中称为“函数重载”。 c++ 编译器根据函数的声明创建签名。同名的函数可以有完全不同的签名。

在你发布的示例中,签名因传递的参数不同而发生变化。

这是签名的含义: 有关参与重载决议 (13.3) 的函数的信息:它的参数类型列表 (8.3.5),如果函数是类成员,则函数本身的 cv 限定符(如果有)以及声明成员函数的类。

【讨论】:

    【解决方案3】:

    在强类型语言中,解析器(原则上)可以在函数声明时和函数调用时区分具有相同名称但参数列表(参数的数量和类型)不同的函数时间。这称为函数重载,也适用于类方法。

    C++ 提供了这个特性。


    在某些情况下,存在歧义,编译器会告诉您。在 C++ 中,您不能声明仅因返回类型不同而不同的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      相关资源
      最近更新 更多