通过交换参数顺序进行功能重载

时间:2014-09-15 03:09:46

标签: c++ language-lawyer overloading

关于C ++中的函数重写,以下是合法的,因为两个原型都有不同数量的参数:

void func(int par1, double par2);
void func(int par1, double par2, double par3);

原样(因为至少有一个不同类型的参数):

void func(int par1, double par2);
void func(double par1, double par2);

我想知道,只是因为好奇,您是否可以使用相同数量的参数,相同类型但以不同的顺序重载?例如,以下是合法的:

void func(int par1, double par2);
void func(double par1, int par2);

如果有,是否有正式文件指明?

3 个答案:

答案 0 :(得分:9)

正式文件是ISO C ++标准,是的,你可以做到。

整个ISO C ++ 11第13章专门用于重载,但前几段很好地总结了它:

  

如果为同一作用域中的单个名称指定了两个或多个不同的声明,则该名称被称为重载。通过扩展,在同一作用域中声明相同名称的两个声明但不同类型的名称称为重载声明。只有函数和函数模板声明可以重载;变量和类型声明不能重载。

     

当在调用中使用重载函数名时,通过比较使用点处的参数类型和在重载声明中可见的参数类型来确定正在引用哪个重载函数声明。使用点。

如果参数列表不同,包括订单,则可以进行重载。在您提出的问题中,这三种情况都有所不同:

{int, double} vs {int, double, double}
{int, double} vs {double, double}
{int, double} vs {double, int}

请注意,对于这两个函数,不可能

void func(int par1, int par2);
void func(int par2, int par1);

因为它实际上只有 types 提供唯一性,而不是参数名称。这两个函数都称为func,它们都有参数列表{int, int},因此它们不是唯一的。

答案 1 :(得分:2)

允许使用相同数量的参数和相同类型但参数的顺序不同的重载函数:

void func(int a, double b) {
}

void func(double a, int b) {
}

当我们列出导出的符号时,我们得到了

000000000000025d T _Z4funcdi
000000000000024f T _Z4funcid

这意味着编译器在不同的地址上导出2个不同的函数。第一个是_Z4funcdi,d表示double,我的意思是int。

答案 2 :(得分:1)

  

你可以使用相同数量的参数,相同类型但以不同的顺序重载吗?

如果你考虑一下 - 没有理由不合法。编译器不关心函数参数代表什么,它不是那么聪明。从这个角度来看 - 两个定义都不同,因为它们采用不同的参数。

在这种特殊情况下你唯一需要注意的就是调用函数。例如,如果您的某个类同时定义了operator double operator int,那么如果您尝试执行以下操作, 抛出错误:< / p>

myClassWithBothCastOperators a, b;
func(a,b); //<-- ERROR!

即使在这种情况下,您仍然可以通过显式转换对象来调用该函数:

myClassWithBothCastOperators a, b;
func((int)a, (double)b); //All fine here!

然而 - 我不相信它是一个好的设计模式,并且决定一个propper版本对于阅读和使用你的代码的人来说会更清楚。作为一个真实的例子,请看一下PHP的implode。在C ++中你可以看看变量是什么类型,在PHP中变量几乎可以包含任何类型,而implode / explode分析/调试代码变成了噩梦正在使用名称不太有意义的变量。