c++ 重载函数

末鹿安然 提交于 2020-03-30 05:59:14

出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重载函数(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》

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!