Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我们可以定义两个名称相同但参数不同的函数吗?_C++_Algorithm_Function_C++14 - Fatal编程技术网

C++ 我们可以定义两个名称相同但参数不同的函数吗?

C++ 我们可以定义两个名称相同但参数不同的函数吗?,c++,algorithm,function,c++14,C++,Algorithm,Function,C++14,当我们需要定义另一个函数时,我很困惑,我们可以给它一个不同的名称。但在LeetCode的讨论中,我发现了一个流行的帖子,其中有两个函数同名,但参数不同 int longestPalindromeSubseq(string s) { return longestPalindromeSubseq(0,s.size()-1,s); } int longestPalindromeSubseq(int l, int r, string &s) { if(l==r) return

当我们需要定义另一个函数时,我很困惑,我们可以给它一个不同的名称。但在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)); 
}
当我们需要定义另一个函数时,我很困惑,我们可以给它一个不同的名称

函数重载是C++最基本的特性之一:函数重载。在C语言中,根本不能有两个同名函数。在C++中,只要函数函数签名不同,即两个函数具有相同的名称,但不同的参数集,则完全是可能的。
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)); 
}

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

在您发布的示例中,由于传递的参数不同,签名会发生更改

以下是签名的含义:
关于参与重载解析(13.3)的函数的信息:其参数类型列表(8.3.5),如果函数是类成员,则函数本身和声明成员函数的类上的cv限定符(如果有)。

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

C++提供了这个特性



在某些情况下,存在歧义,编译器会告诉您。在C++中,你不能声明它们的返回类型只会有不同的功能。

因为你的历史是JavaScript,我也指出JavaScript通常是通过接受一个参数对象来存档的,而在JavaScript中,你需要把它们自己调度,在C++编译器中把它们调度到不同的函数。“r即使参数集相同,但类型不同“-不能有两个函数,唯一的区别是它们的类型。如果参数相同,则cv限定符或ref限定符必须不同。@TedLyngmo我同意这是令人困惑的。我想说的是拥有相同的一组参数名称,但是组合的参数类型对于每个函数都应该是唯一的。该评论可能会增加更多的混乱,因此被删除。事实上,重要的是参数类型,参数名称不重要。更让人困惑的是:我将“类型”解释为函数类型,而不是参数类型:-)如
double foo()
int foo()
这两种类型不起作用,但
double foo()&
int foo()&&&
将。@TEDLYNMO是的,确实您对函数类型的解释是正确的。