<基于 C++ Primer P206>
1.定义重载函数
(1)对于重载的函数,应该在形参数量或形参类型上有所不同。
形参名是否相同,同一类型的不同别名,返回值类型是否相同不能用于区别重载函数。
(2)特别的,顶层 const 不影响传入函数的对象,一个拥有顶层 const 的形参无法和另一个没有顶层 const 的形参区别开来。但对于底层 const 形参,可哟通过区分其指向的是常量对象还是非常量对象实现函数重载。
(3)函数重载可以在一定程度上减轻我们为函数起名字的负担,但是应当只重载那些确实十分相似的操作。有时,为函数起不同的名字能使得程序更易理解。
(4)const_cast 和重载
const string &shortString(const string &s1, const string &s2)
{
return s1.size() <= s2.size() ? s1 : s2;
}
string &shortString(string &s1, string &s2)
{
auto &r = shortString(const_cast<const string&> (s1),
const_cast<const string&> (s2));
return const_cast<string&> (r);
}
2.调用重载函数
函数匹配也叫做重载确定,可能发生三种可能:
①找到最佳匹配;②无匹配,错误;③二义性调用,错误;
(1)确定候选函数和可行函数
①候选函数的特征:与被调函数同名,其声明在调用点可见。
②可行函数的特征:形参数量与调用函数提供实参数量相等,每个实参的类型与对应的形参类型相同,或可以类型转换。
③如果函数含有默认实参,则我们在调用该函数时传入的实参数量可能少于它实际使用的实参数量。
(2)寻找最佳匹配
实参类型与形参类型匹配的越接近,它们匹配的越好。
最佳匹配的特征:该函数每个实参的匹配都不劣于其他可行函数需要的匹配,至少有一个实参的匹配优于其他可行函数提供的匹配。
(3)实参类型转换
调用重载函数时应尽量避免强制类型转换。如果在实际应用中确实需要强制类型转换,则说明我们设计的形参集合不合理。
实参类型转换到形参类型的转换等级:
①精准匹配,包括:
实参类型和形参类型相同;
实参从数组或函数类型转换成对应的指针类型;
向实参添加顶层 const 或者从实参中删除顶层 const;
②通过 const 转换实现的匹配;
③通过类型提升实现的匹配;
④通过算术类型转换或指针转换实现的匹配。所有算术类型转换的级别都一样。
⑤通过类类型转换实现的匹配。
3.函数与作用域
(1)一般而言,将函数声明置于局部作用域内不是一个明智的选择。
(2)函数重载对作用域的一般性质并没有什么改变,如果我们在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体,在不同的作用域中无法重载函数名。
(3)在 C++ 中,名字查找发生在类型检查之前。