函数重载

同一个作用域内,函数名相同,但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,报错