我需要一些帮助来理解编译器如何选择重载的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));
答案 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次平均值为int
,float
,double
,第2次为double
,float
,int
。
因此,编译器根据其参数决定首先调用哪个方法。
如果使用参数(int, float, double)
调用方法,则重载版本采用第一种方法,如果使用参数(double, float, int)
调用方法,则重载版本采用第二种方法。
选择在编译时决定调用哪个重载方法(换句话说,方法的签名)。 因此,编译器已经知道要调用的方法的签名。
在重载方法时,我们必须牢记以下规则: