6.4 函数重载(overload)
如果同一作用域内的几个函数名字相同但是形参列表不同,称之为重载函数。
定义重载函数
对于重载的函数来说,它们应该在形参数量或形参类型上有所不同。
不允许两个函数除了返回类型外其他所有要素都相同。
判断两个形参的类型是否相异
有时候两个型形参列表看起来不一样,但实际上是相同的
Record lookup(const Account &acct);
Record lookup(const Account&);
重载和 const 形参
顶层 const 不影响传入函数的对象。一个拥有顶层 const 的形参无法和另一个没有顶层 const 的形参区分开来:
Record lookup(Phone);
Record lookup(const Phone); // 重复声明
如果形参是某种类型的引用或指针,则通过区分其指向的是常量对象还是非常量对象可以实现函数重载,此时的 const 是底层的:
// 对于接受引用或指针的函数来说,对象是常量还是非常量对应的形参不同
// 定义了 4 个独立的重载函数
Record lookup(Account&);
Record lookup(const Account&);
Record lookup(Account*);
Record lookup(const Account*);
最好只重载那些确实非常相似的操作。
const_cast 和重载
// 比较两个 string 对象的长度,返回较短的那个引用
const string &shorterString(const string &s1, const string &s2)
{
return s1.size() <= s2.size() ? s1 : s2;
}
// 重载非常量版本
string &shorterString(string &s1, string &s2)
{
auto &r = shoterString( const_cast<const string&>(s1), const_cast<const string&>(s2));
return const_cast<string&>(r);
}
调用重载的函数
函数匹配是指一个过程,在这个过程中我们把函数调用和一组重载函数中的某一个关联起来。函数匹配也叫做重载确定。
6.4.1 重载与作用域
名字查找发生在类型检查之前。
如果我们在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体。
在不同作用域中无法重载函数名。