C++ 如果其中一个函数有引用,如何定义具有相同名称和参数的两个函数?

C++ 如果其中一个函数有引用,如何定义具有相同名称和参数的两个函数?,c++,reference,C++,Reference,我有密码: int SomeClass::sum(int x) { return x+=x; } int SomeClass::sum(int & x) { return x+=x; } 那不行。如何使用这两个函数,并在我使用它们时指出要使用哪一个?在C++中不能有这样的函数。它们必须以不同的名称命名,例如sumByCopy和sumByRef。您希望编译器如何决定在每一点上引用哪一个函数?在C++中不能有这样的函数。它们必须以不同的名称命名,例如sumByCopy和

我有密码:

int SomeClass::sum(int x)
{
    return x+=x;
}

int SomeClass::sum(int & x)
{
    return x+=x;
}


那不行。如何使用这两个函数,并在我使用它们时指出要使用哪一个?

C++
中不能有这样的函数。它们必须以不同的名称命名,例如
sumByCopy
sumByRef
。您希望编译器如何决定在每一点上引用哪一个函数?

C++
中不能有这样的函数。它们必须以不同的名称命名,例如
sumByCopy
sumByRef
。您希望编译器如何确定您在每一点上引用的是哪一个?

您可以提供两种不同的重载,分别取
int&
const int&
,这可能以某种方式满足您的需要

但是整个代码有点奇怪。。。在按值获取参数的函数中,您正在修改它(
+=
),此时只读取它可能有意义
返回x+x。在接受引用的重载中,修改参数并返回新值。这有点奇怪


除此之外,
sum
对于一个乘以2的函数来说是一个可怕的名字。

您可以提供两个不同的重载,分别取
int&
const int&
,这可能以某种方式满足您的需要

但是整个代码有点奇怪。。。在按值获取参数的函数中,您正在修改它(
+=
),此时只读取它可能有意义
返回x+x。在接受引用的重载中,修改参数并返回新值。这有点奇怪


除此之外,
sum
对于一个乘以2的函数来说是一个可怕的名字。

您可以通过这种方式重载,如果您不直接调用其中任何一个函数,它将编译为OK。但是,当您调用
sum(num)
时,它会导致歧义。因此,提供函数的这些重载是没有意义的,因为我们不能直接调用它们。这种重载是无用的,违反了良好的实践。

您可以用这种方式重载,如果您不直接调用任何重载,它将编译为OK。但是,当您调用
sum(num)
时,它会导致歧义。因此,提供函数的这些重载是没有意义的,因为我们不能直接调用它们。这种重载是无用的,违反了良好惯例。

您的设计有意义吗?在第一个重载中,函数没有任何副作用……如果使用常量sum(123)调用sum,编译器知道它不是引用。否则,你就是运气不佳。@David Rodríguez-dribeas:这只是个例子,你的设计有意义吗?在第一个重载中,函数没有任何副作用……如果使用常量sum(123)调用sum,编译器知道它不是引用。否则,你是幸运的。“戴维RoDr.Guez - Dr.Nexas:它只是例子,我们可以有这样的功能,但是我们不能直接调用它们因为模糊性,因此,以这种方式提供它们是没有意义的,但不是因为我们不能在C++中有这样的功能。”你甚至可以给他们打电话<代码>常数i=10;总额(i),或
inti=10;静态铸造(f)(i);静态铸造(f)(i)……当然我们可以有这样的函数,但是我们不能直接调用它们,因为它们是模糊的,因此,以这种方式提供它们是没有意义的,但不是因为我们不能在C++中有这样的功能。你甚至可以给他们打电话<代码>常数i=10;总额(i),或
inti=10;静态铸造(f)(i);静态铸造(f)(i)。。。
int num = 0;
int result = sum(num);