函数重载
同一个作用域内,函数名相同,但parameter列表不同的称为重载(overloaded).
`main`不能重载
一个常见的错误是,两个函数只是返回类型不同。
前面提到,对于const的parameter:parameter有无顶层const,是无法区分的。
Record lookup(Phone);
Record lookup(Phone*); // 错误
Record lookup(Phone*);
Record lookup(Phone* const); // 错误
另一方面,因为指向const的引用
是低层的,所以这样的重载是可以的:
Record lookup(Account &);
Record lookup(const Account&);
对指向const的指针,也可以这样。
const_cast和重载
考虑之前的这个函数:
const string &shorter(const string &s1, const string &s2)
{
return s1.size() <= s2.size() ? s1 : s2;
}
这个函数的返回值必须是个指向const的引用
,有时我们可能期望返回的是个普通的引用。
string &shorter(string &s1, string &s2)
{
auto &r = shorter(const_cast<string&>(s1), const_cast<string&>(s2));
return const_cast<string&>(r);
}
重载和调用
如果有多个重载函数,在调用时有三种情况
- 找到一个最匹配的(best match)
- 无匹配的,报错
- 多个匹配的,但不能确定哪个最好,这时
ambiguous call
,报错