如何选择重载函数以适应C ++?

时间:2013-12-22 13:22:49

标签: c++ function parameters overloading optional-parameters

我需要一些帮助来理解编译器如何选择重载的C ++函数。

给定功能时:

type func(type1 x, type2 y);
type func(type3 x, type2 y);

编译器如何确定选择哪个函数?

我知道所选择的功能是根据其适用性而定,但是如果能够成功使用,你怎么知道选择了哪个功能。

例如:

鉴于这些函数重载函数:

char* average(int i, float f, double d);
double average(double d, float f, int i);
double fabs(double d);

鉴于这些变量:

int i1, i2, i3;
float f1, f2, f3;

这些函数调用的返回值是什么数据类型?为什么?

average(i1, i2, i3);
average(f1, f2, f3);
fabs(average(f1,f2,f3));

2 个答案:

答案 0 :(得分:1)

返回值取决于所进行的函数调用。例如,您的第一个函数调用将返回值double,因为调用了第二个平均函数。

函数重载仅基于参数进行,而与返回类型无关。您不能仅仅因为它们具有不同的返回类型而重载两个函数。函数应该通过参数而不同,以使函数重载起作用。

答案 1 :(得分:0)

为了编译函数调用,编译器必须首先执行名称查找,对于函数,可能涉及 argument-dependent lookup(ADL) 。 如果这些步骤产生多个候选函数,则执行重载分辨率以选择实际调用的函数。 通常,参数与参数最匹配的候选函数是被调用的候选函数。

与你的情况一样:

1 - > char* average(int i, float f, double d);

2 - > double average(double d, float f, int i);

在这两个函数中,你有完全不同的参数列表。第1次平均值为intfloatdouble,第2次为doublefloatint

因此,编译器根据其参数决定首先调用哪个方法。 如果使用参数(int, float, double)调用方法,则重载版本采用第一种方法,如果使用参数(double, float, int)调用方法,则重载版本采用第二种方法。

选择在编译时决定调用哪个重载方法(换句话说,方法的签名)。 因此,编译器已经知道要调用的方法的签名。

在重载方法时,我们必须牢记以下规则:

  • 重载方法必须更改参数列表
  • 重载方法可以更改返回类型。
  • 重载方法可以更改访问修饰符。
  • 方法可以在同一个类或子类中重载。