C++ 函数可以重载,即多个具有相同名称但采用不同参数的函数可以共存。编译器经过名称查找、参数推导和重载解析的三步过程。最后,只有一个函数重载可以作为最佳匹配存在。可以从Stephan T. Lavavej 的 Core C++系列的前三个视频中获得对这些概念的温和介绍。
一个常见的情况是S
命名空间N
(可能是全局的)内的用户定义类在operator<<(ostream&, S const&)
同一命名空间内具有重载。
namespace N {
class S
{
// bla
};
std::ostream& operator<<(std::ostream& os, S& const& obj)
{
// print in terms of public interface of S
// (else, deckare this a friend function inside S)
return os;
}
} // N
int main()
{
std::cout << S(); // operator<<(ostream&, S const&) is the best match
}
名称查找是微妙的,在这种情况下,它通过所谓的参数依赖查找工作,它在与函数参数关联的命名空间中查找。对于上面的代码,这些命名空间是std
(所有标准库函数所在的位置)和N
(您的重载operator<<(ostream&, S const&)
所在的位置)。参数推导会推导出正确的类型,重载解析会发现你的重载是最好的匹配(在这种情况下,很可能是唯一的匹配)。
因此,能够使用“本机”语法打印用户定义的类型。
注意:在这种情况下,它不称为“左移”运算符,而是称为“流插入”运算符,即使后者具有与前者相同的词法形式。