出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重载函数(overloaded function)。
Record lookup(const Account&); // find by Account Record lookup(const Phone&); // find by Phone Record lookup(const Name&); // find by Name
这三个函数的函数名相同,但却是三个不同的函数。编译器根据所传递的实参类型来判断调用哪个函数。
不能仅仅基于不同的返回类型而实现函数重载。
有些看起来不相同的形参表实质上是相同的:
// each pair declares the same function Record lookup(const Account &acct); Record lookup(const Account &); // parameter names are ignored typedef Phone Telno; Record lookup(const Phone&); Record lookup(const Telno&); // Telno and Phone are the same type Record lookup(const Phone&, const Name&); // default argument doesn’t change the number of parameters Record lookup(const Phone&, const Name& = “”); // const is irrelevent(无关紧要) for nonreference parameters Record lookup(Phone); Record lookup(const Phone); // redeclaration
最后一对函数,因为其形参非引用和指针,所以复制形参时并不考虑其是否是const,因为函数操纵的只是副本。所以这里的const关键字无关紧要,两个函数被视为重复声明。
不要过分使用重载,有时使用不同的函数名能提供更多的信息。
Screen& moveHome(); Screen& moveAbs(int, int); Screen& moveRel(int, int, char *direction);
这三个函数,显然要比下面三个重载函数更容易理解其功能。
Screen& move(); Screen& move(int, int); Screen& move(int, int, *direction);
下面是确定调用哪个重载函数的三个步骤。
void f(); void f(int); void f(int, int); void f(double, double = 3.14); f(5.6); // calls void f(double, double)
1. 确定候选函数。候选函数是与被调函数同名且在调用点上声明可见的函数。
2. 选择可行函数。可行函数需满足两个条件:(1)函数参数个数匹配;(2)实参类型与形参类型匹配(或者可隐式转换为形参类型)。示例中f(5.6),与之匹配的可行函数有f(int)和f(double, double = 3.14)。
3. 寻找最佳匹配。原则是实参类型与形参类型越接近则匹配越佳。因此f(5.6)与f(double, double = 3.14)匹配更佳。
如果函数调用使用了多个显示实参,则函数匹配过程会更复杂。如f(42, 2.56),可行函数为f(int, int)和f(double, double = 3.14)。对于实参42,f(int, int)是最佳匹配,对于实参2.56,f(double, double = 3.14)是最佳匹配。两个函数旗鼓相当,所以调用就有了二义性,编译器将产生错误。可以通过显示的强制类型转换强制函数匹配(在实际应用中,应尽量避免对实参做强制类型转换,这意味着重载函数设计的形参集合不合理)。
【学习资料】 《c++ primer》
来源:https://www.cnblogs.com/zhuyf87/archive/2013/02/05/2893250.html